이번 시간에는 변수가 선언되는 위치에 따라 또는 static 이 붙어 나눠지는 클래스 변수, 인스턴스 변수, 지역변수에 대해 알아보고자 합니다.
클래스 변수는 클래스 영역 안에 생성되며 메모리가 올라갈 때 형성됩니다.
인스턴스 변수는 클래스 영역 안에 생성되며 인스턴스가 생성할 때 형성됩니다.
지역변수는 클래스 영역 바깥쪽에서 생성되며 변수 선언문이 수행될 때 생성됩니다.
아래의 코드를 보면서 각 변수들이 무엇이며 어떤 특징이 있는지 알아보도록 하겠습니다.
위 코드는 그랜저 IG를 만드는 설계도라고 하겠습니다. 실제로 그랜저를 사려고 카탈로그를 보면 엔진 사이즈별로 트림을 선택할 수 있습니다. 이와 마찬가지로 여기서도 트림별 2.4, 3.0, 3.3 그리고 휘발류, lpg, 하이브리드 차량을 선택할수 있습니다.
기본 생성자를 선택하게 되면 기본 모델인 2.4 엔진 6단자동변속기 휘발유 차량이 만들어지게 되며 매개변수가 있는 생성자를 선택하게 되면 각 엔진타입, 엔진크기등을 선택할수 있습니다.
우선 기본모델인 2.4 휘발류 그랜저 객체를 생성해보겠습니다.
위와 같이 엔진 종류 은 gasoline이며 미션은 auto_6이고 엔진 사이즈는 세타 2.4입니다.
그리고 제원의 경우 차 길이는 4930mm, 높이는 1470mm, 너비는 1865mm, 휠베이스는 2845mm입니다.
두 번째로 6기 통 3.0 그랜저를 만들어 보겠습니다.
매개변수를 통해 엔진 종류, 미션, 엔진 크기를 선택하겠습니다.
자 3.0 8단 자동미션을 장착한 그랜저 객체가 생성되었습니다. 그런데 int LENGH, HEIGHT, WIDTH, WHEELBASE는 제가 지정하지 않았는데 2.4 모델과 똑같은 걸 알 수 있습니다.
이 두 모델은 엔진 크기가 다르고 미션도 다르게 달렸습니다. 하지만 제원 즉 차 크기는 둘 다 똑같은걸 볼 수 있습니다. 실제로 그랜저를 만들 때 위 사진과 같이 뼈대에 엔진과 미션을 장착하게 됩니다. 어떤 다른 엔진 미션을 장착한다고 해도 위 뼈대는 공통적으로 사용됩니다. 이와 마찬가지로 각 객체가 생성될 때 각기 다른 옵션(엔진, 미션)을 가지더라도 공통으로 가져야 하는변수를 클래스 변수라고 합니다.
클래스 변수에는 static 이 붙게 됩니다.
자 이제 인스턴스 변수를 알아보겠습니다. 자동차 뼈대 말고 뼈대안에 들어가는 엔진과 미션은 구매자의 선택에 따라 2.4, 3.0, 3.3 이 들어가게 됩니다. 그리고 미션도 6단 8단 다르게 들어가는데요.
현재 4개의 그랜저 객체가 만들어졌습니다. 각 객체들은 소비자의 취향에 따라 엔진 크기, 가스, 가솔린, 하이브리드 등 다른 엔진과 미션이 들어갔습니다.
이와 같이 객체를 생성할 때마다 EngineType enginetype, Transmission transmission, EngineSize enginesize 이 변수들을 선언해주어야 합니다. 왜냐하면 고객이 원하는 엔진과 미션을 장착해야 하니깐요. 이렇게 객체 인스턴스가 생성될 때마다 선언되는 인스턴스 고유의 특성을 인스턴스 변수라고 합니다.
마지막으로 지역변수에 대해 알아보겠습니다.
위 코드의 메서드는 만들어진 그랜저 모델의 스펙을 확인할 수 있습니다.
여기서 String result 가 바로 지역변수입니다. 지역이란 local 이란 뜻으로 전역 또는 global의 반대 의미입니다. 문자 그대로 클래스 전역에 존재하지 않는 오직 메서드 안에서만 존재합니다. 그래서 매서드가 실행될때 선언되었다가 매서드가 종료되면서 사라지게 됩니다.
즉 매서드 밖에 영역에는 String result라는 변수는 존재하지 않습니다.
매서드 안에 String result 라는 변수가 존재하지만 이렇게 인스턴스 변수로 선언해도 아무런 에러가 뜨지 않습니다.
이번 글에서 클래스, 인스턴스, 지역변수에 대해 알아봤습니다. 이와 같이 변수가 선언될 때 과연 메모리에 어디 영역에서 선언되고 사라지는지를 안다면 이들의 개념을 좀 더 쉽게 이해할 수 있을 것입니다. 다음 글에서 자바의 메모리 구조에 대해 알아보겠습니다.
'자바' 카테고리의 다른 글
자바 클래스 초기화 블럭 (0) | 2019.11.01 |
---|---|
자바 변수의 초기화, 초기화 블럭 (0) | 2019.11.01 |
오버로딩과 오버라이딩의 차이 (0) | 2019.09.27 |
오버라이딩, overriding (0) | 2019.09.21 |
오버로딩, 오버라이딩 (0) | 2019.09.06 |