위의 이미지처럼 Car
라는 객체로부터 인스턴스를 2개를 생성해서 Car
객체의 변수 wheelCount
를 사용하려고 한다.
먼저 이렇게 작성해보았다. taxi, suv라는 이름으로 각각 인스턴스를 생성했고, 각각 다른 값을 wheelCount
에 입력해보았다. 출력결과는 예상대로 출력이 되었다.
이번엔 좀 다르게 해보았다.
Car
객체의 wheelCount
변수를 static
으로 선언했다. 출력을 했더니 위와는 다른 결과가 출력되었다. 각각 다른 값을 대입했건만 출력해보니 서로 같은 값을 갖고 있었다. 왜 이런 일이 발생했을까?
CarExam
에서 사용한 wheelCount
변수는 서로 다른 인스턴스에서 사용했지만, 결국 같은 메모리 주소를 참조하는 변수를 사용했기 때문에 마지막에 값을 대입한 suv.wheelCount = 4;
가 최종적으로 메모리 주소를 변경하여 taxi.wheelCount
와 suv.wheelCount
모두 같은 값을 출력한 것이다.
위에서 bold를 적용한 문장 “같은 메모리 주소를 참조하는 변수“ 란 static 키워드로 선언한 변수를 의미한다.
System 객체의 내장메서드 identityHashCode()를 통해 확인해보면 다음과 같다.
taxi.price와 suv.price는 서로 다른 주소값을 참조하고 있음을 알 수 있다. 반면 taxi.wheelCount와 suv.wheelCount는 서로 같은 주소값을 참조하는걸 알 수 있다.