TIL/JAVA

[TIL] static 메서드에서 인스턴스 기능을 사용할 수 없는 이유

Dream COM Ddulut 2024. 10. 29. 16:53

강의에서 정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유를 다음과 같이 설명했다.

'인스턴스의 기능을 사용하려면 참조값을 알아야한다.
하지만 정적 메서드는 참조값 없이 호출되기 때문에 인스턴스의 기능을 사용할 수 없다.'

 

음... 두 번째 줄이 어딘가 잘 이해가 가지 않았다.🤔

 

강의도 반복해서 듣고, 여기저기 검색해본 뒤 나름의 결론을 아래에 다시 정리해보았다.


🟡 일반적으로 static메서드에서는 인스턴스 메서드와 인스턴스 변수를 사용할 수 없다.

이유는 static 메서드와 인스턴스의 '생성 시점'이 다르기 때문이다.

  • static 메서드/변수
    JVM이 .class 파일을 메모리에 올릴 때 생성. 즉, 프로그램 실행 시 메서드 영역에 생성된다.

  • 인스턴스 메서드/변수
    `new` 연산자로 생성자를 호출했을 때 힙 영역에 생성된다.  

따라서 static 메서드가 존재하는 시점에 인스턴스가 존재하지 않을 수도 있다

인스턴스 메서드/변수는 참조값을 통해 호출되는데, 인스턴스가 생성되지 않으면 참조값 또한 존재하지 않으므로 호출할 수 없는 것이다.

public class InstanceAndStatic {
    private int instanceValue; //인스턴스 변수
    private static int staticValue; //static 변수

    /*static 메서드*/
    public static void staticCall(){ 
        staticValue++; //static 변수. 메모리에 항상 존재하기 때문에 접근 가능
        instanceValue++; /*인스턴스 변수. 인스턴스가 생성되지 않았기 때문에 
        	           참조값이 존재하지 않음. 접근 불가.*/
    }
}

 


🟡 static 메서드에 인스턴스 메서드/변수를 호출하는 방법

static메서드에서 인스턴스 기능을 아예 사용하지 못하는 것은 아니다.

인스턴스의 참조값만 알려줄 수 있다면 static 메서드에서도 인스턴스의 기능을 사용할 수 있다.

 

static메서드에 인스턴스의 참조값을 매개변수로 전달하면 된다.
+)인스턴스는 참조형이기 때문에, 참조값은 변수에 담긴다.

public static void staticCall(InstanceAndStatic address) {  //인스턴스의 참조값을 매개변수로 받기
    address.instanceValue++;
    address.instanceMethod(); 
}

 

오류 정정은 언제든지 환영입니다. 많이 알려주세요. 😊

 

 

 

참고:
https://gymdev.tistory.com/74