티스토리 뷰

Language/Java

이넘(Enum)

DUCKBAE's 2024. 10. 16. 16:01

enum 값을 비교할 때, == 연산자를 사용해서 비교해 본 적이 있다.

객체 비교 시 == 연산자는 객체의 내용이 아닌 동일한 메모리 주소를 가리키는지 비교하기 위해 사용한다.

enum을 선언하였을 때 어떻게 메모리에 할당되고 어떻게 접근하는지, 그리고 왜 == 연산자를 사용해도 되는지에 알아보려고 한다.


Enum

열거 타입한정된 상수 집합에 의해 정의되는 타입으로, 클래스이다.

열거 상수는 열거 타입에서 정의된 개별 값으로, 열거 타입의 인스턴스이다.

 

Enum 선언

public enum DrivingStatus {
	DRIVE, NEUTRAL, REVERSE, PARKING;
}

enum은 클래스처럼 정의한다.

열거 타입은 DrivingStatus 이며, 열거 상수로는 DRIVE, NEUTRAL, REVERSE, PARKING 이 된다.

 

Enum 의 메모리 할당

 

열거 상수들은 method 영역에 할당되면서 동시에 객체로써 heap 영역에도 할당된다.

(메서드 영역에 저장되는 클래스 데이터 중에 하나는 상수이다.)

 

method 영역

열거 상수가 method 영역에 할당될 때 각 상수는 암시적으로 public status final 필드를 생성한다.

이는 열거 상수가 클래스의 고유한 인스턴스로 존재하도록 보장하는 것이다.

 

heap 영역

열거 상수는 heap 영역에 단일 객체로 할당된다. 열거 상수에 대한 인스턴스로 프로그램이 실행되는 동안 단 한번만 생성된다.

 

메모리 접근 방식

DrivingStatus status = DrivingStatus.DRIVE;

 

method 영역에 있는 상수들은 heap 영역의 상수 객체들의 주소 값을 가지고 있다.

변수로 선언된 status 는 stack 영역에 할당되고, 상수가 갖고 있는 객체의 주소 값을 저장한다.

다시말해 변수는 heap 영역에 할당된 상수 객체의 주소를 갖고 있는 것이다.

이를 통해 알 수 있는 것은 method 영역에 할당된 상수와 stack 영역에 할당된 변수 둘 다 heap 영역에 할당된 상수 객체의 주소를 참조한다는 것이다.

 

이러한 구조 덕분에 열거 상수를 비교할 때 == 연산자 사용이 가능한 것이다.

DrivingStatus status1 = DrivingStatus.DRIVE;
DrivingStatus status2 = DrivingStatus.DRIVE;

System.out.println(status1 == status2); //true

status1 과 status2 모두 DrivingStatus.DRIVE 를 가리키기 때문에, == 연산자를 통해 비교하였을 때 true 가 반환된다.

풀어서 얘기해보자면, stack 영역에 할당된 변수 status1 과 status2가 method 영역에 할당된 상수 DRIVE 가 참조하는 heap 영역의 DRIVE 주소값을 저장한다. 이는 결국 두 변수 모두 heap 영역의 DRIVE 객체를 참조하고 있다는 것으로 비교 연산자 == 를 사용하였을 때 true 가 반환된다.

 


 

Enum이 메모리에서 어떤 구조로 할당되는지 정리한다.

1. (열거 타입 정의) 열거 상수를 정의한다.

2. (메모리 할당) 상수들은 method 영역에, 동시에 상수에 대한 객체가 heap 영역에 할당된다. 상수 객체는 단 한번만 생성되며 모든 참조가 동일한 객체를 가리킨다.

3. (변수의 참조) 열거타입을 참조하는 변수는 method 영역에 할당된 상수가 갖고 있는 heap 영역의 상수 객체 주소를 저장한다. 

4. (메모리 접근) 변수는 자신이 갖고 있는 주소 값을 통해 heap 영역의 상수 객체에 접근한다.

5. (객체 비교) 상수는 동일한 객체를 참조하며 == 연산자를 사용하여 객체의 동일성을 확인할 수 있다.


참고

- https://docs.oracle.com/javase/specs/jls/se23/jls23.pdf

 

 

'Language > Java' 카테고리의 다른 글

생성자와 오버로딩  (0) 2024.10.18
클래스  (0) 2024.10.17
배열에서 메모리 접근  (0) 2024.10.15
[Java] Collection Framework  (0) 2022.11.27
[Java] Exception  (0) 2022.11.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함