05-3 열거타입
* enumerate : 열거하다
열거 타입 = 전에 C++에서도 배웠던 enum / 열거형, 열거체 로도 불림
❗ 열거타입 이것만 기억하자 ❗
- 집합인 '열거 타입'와 그 안의 '열거 상수'로 구성됨
- 열거 타입을 자료형으로 갖는 변수를 선언할 수 있음
- 열거 타입의 변수에는 열거 상수만 들어갈 수 있음
- 장점 : 비슷한 것들끼리 묶어둠 & 가독성 좋아짐
cf. 특히 switch문에서 열거 상수를 사용하면 가독성 좋아짐
public class EnumTest {
public static void main(String[] args) {
Week today = Week.FRIDAY;
switch(today){
case MONDAY: System.out.println("월요일입니다."); break;
case TUESDAY: System.out.println("화요일입니다."); break;
case WEDNESDAY: System.out.println("수요일입니다."); break;
case THURSDAY: System.out.println("목요일입니다."); break;
case FRIDAY: System.out.println("금요일입니다. 만세!"); break;
}
}
}
▷ 열거타입 기본 지식
▶ 열거 타입 선언 방법
- 일반적으로 열거 타입은 별도의 java 파일을 만들어 선언함 : [New class] > [create an enum type]
- 열거 타입의 이름과 소스파일(.java)의 이름은 동일해야 함
- 열거 상수는 관례적으로 모두 대문자로 작성함
- 두 단어 이상의 합성어라면 _로 연결
public enum Week { MONDAY, TUESDAY, WEDNESDAY, FRIDAY, SATURDAY, SUNDAY }
▶ 열거타입 변수 선언 방법
- 클래스 타입 변수를 선언하듯이 `열거타입이름 변수명`으로 선언
- 열거 상수만 저장 가능
Week today;
today = Week.FRIDAY; // 클래스의 멤버 변수를 사용하는 것과 같은 문법
Q. 자바는 왜 enum을 따로 빼서 .java 파일을 만들어줘야하지?
main이 있는 파일에서 열거체를 선언하면 안되나? (C++처럼!)
A. 그렇게 할 수도 있지만, 열거체용 java 파일을 만들어서 사용하는게 '일반적'이기 때문에 따로 빼줌
▶ 이클립스에서 enum 만들기
[File] - [New] - [Enum]
▶ JVM 메모리 구조로 보는 열거 타입
복잡하므로 한줄한줄 곱씹으며 읽기!!
(복습) - 메소드 영역 : 메소드, 상수 등 클래스 정보 / 힙 : 객체 / 스택 : 변수
(복습) - 열거 타입 : Week / 열거 상수 : MONDAY / 열거 타입 변수 : today
- 열거 타입 선언
JVM이 열거 타입이 선언된 소스파일(class)을 읽으면,
메소드 영역에 열거 타입이 올라간다.
열거 타입은 참조타입이므로, 객체의 주소를 저장한다.
이 객체가 바로 힙 영역에 생성된 열거 상수이다.
=> 열거 타입은 메소드 영역에 올라가는데, 열거 타입이 참조하는 것은 힙 영역에 생성된 열거 상수 객체의 번지수
- 열거 타입 변수 사용
열거 타입 변수는 스택영역에 생성된다.
이때, 열거 타입 변수는 '= 열거타입.열거상수'를 이용해 초기화하므로, 열거 타입에서 참조하는 열거 상수의 주소가 저장된다.
- 적용
JVM이 Week.class 파일을 읽으면,
메소드 영역에 열거 타입에 대한 정보 (ex.상수 MONDAY, ... , SUNDAY) 가 올라가는데,
열거타입은 참조 타입이므로 값이 그대로 저장되는게 아닌
힙영역에 생성된 열거 상수 객체 MONDAY, ... , SUNDAY 의 주소를 참조하게 된다.
Week today; 로 열거타입 변수를 선언하면, 스택영역에 today가 생성된다.
today = Week.SUNDAY; 로 변수를 초기화를 하면, SUNDAY 객체의 참조를 today이에 저장하게 된다.
따라서 today == Week.SUNDAY; 가 모두 SUNDAY 객체의 주소가 되므로 true가 된다.
자바의 정석 같은 곳 보면 열거 타입 메소드 등 더 자세하게 나와있긴 한데 일단 이정도만 알아두자.
'JAVA > 혼공자' 카테고리의 다른 글
[혼공자] Chapter 06-4~6 메소드, 인스턴스 멤버, 패키지와 접근 제한자 (2) | 2022.07.30 |
---|---|
[혼공자] Chapter 06-1~3 객체 지향 프로그래밍, 생성자 (1) | 2022.07.27 |
[혼공자] Chapter 05-2 배열 (0) | 2022.07.23 |
[혼공자] Chapter 05-1 참조 타입과 변수 (1) | 2022.07.23 |
[혼공자] Chapter 04. 조건문과 반복 (0) | 2022.07.21 |