[Java] Enum 클래스
프리코스 3주차 미션 진행을 위해 enum 클래스 공부를 심화해서 해보았다.
Enum 이란?
- enum은 열거형(enumerated type)이라고 부른다.
- 열거형은 서로 연관된 상수들의 집합이라고 할 수 있다.
Enum 고찰하기
1. private 접근제한자가 기본으로 constructor에 설정되어 있다
enum Fruit{
APPLE,
PEACH,
BANANA;
}
// 위 enum 클래스와 사실상 동일한 클래스
class Fruit {
public static final Fruit APPLE = new Fruit():
public static final Fruit PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
// 클래스 Fruit를 인스턴스로 만들 수 없다 -> 다른 용도 사용 금지
private Fruit(){}
}
2. 하나의 클래스
로 필드, 메소드를 가질 수 있다
enum Fruit{
// 아래 코드는 Fruit의 상수를 선언하면서, 동시에 생성자를 호출
APPLE("red"),
PEACH("pink"),
BANANA("yellow");
public String color;
// enum은 사실 클래스. 그렇기 때문에 생성자를 가질 수 있다.
// But, public Fruit() -> 컴파일 에러. enum의 생성자가 접근 제어자 private만을 허용
Fruit(String color) {
System.out.println("Call Constructor " + this);
this.color = color;
}
// 열거형은 메소드를 가질수도 있다
String getColor() {
return this.color;
}
}
3. 상수 그룹 수 만큼 생성자를 호출한다
enum Fruit{
APPLE, PEACH, BANANA;
// public Fruit() -> (컴파일 에러)
Fruit(){
System.out.println("Call Constructor "+this);
}
}
Call Constructor APPLE
Call Constructor PEACH
Call Constructor BANANA
57 kcal
// Call Constructor가 출력된 것은 생성자 Fruit가 호출되었음을 의미한다.
// 이것이 3번 호출되었다는 것은 필드의 숫자만큼 호출되었다는 뜻이다.
// 단, 생성자가 접근 제어자 private만을 허용한다.
4. 서로 다른 상수 그룹에 대한 비교를 컴파일 시점에서 차단할 수 있다
enum Fruit{
APPLE, PEACH, BANANA;
}
enum Company{
GOOGLE, APPLE, ORACLE;
}
public class Example {
public static void main(String[] args) {
/*
(컴파일 에러)
if(Fruit.APPLE == Company.APPLE){
System.out.println("과일 애플과 회사 애플이 같다.");
}
*/
}
}
5. 맴버 전체를 열거 할 수 있는 기능도 제공한다
enum Fruit{
APPLE("red"),
PEACH("pink"),
BANANA("yellow");
private String color;
Fruit(String color){
this.color = color;
}
String getColor(){
return this.color;
}
}
public class ConstantDemo {
public static void main(String[] args) {
Fruit type = Fruit.APPLE;
switch(type){
case APPLE:
System.out.println(57+" kcal, " + Fruit.APPLE.getColor());
break;
case PEACH:
System.out.println(34+" kcal, " + Fruit.PEACH.color);
break;
case BANANA:
System.out.println(93+" kcal, " + Fruit.BANANA.color);
break;
}
// enum은 맴버 전체를 열거 할 수 있는 기능도 제공
for (Fruit f : Fruit.values()) {
System.out.println(f + ", " + f.getColor());
}
}
}
Enum 특징 정리
-
연관된 값들을 저장 : 서로 다른 상수그룹 비교를 컴파일 시점에서 차단
-
값들이 변하지 않도록 보장 : static final 필드와 사실상 동일
-
열거형 내부에 생성자, 필드, 메소드 가질 수 있음 : 열거형 자체가 클래스
TODO. 공부하면서 추가로 알게 된 내용들 문서에 추가하기
살아있는 문서 만들기!