강의에서 정적 메서드가 인스턴스의 기능을 사용할 수 없는 이유를 다음과 같이 설명했다.
'인스턴스의 기능을 사용하려면 참조값을 알아야한다.
하지만 정적 메서드는 참조값 없이 호출되기 때문에 인스턴스의 기능을 사용할 수 없다.'
음... 두 번째 줄이 어딘가 잘 이해가 가지 않았다.🤔
강의도 반복해서 듣고, 여기저기 검색해본 뒤 나름의 결론을 아래에 다시 정리해보았다.
🟡 일반적으로 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
'TIL > JAVA' 카테고리의 다른 글
[TIL] JAVA에서 0.1을 100번 더하면 왜 10이 아닐까? (JAVA) (0) | 2024.11.11 |
---|---|
[TIL] 최대공약수(GCD)와 최소공배수(LCM) 효율적으로 구하기 (JAVA) (0) | 2024.11.08 |
[TIL] 왜 2차원 배열은 '열(colum)'의 개수를 명시하지 않고도 초기화가 가능할까? (JAVA) (1) | 2024.11.08 |
[TIL] 다형적 참조(JAVA) (0) | 2024.10.31 |
[TIL] 인터페이스 - 다중 상속 (JAVA) (0) | 2024.10.30 |