enum
enum은 열거형이라고 부른다.
열거형은 서로 연관된 상수들의 집합(연관된 상수들을 저장)이라고 할 수 있다. 또 그 값들이 변경되지 않도록 보장한다.
열거형 자체가 클래스이기 때문에 열거형 내부에 생성자, 필드, 메소드를 가질 수 있다.
아래 코드를 살펴보면 3행에서 class Fruit에서 만든 APPLE, PEACH, MELON을 enum을 통해 간결한 코드로 변경할 수 있다. 10행의 코드가 3행~7행의 코드와 동일한 것이다.
아래 코드를 살펴보자
18행을 보면 상수들이 생성될 때 마다 생성된 수만큼 생성자(Fruit)를 호출한다. 이 말은 즉, enum은 생성자를 가질 수 있다는 뜻이다. 현재 Fruit에 APPLE, PEACH, MELON 상수 3개를 생성해서 Call Constructor를 System.out.println으로 호출하면 3번이 콘솔창에 나타난다. 거기에 this를 추가하면 생성된 상수의 이름이 나온다.
주의할 점! enum의 생성자는 접근 제어자 private만 허용한다. public으로 코드를 작성하면 에러가 발생
Fruit(String color){
System.out.println("Call Constructor "+this);
}
위의 코드에 this.color = color; 코드를 추가한 뒤 15행 코드를 살펴보자
15행의 코드는 Fruit의 상수를 선언하면서 동시에 생성자를 호출하고 있는 코드이다.
각 과일의 색깔을 넣기 위해서 APPLE("red")와 같이 상수 뒤에 ("red")를 선언해주면 APPLE은 생성자(Fruit)를 호출하고 red는 Fruit(String color)에게 인자를 전달하여 APPLE이라는 상수에 저장되는 인스턴스 변수인 color의 값에 red가 저장된다.
Fruit(String color){
System.out.println("Call Constructor "+this);
this.color = color;
}
아래 코드는 19행에 getColor 라는 메소드를 추가하여 17행의 필드를 public에서 private로 접근제어자를 변경해주었다.
아래 코드는 37행을 살펴보자
enum은 멤버 전체를 열거할 수 있는 기능 values를 제공한다.
enum을 사용하는 이유는 1) 코드가 단순해진다 2) 인스턴스 생성과 상속을 방지한다 3) 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다
enum은 서로 다른 상수 그룹에 대한 비교를 컴파일 시점에서 차단할 수 있다.
즉, 아래의 코드가 에러가 발생하는 이유이다.
if(Fruit.APPLE == Company.APPLE) {
System.out.println("과일의 애플과 회사의 애플은 같다");
}
'TIL > Java' 카테고리의 다른 글
[Java] 복제와 참조 (0) | 2022.02.09 |
---|---|
[Java] replace (0) | 2022.02.07 |
[Java] Clone (0) | 2022.02.01 |
[Java] equals (0) | 2022.02.01 |
[Java] toString (0) | 2022.02.01 |