Java

[JAVA] static 메서드에서 non-static 멤버에 접근

nkdev 2024. 12. 24. 18:56

static 메서드는 같은 클래스의 non-static 멤버에 접근할 수 없다. 그 이유는 뭘까?

non-static vs static

non-static 멤버는 인스턴스 변수이다. 객체가 생성될 때마다 각기 다른 값을 갖는다.
static 멤버는 클래스 변수이다. 클래스가 메모리에 로드될 때 단 한 번만 수행되고 모든 객체가 이 값을 공유한다.

왜 static 메서드에서 non-static 접근이 안 되는가

import java.io.*;

class Person{
    private String name;
    public Person(String name){
        this.name = name;
    }
    static String get(){
        return name; //static 함수는 non-static 필드를 참조할 수 없다.
    }
    public String print(){
        System.out.println(name);
    }
}
public class Main {
    public static void main(String[] args){
        Person p = new Person("Kim");
        p.print();
    }
}

다른 클래스 내의 메서드에 접근하기 위해서는 new 연산자로 그 클래스의 객체를 생성해야 한다.
객체가 생성되어야 클래스가 메모리(heap)에 할당되어 그 클래스 내의 멤버를 사용할 수 있기 때문이다.


그러나 예외로 static으로 선언된 멤버는 클래스 객체를 생성하지 않아도 사용 가능하다.
static 멤버는 프로그램 시작과 함께 메모리(data)에 할당되기 때문이다.

 

위의 코드를 보면 static 멤버 함수인 get()이 객체변수를 선언해야 접근이 가능한 non-static 멤버인 name을 사용하고 있다. get()은 static이기 때문에 클래스 객체를 생성하지 않은 채 바로 메서드를 사용할 수 있어야 하는데 , 아직 메모리에 할당되지도 않은 name을 참조하기 때문에 오류가 발생한다.

 

* 클래스 객체를 생성하지 않고 static 멤버함수에 직접 접근하는 방법 : 클래스 이름.클래스 변수

 

오류 해결 방법 :

get()을 non-static으로 만들거나 name을 static으로 만들어야 한다.