❗️ 자바 실전에서 코드의 가독성과 안전성을 높여줄 수 있는 타입들을 익혀보자
✅ 정해진 값들의 집합
열거형 타입: 특정 타입이 몇 가지 한정된 값을 가지는 타입
요일
, 색상
, 계절
, 5단계 평가
같은 한정된 선택지가 있을 때 사용한다.Day today = Day.MONDAY;
today
에는 오직 Day
enum에 정의된 값(MONDAY, TUESDAY …
)만 들어올 수 있다.특징 | 설명 |
---|---|
타입 안전성 | 지정된 값만 허용, 잘못된 값은 컴파일 단계에서 잡음 |
클래스처럼 확장 가능 | 필드, 생성자, 메서드 추가 가능 |
값 반복 가능 | values() 로 모든 값 순회 가능 |
비교 간단 | == 연산자로 비교 가능 |
상수 관리 | 숫자나 문자열 상수보다 깔끔하고 유지보수 용이 |
public enum Color {
RED("빨강"), GREEN("초록"), BLUE("파랑");
private String koreanName;
private Color(String koreanName) {
this.koreanName = koreanName;
}
public String getKoreanName() {
return koreanName;
}
}
Color.RED
, Color.GREEN
, Color.BLUE
각각이 Color
타입의 객체이다.👉 즉, RED
도 GREEN
도 BLUE
도 Color
클래스의 인스턴스라고 보면 돼.
RED("빨강")
→ RED
라는 enum 상수 하나 만들고, "빨강"
이라는 값을 생성자에 전달private String koreanName;
→ "빨강"
을 저장할 변수private Color(String koreanName)
→ 생성자, koreanName
변수에 값 저장getKoreanName()
→ 저장된 값을 꺼내주는 메서드👉 즉, enum 상수 하나 하나가 자기만의 데이터를 가진 객체라고 생각하면 된다.
public enum Day {
SUNDAY("일요일"),
MONDAY("월요일"),
TUESDAY("화요일"),
WEDNESDAY("수요일"),
THURSDAY("목요일"),
FRIDAY("금요일"),
SATURDAY("토요일");
private String koreanName;
Day(String koreanName) {
this.koreanName = koreanName;
}
public String getKoreanName() {
return koreanName;
}
}
public class Main {
public static void main(String[] args) {
Day today = Day.MONDAY;
switch (today) {
case MONDAY:
System.out.println("오늘은 일주일 시작" + today.getKoreanName() + "!");
break;
case TUESDAY:
case WEDNESDAY:
case THURSDAY:
System.out.println("오늘은" + today.getKoreanName() + "!");
break;
case FRIDAY:
System.out.println("오늘은 주말전인 " + today.getKoreanName() + "!");
break;
case SATURDAY:
System.out.println("오늘은 주말인 " + today.getKoreanName() + "!");
break;
}
}
}
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// 각각 Enum 값 정의
// Ordinal, compareTo, values
Day monday = Day.MONDAY;
Day sunday = Day.SUNDAY;
Day thursday = Day.THURSDAY;
System.out.println("ordinal 값: " + monday.ordinal());
System.out.println("ordinal 값: " + sunday.ordinal());
System.out.println("ordinal 값: " + thursday.ordinal());
System.out.println("CompareTo: " + monday.compareTo(sunday));
System.out.println("CompareTo: " + monday.compareTo(thursday));
Day[] days = Day.values();
System.out.println("Days: " + Arrays.toString(days));
}
}
ordinal 값: 0
ordinal 값: 4
CompareTo: 1
CompareTo: -3
Days: [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]
public enum Gender {
FEMALE("Female", "여자"),
MALE("Male", "남자"),
UNKNOWN("Unknows", "미정");
private String englishTerm;
private String koreanTerm;
Gender(String englishTerm, String koreanTerm) {
this.englishTerm = englishTerm;
this.koreanTerm = koreanTerm;
}
public static Gender valueOfTerm(String str) {
for (Gender gender : Gender.values()) {
if(str.equals(gender.englishTerm) || str.equals(gender.koreanTerm)) {
return gender;
}
}
return Gender.UNKNOWN;
}
}