Java

[인프런] static 메서드

sejin2 2024. 5. 26. 20:25

정적 메서드는 객체 생성 없이 클래스에 있는 메서드를 바로 호출할 수 있다. 
하지만 정적 메서드는 언제나 사용할 수 있는 것은 아니다.

정적 메서드 사용법

  • static 메서드는 static 만 사용할 수 있다.
    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.
    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
  • 반대로 모든 곳에서 static을 호출 할 수 있다.
    • 정적 메서드는 공용 기능으로 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있다. 
public class DecoData {
    private int instanceValue;
    private static int staticValue;

    public static void staticCall() {
        // instanceValue++; // 인스턴스 변수 접근, compile error
        // instanceMethod(); // 인스턴스 메서드 접근, compile error;
        
        staticValue++; // 정적 변수 접근
        staticMethod();; // 정적 메서드 접근
    }
    
    public void instanceCall() {
        instanceValue++; // 인스턴스 변수 접근
        instanceMethod(); // 인스턴스 메서드 접근

        staticValue++; // 정적 변수 접근
        staticMethod();; // 정적 메서드 접근
    }

    private void instanceMethod() {
        System.out.println("instanceValue = " + instanceValue);
    }

    private static void staticMethod() {
        System.out.println("staticValue = " + staticValue);
    }
}

인스턴스 변수는 인스턴스를 생성해야만 접근이 가능하므로 접근할 수 없다. 
staticCall( ) 메서드는 정적 메서드로 static만 사용할 수 있다. 정적 변수, 정적 메서드에는 접근할 수 있지만 static이 없는 인스턴스 변수나 인스턴스 메서드에 접근하면 컴파일 오류가 발생한다.
instanceCall( ) 메서드는 인스턴스 메서드로 모든 곳에서 공용인 static을 호출할 수 있다. 따라서 정적 변수, 정적 메서드에 접근할 수 있으며 당연히 인스턴스 변수, 인스턴스 메서드에도 접근할 수 있다. 

public class DecoDataMain {
    public static void main(String[] args) {
        System.out.println("1.정적 호출");
        DecoData.staticCall();

        System.out.println("2. 인스턴스 호출1");
        DecoData data1 = new DecoData();
        data1.instanceCall();

        System.out.println("3. 인스턴스 호출2");
        DecoData data2 = new DecoData();
        data2.instanceCall();
    }
}

정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유

정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 인스턴스처럼 참조값의 개념이 없다. 
특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다. 
따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다. 

아래와 같이 객체의 참조값을 직접 매개변수로 전달하면 정적 메서드도 인스턴스의 변수나 메서드를 호출할 수 있다.

   public static void staticCall(DecoData data) { // 외부에서 참조값 넘기면 접근이 가능
        data.instanceValue++;
        data.instanceMethod();
    }

멤버 메서드의 종류

  • 인스턴스 메서드 : static이 붙지 않은 메서드
  • 클래스 메서드 : static이 붙은 멤버 메서드
    • 클래스 메서드, 정적 메서드, static 메서드 등으로 부른다.

static이 붙지 않은 메서드는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라서 인스턴스 메서드라고 한다. static이 붙은 메서드는 인스턴스와 무관하게 클래스에 바로 접근해서 사용할 수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 메서드라 한다. 

정적 메서드의 활용

정적 메서드는 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용한다. 
예를 들어 간단한 메서드 하나로 끝나는 유틸리티성 메서드에 자주 사용한다. 

static import 적용 

import static static2.DecoData.staticCall;

특정 클래스의 정적 메서드 하나만 적용하려면 위와 같이 생략할 메서드 명을 적어주면 된다. 

main( ) 메서드는 정적 메서드 

인스턴스 생성 없이 실행하는 가장 대표적인 메서드가 바로 main(  ) 메서드이다. 
정적 메서드는 정적 메서드만 호출할 수 있다. 따라서 정적 메서드인 main ( )이 호출하는 메서드에는 정적 메서드를 사용했다. 따라서 정적 메서드인 main(  )메서드가 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해서 사용했다. 

 

 

 

공부 내용: [인프런] 김영한의 실전 자바 - 기본편

'Java' 카테고리의 다른 글

[인프런] 상속  (0) 2024.05.27
[인프런] final 변수와 상수  (0) 2024.05.27
[인프런] static 변수  (0) 2024.05.26
[인프런] 스택과 큐 자료 구조  (0) 2024.05.25
[인프런] 자바 메모리 구조  (0) 2024.05.25