✅ 정적 메서드


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



📚 정적 메서드 사용법

  • static 메서드는 static만 사용할 수 있다.
    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 static이 붙은 정적 메서드나 정적 변수만 사용할 수 있다.
    • 클래스 내부의 기능을 사용할 때, 정적 메서드는 인스턴스 변수나, 인스턴스 메서드를 사용할 수 없다.
  • 모든 곳에서 static을 호출할 수 있다.
    • 정적 메서드는 공용 기능이다. 따라서 접근 제어자만 허락한다면 클래스를 통해 모든 곳에서 static을 호출할 수 있다.



✏️ DecoData

package static2;

public class DecoData {
  private int instanceValue;
  private static int staticValue;

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

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

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

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

  public void instanceCall() {
    instanceValue++;  // 인스턴스 변수 접근
    instanceMethod();  // 인스턴스 메서드 접근

    staticValue++;  // 정적 변수 접근
    staticMethod();  // 정적 메서드 접근
  }
}
  • instanceValue는 인스턴스 변수이다.
  • staticValue는 정적 변수(클래스 변수)이다.
  • instanceMethod()는 인스턴스 변수이다.
  • staticMethod()는 정적 메서드(클래스 메서드)이다.

staticCall() 메서드를 보자.
이 메서드는 정적 메서드이다. 따라서 static만 사용할 수 있다. 정적 변수, 정적 메서드에는 접근할 수 있지만, static이 없는 인스턴스 변수나 인스턴스 메서드에 접근하면 컴파일 오류가 발생한다.
코드를 보면 staticCall()staticMethod()static에서 static을 호출하는 것을 확인할 수 있다.

instanceCall() 메서드를 보자.
이 메서드는 인스턴스 메서드이다. 모든 곳에서 공용인 static을 호출할 수 있다. 따라서 정적 변수, 정적 메서드에 접근할 수 있다. 물론 인스턴스 변수, 인스턴스 메서드에도 접근할 수 있다.



✏️ DecoDataMain

package static2;

public class DecoDataMain {

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

    System.out.println("2. 인스턴스 호출");
    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();
}
profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글