알고리즘 공부하다가 enum이라는 타입과 다시 만났다. 내가 작년 7월 5일에 학습했던 타입이다. 거의 1년 전에 한번 슥 보고 지나갔더니 잊어서 다시 공부한다. 1년간 크게 발전하지 못했음을 반성하며 학습에 들어간다.
열거 타입(enum):
한정된 값만을 갖는 타입이다. 예를 들어 보자.
아래 사진에서 열거타입(enum)인 Week는 한정된 7개의 값(MONDAY...SUNDAY)만을 가진다.
한정된 7개의 값(MONDAY...SUNDAY)은 '열거 상수'라고 한다.
한정된 열거 상수 중 하나의 상수를 저장하는 타입이 바로 enum 즉 열거타입이다.
▶ 이름짓기 관례
- 열거타입 이름은 관례적으로 첫 글자를 대문자로 (예시에서는 Week)
- 열거 상수는 관례적으로 모두 대문자로 작성 (MONDAY...SUNDAY)
- 열거 상수가 여러 단어로 구성된다면 _로 연결 (THIS_WAY 이런식으로)
enum 변수 만들기:
위와 같이 Week라는 열거타입을 선언해보았다.
그렇다면 이제는 타입이 Week인 변수를 만들 수 있다.
[열거타입 Week를 갖는 변수를 선언]
Week today;
Week reservationDay;
위 enum타입 변수에는 '열거 상수'를 저장할 수 있다. 아까 열거타입이란 한정된 값만 가지는 타입이라고 했다. 즉, 열거 타입 변수는 미리 선언된 값인 열거상수만 값으로 가질 수 있다.
[열거타입(enum) 변수는 열거상수를 값으로 가짐]
Week today = Week.SUNDAY;
Week birthday = null;
ㄴ참고로, 열거타입은 참조타입이므로 null이 될 수도 있다.
메모리구조와 함께 이해하기:
열거타입은 참조타입이다. 그리고 각각의 열거 상수는 각각의 객체로서 존재한다. 위의 Week 예시에서 MONDAY...SUNDAY라는 7개 열거 상수는 '힙 영역'에 7개의 Week객체로 생성된다. 그리고는 '메소드 영역'에 있는 7개의 각 '열거 상수'들이 힙 영역의 7개 Week객체를 각각 참조하게 되는 것이다.
Week today = Week.SUNDAY;를 이해해보자.
- Week이라는 열거타입의 변수 today를 선언하면 '스택 영역'에 변수 today가 생성된다.
- 메소드 영역에 있는 SUNDAY라는 열거상수는, 힙영역에있는 열거객체 Week를 참조한다.
- 변수 today가 Week.SUNDAY를 참조한다는 것은, 열거상수 SUNDAY가 참조하는 Week객체를 참조한다는 것이다.
즉, 열거상수가 같으면 참조하는 열거객체가 같다. 예를 들어서,
Week week1 = Week.SATURDAY;
Week week2 = Week.SATURDAY;
System.out.println(week1==week2); //true다.
열거상수가 Week.SATURDAY로 같으므로, 변수 week1과 week2가 참조하는 열거 객체가 같다는 말이다.
(다음 사진은 '혼자 공부하는 자바'책의 207페이지에서 가져온 도해다. 자발적인 책 홍보를 살짝 하겠다. 혼공자는 이런 도해가 깔끔해서 메모리 영역을 공부할 때 많은 도움이 되었다. 입문책으로 딱이다. 추천한다.)
열거타입의 활용 예시:
아까 만든 열거타입 Week는 MONDAY...SUNDAY의 7개의 열거 상수를 값으로 한다. 즉, Week타입은 7개의 요일 값을 가질 수 있다.
자바는 java.util.Calendar클래스를 지원하여 각종 날짜(년,월,일), 요일, 시간에 대한 정보를 얻을 수 있게 해준다.
이러한 Calendar 클래스를 통해 오늘의 요일을 얻고, Week타입 변수에다가 오늘 요일과 일치하는 열거상수를 부여해줄 수 있다.
Week열거타입 변수 today가 열거상수 MONDAY~SUNDAY 중 어떤 값을 참조하게 하는 다음 코드를 보면 이해될 것이다.
import java.util.Calendar;
import sec03.Week; //enum을 선언한 위치를 import
public class EnumWeekExample {
public static void main(String[] args) {
Week today = null;
Calendar cal = Calendar.getInstance();
int week = cal.get(Calendar.DAY_OF_WEEK); //일요일(1)~토요일(7)숫자를 리턴
switch(week) {
case 1:
today = Week.SUNDAY; break;
case 2:
today = Week.MONDAY: break;
.
.
.
case 7:
today = Week.SATURDAY; break;
}
System.out.println("오늘 요일: " + today);
}
}
'JAVA' 카테고리의 다른 글
JAVA 코테 | Scanner, println → BufferedReader/Writer | 시간초과로 입출력 변경 (0) | 2022.03.28 |
---|---|
실전 Java 소프트웨어 개발 | 입출금 내역 분석기 실습하기 (0) | 2022.03.26 |
클래스의 정렬(대소판정)기준 | comparable, compareTo, comparator, compare | 자연정렬(natural ordering) (0) | 2021.06.28 |
[Java] String.format() | 문자열 형식 지정하기 | %%%ds가 뭘까? | %% (0) | 2021.06.24 |
Spring 학습 1일차 - 자바 웹 개발 첫경험을 위해 (0) | 2021.02.07 |