본문 바로가기
컴퓨터공학 기초/기초개념+TIP

[JAVA] 클래스변수와 인스턴스 변수의 이해

by 상용최 2020. 3. 2.
반응형

우와 같은 Class가 있을때 인스턴스변수와 클래스 변수는 아래와같다.

인스턴스 변수 number
클래스변수 x

인스턴스변수와 클래스변수의 공통점으로는 선언위치가 클래스영역이다

그렇다면 차이점은 무엇일까? 바로 생성시기이다.

클래스변수는 클래스가 메모리에 올라갈 때 생성된다.

반면에 인스턴스변수는 인스턴스가 생성될 때 생성된다.

 

위의 예제를 확인하면 BasicClass.number는 인스턴스가 생성이 되지 않았기때문에 에러가 나지만

BasicClass.x는 클래스가 메모리에 올라갈 때 생성이 되기때문에 정상적으로 실행된다.

 

그렇다면 위의 코드의 실행결과를 예측해보자.

결과는 아래와 같다 

 

왜 이러한 결과가 발생되는지 아려면 static에 대한 이해가 필요하다.

위에서도 말했다시피 클래스변수(static, 공유변수)는 클래스가 메모리에 올라갈때 Method Area영역에 올라가고 이 영역은 공유를 하는 영역이다.

반면에 인스턴스변수는 new 키워드를 통해 생성될 때 Heap영역에 생성되게 된다.

이 영역은 각각의 영역을 가지게 된다.

 

 

결론을 말하자면 x는 어디서나 공유하는 Method Area영역에 있기때문에 모든 인스턴스가 바라보는곳이 같기때문에 모든 인스턴스의 값이 변하는것이고 number는 각각의 영역이 있는 Heap영역에 생성이 되기때문에 독자적인 값을 가질 수 있는것이다.

 

예제를 위하여 BasicClass1.x BasicClass2.x 이런식으로 표현하였지만 클래스 변수는 BasicClass.x와 같이 클래스이름.클래스변수로 사용하는것이 바람직한 사용방법이다.

 

Method Area, Heap영역에 대해 궁금하신분은 JVM 구조와 메모리구조를 클래스변수(static,공유변수)가 정확히 어떤식으로 동작하는지 궁금하신분은 static에 대해서 추가적으로 공부하시면 될것같습니다.

이 게시글은 비교글이기때문에 이정도로 마무리 짓겠습니다.

 

반응형

댓글