Scope와 Static

위의 이미지처럼 Car 라는 객체로부터 인스턴스를 2개를 생성해서 Car 객체의 변수 wheelCount를 사용하려고 한다.

먼저 이렇게 작성해보았다. taxi, suv라는 이름으로 각각 인스턴스를 생성했고, 각각 다른 값을 wheelCount에 입력해보았다. 출력결과는 예상대로 출력이 되었다.

이번엔 좀 다르게 해보았다.

Car 객체의 wheelCount 변수를 static으로 선언했다. 출력을 했더니 위와는 다른 결과가 출력되었다. 각각 다른 값을 대입했건만 출력해보니 서로 같은 값을 갖고 있었다. 왜 이런 일이 발생했을까?

CarExam에서 사용한 wheelCount 변수는 서로 다른 인스턴스에서 사용했지만, 결국 같은 메모리 주소를 참조하는 변수를 사용했기 때문에 마지막에 값을 대입한 suv.wheelCount = 4; 가 최종적으로 메모리 주소를 변경하여 taxi.wheelCountsuv.wheelCount 모두 같은 값을 출력한 것이다.

위에서 bold를 적용한 문장 “같은 메모리 주소를 참조하는 변수“ 란 static 키워드로 선언한 변수를 의미한다.

System 객체의 내장메서드 identityHashCode()를 통해 확인해보면 다음과 같다.

taxi.price와 suv.price는 서로 다른 주소값을 참조하고 있음을 알 수 있다. 반면 taxi.wheelCount와 suv.wheelCount는 서로 같은 주소값을 참조하는걸 알 수 있다.