Computer Science

[객체지향프로그래밍] static 멤버 안에서 this 변수를 사용할 수 없는 이유

imsunbow 2024. 6. 13. 19:00

static 멤버 안에서 this 키워드를 사용할 수 없는 이유는 static 멤버가 클래스 수준에서 존재하기 때문이다. 좀 더 구체적으로 설명하면 다음과 같다.

 

  1. 클래스 수준에서 접근:
    • static 멤버(변수와 메서드)는 클래스 자체에 속하며, 특정 인스턴스에 속하지 않는다. 따라서 클래스가 로드될 때 메모리에 할당되며, 프로그램이 종료될 때까지 유지된다.
    • 반면, non-static 멤버는 특정 인스턴스에 속하며, 인스턴스가 생성될 때 메모리에 할당되고 인스턴스가 소멸될 때 메모리에서 해제된다.
  2. this 키워드의 의미:
    • this 키워드는 현재 인스턴스를 가리킨다. 이는 non-static 멤버 함수나 생성자 내에서 현재 객체를 참조할 때 사용된다.
    • static 메서드나 변수는 특정 인스턴스가 아닌 클래스 자체에 속하므로, static 메서드 내에서는 특정 인스턴스를 가리키는 this 키워드를 사용할 수 없다.
  3. 메모리 관점:
    • 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();
    }
}
 
 

위 예제에서 staticMethod 내에서는 this 키워드를 사용할 수 없다. 왜냐하면 this 키워드는 특정 인스턴스를 가리키기 때문에, 클래스 수준에서 호출되는 static 메서드 내에서는 존재하지 않기 때문이다. 반면 instanceMethod에서는 this 키워드를 사용할 수 있는데, 이 메서드는 특정 인스턴스에 속해 호출되기 때문이다.

 

따라서 static 멤버 안에서는 this 키워드를 사용할 수 없다. static 멤버는 클래스 자체에 속하며 인스턴스와 무관하게 동작하기 때문이다.

반응형