클래스변수와 인스턴스 변수 차이(생성시점)

백기선님 라이브 스터디의 피드백 영상을 보면서 미처 모르고 코딩했던 부분을 알게되어 정리하게 되었다. 그냥 라이브 스터디 2주차 포스팅에 업데이트 할 수 있었으나 꽤 중요한 부분이라는 생각이 들어서 따로 분리했다.

위의 스크린샷의 코드를 보면, static 메서드에서 인스턴스 변수를 참조하지 못하는 상황이다. 왜 그럴까?

static 메서드는 클래스 생성 시점에 메모리에 올라가지만, 인스턴스 변수는 인스턴스 생성 시점에 생기기 때문에, static 메서드 관점에서 아직 메모리에 올라오지 않은 인스턴스 변수를 참조할 수 없기 때문이다.

그럼 클래스가 생성되는 시점은 언제일까? 클래스가 생성되는 시점은 해당 클래스의 인스턴스를 호출하는 시점이다.

위의 스크린샷에서는 메서드가 하나밖에 없기 때문에 예제 코드를 다시 만들어보았다.

1
2
3
4
5
6
7
8
9
10
11
12
public class StudyHalle04 {
public static final int number1 = 1_000;
public int number2 = 2_000;

public int method01(){
return 10;
}

public static String method02(){
return "hello world";
}
}
1
2
3
4
5
public class StudyHalleTest {
public static void main(String[] args){
String greeting = StudyHalle04.method02();
}
}

StudyHalleTest 클래스에서 문자열 변수를 담을때 StudyHalle04 클래스의 method02()를 반환받아서 대입했다.

이때 메모리에 StudyHalle04 클래스가 올라가고 이 시점에 static 키워드가 붙은 클래스 변수가 메모리에 함께 올라가게 된다. 하지만 인스턴스 변수는 사용되지 않았기 때문에 이 시점엔 인스턴스 변수는 메모리에 올라가지 않는다.

외부 클래스에서 접근할때 클래스 변수는 접근이 가능하지만, 이렇게 인스턴스 변수는 접근이 불가능한 이유다.

인스턴스 변수를 사용하기 위해서는 위처럼 인스턴스를 생성해야한다. 그래서 static 키워드가 없는 필드를 인스턴스 변수, static 키워드가 붙는 필드를 클래스 변수라고 하는것 같다.ㅋ

결론

결론은 클래스 변수와 인스턴스 변수의 생성시점이 다르기 때문에 메모리에 먼저 올라간 static 메서드가 아직 올라가지 않은 인스턴스변수를 참조하지 못한다는 것이다.

반대로 일반 메서드에서 클래스 변수를 참조할 수 있는 이유는 일반 메서드의 경우 인스턴스가 생성되는 시점에 호출되는데, 이 땐 이미 클래스가 메모리에 올라간 뒤기 때문에 클래스변수를 참조할 수 있다.