Java, static 메소드 사용하기2

정적(static) 메소드는 객체 생성 없이 클래스에 메소드를 바로 호출하는 장점이 있다. 하지만 정적 메소드는 주의할 점이 몇가지 있다.


정적 메소드 사용법

  • static 메소드는 static 변수만 함께 사용할 수 있다.
    • 클래스 내부의 기능 사용 시, 정적 메소드는 static 키워드가 붙은 정적 메소드와 정적 변수만 사용할 수 있다.
    • 클래스 내부의 기능 사용 시, 정적 메소드는 인스턴스 변수, 메소드를 사용할 수 있다.
  • 모든 곳에서 static 메소드와 static 변수를 호출할 수 있다.
    • 정적 메소드는 공용 기능으로 접근 제어자가 막지 않는다면 클래스를 호출한다.

static 와 instance

예제 코드를 살펴보도록 한다.

StaticData.java

package method1;

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

    public static void staticCall() {
        // instanceValue++; // 인스턴스 변수 접근, 컴파일 에러 발생
        // instanceMethod(); // 인스턴스 메소드 접근, 컴파일 에러 발생

        staticValue++; // 정적 변수 접근, StaticData.staticValue++;
        staticMethod();  // 정적 메소드 접근, StaticData.staticMethod();
    }

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

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

staticCall() 정적 메소드를 살펴보면 instanceValue, instanceMethod() 를 호출할 수 없는 것을 볼 수 있다. 왜냐하면 자신의 정적 클래스 참조 값은 알고 있지만, 생성된 인스턴스는 생성 개수도 모를 뿐더러 어떤 참조 값을 사용할지 모르기 때문이다.

StaticData.java 메소드 instanceCall() 추가

static이 없는 instanceCall() 메소드를 추가해보도록 한다.

    public void instanceCall() {
        instanceValue++; // 인스턴스 변수 접근
        instanceMethod(); // 인스턴스 메소드 접근
        
        staticValue++; // 정적 변수 접근, StaticData.staticValue++;
        staticMethod(); // 정적 메소드 접근, StaticData.staticMethod();
    }

static 이 없는 instanceCall() 메소드는 instanceValue, instanceMethod() 인스턴스들을 사용할 수 있는 모습을 볼 수 있다. 이러한 이유는 호출 코드에서 instanceCall 객체를 생성하고 메소드 내부에서 instanceValue, instaceMethod() 각 인스턴스는 자신의 메모리 공간(힙 영역)을 할당 받아 사용하기 때문이다.

StaticData.java 코드 정리

  • instanceValue: 인스턴스 변수
  • staticValue: 정적 변수
  • instanceMthod(): 인스턴스 메소드
  • staticMethod(): 정적 메소드

staticCall()

  • 정적 메소드와 정적 변수 접근가능
  • static 키워드가 없는 메소드와 변수 접근 시 컴파일 오류 발생
    • 인스턴스와 클래스는 생명주기가 다르고, 정적 메소드 입장에서는 인스턴스의 참조 값을 모른다.

instanceCall()

  • 정적 메소드와 정적 변수 접근 가능
  • static 키워드가 없는 메소드와 변수 접근 가능

Main.java

package method1;

public class Main {
    public static void main(String[] args) {
        System.out.println("1. 정적");
        StaticData.staticCall();

        System.out.println("2. 인스턴스1");
        StaticData data1 = new StaticData(); // 객체 생성
        data1.instanceCall();

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

호출 결과

1. 정적
staticValue = 1
2. 인스턴스1
instanceValue = 1
staticValue = 2
3. 인스턴스2
instanceValue = 1
staticValue = 3

정적 메소드에서 인스턴스 메소드와 변수를 사용하려면?

정적 메소드에서 인스턴스 메소드와 인스턴스 변수를 사용하려면 파라미터로 객체참조 값을 받아와 사용하는 방법이 있다.

StaticData.java

    public static void staticCall(StaticData object) {
        object.instanceValue++;
        object.instanceMethod();
    }