static 멤버 안에서 this 키워드를 사용할 수 없는 이유는 static 멤버가 클래스 수준에서 존재하기 때문이다. 좀 더 구체적으로 설명하면 다음과 같다.
- 클래스 수준에서 접근:
- static 멤버(변수와 메서드)는 클래스 자체에 속하며, 특정 인스턴스에 속하지 않는다. 따라서 클래스가 로드될 때 메모리에 할당되며, 프로그램이 종료될 때까지 유지된다.
- 반면, non-static 멤버는 특정 인스턴스에 속하며, 인스턴스가 생성될 때 메모리에 할당되고 인스턴스가 소멸될 때 메모리에서 해제된다.
- this 키워드의 의미:
- this 키워드는 현재 인스턴스를 가리킨다. 이는 non-static 멤버 함수나 생성자 내에서 현재 객체를 참조할 때 사용된다.
- static 메서드나 변수는 특정 인스턴스가 아닌 클래스 자체에 속하므로, static 메서드 내에서는 특정 인스턴스를 가리키는 this 키워드를 사용할 수 없다.
- 메모리 관점:
- static 멤버는 클래스가 처음 로드될 때 메모리에 할당되며, 클래스 전체에서 공유된다.
- this 키워드는 특정 객체의 메모리 주소를 가리키며, 이는 인스턴스가 생성된 후에만 존재한다.
- static 메서드는 인스턴스의 생성 여부와 상관없이 호출될 수 있기 때문에, 호출 시점에 this가 가리킬 객체가 존재하지 않을 수 있다.
[예제]
public class Example {
// static 변수
public static int staticVariable = 0;
// non-static 변수
public int instanceVariable = 0;
// static 메서드
public static void staticMethod() {
// static 변수에 접근 가능
staticVariable = 5;
// instanceVariable에 접근 불가 (컴파일 에러 발생)
// instanceVariable = 10; // 오류
// this 키워드 사용 불가 (컴파일 에러 발생)
// this.instanceVariable = 10; // 오류
}
// non-static 메서드
public void instanceMethod() {
// static 변수에 접근 가능
staticVariable = 5;
// instanceVariable에 접근 가능
instanceVariable = 10;
// this 키워드 사용 가능
this.instanceVariable = 15;
}
public static void main(String[] args) {
// static 메서드 호출
Example.staticMethod();
// 인스턴스 생성 후 non-static 메서드 호출
Example obj = new Example();
obj.instanceMethod();
}
}
// static 변수
public static int staticVariable = 0;
// non-static 변수
public int instanceVariable = 0;
// static 메서드
public static void staticMethod() {
// static 변수에 접근 가능
staticVariable = 5;
// instanceVariable에 접근 불가 (컴파일 에러 발생)
// instanceVariable = 10; // 오류
// this 키워드 사용 불가 (컴파일 에러 발생)
// this.instanceVariable = 10; // 오류
}
// non-static 메서드
public void instanceMethod() {
// static 변수에 접근 가능
staticVariable = 5;
// instanceVariable에 접근 가능
instanceVariable = 10;
// this 키워드 사용 가능
this.instanceVariable = 15;
}
public static void main(String[] args) {
// static 메서드 호출
Example.staticMethod();
// 인스턴스 생성 후 non-static 메서드 호출
Example obj = new Example();
obj.instanceMethod();
}
}
위 예제에서 staticMethod 내에서는 this 키워드를 사용할 수 없다. 왜냐하면 this 키워드는 특정 인스턴스를 가리키기 때문에, 클래스 수준에서 호출되는 static 메서드 내에서는 존재하지 않기 때문이다. 반면 instanceMethod에서는 this 키워드를 사용할 수 있는데, 이 메서드는 특정 인스턴스에 속해 호출되기 때문이다.
따라서 static 멤버 안에서는 this 키워드를 사용할 수 없다. static 멤버는 클래스 자체에 속하며 인스턴스와 무관하게 동작하기 때문이다.
반응형
'Computer Science' 카테고리의 다른 글
[객체지향프로그래밍] java의 Getter, setter에 대하여 (0) | 2024.06.14 |
---|---|
[객체지향프로그래밍] static 변수에 대하여(non-static 변수와 어떻게 다를까?) (0) | 2024.06.12 |
[객체지향프로그래밍] JAVA의 garvage collection 개념 (0) | 2024.06.05 |
[객체지향프로그래밍] 절차적 언어 vs 객체지향 언어의 특징 (0) | 2024.06.05 |
[자료구조] Text pattern matching- Naive Approach 방법, 코드 구현 (0) | 2024.06.04 |