본문 바로가기

Dev.BackEnd/JAVA

[JAVA] 13. 열거형 Enum




Chapter 13. Enum 열거형

final로 지정한 상수가 이름이 중복되는 경우가 발생한다.
열거형이란,
자바의 열거형은 C언어의 열거형보다 더 향상된 것으로 열거형이 갖는 값뿐만 아니라 타입까지 관리한다.

JAVA에서 상수는 어떻게 정의하는가?
1. public static final 을 이용하여
1
2
3
public static final FRUIT_APPLE = 1;
public static final FRUIT_ORANGE = 2;
public static final COMPANY_APPLE = 3;
cs

2. interface를 이용한다.(public static final 을 생략할 수 있다.)
1
2
3
4
interface FRUIT {
    FRUIT.APPLE
    COMPANY.APPLE
}
cs
(FRUIT.APPLE == COMPANY.APPLE)
-> 비교 대상이 아닌데 (비교할 수 없는 상수의 그룹인데) 비교하는 오류가 발생할 수 있다.

3. 서로 비교조차 할 수 없게 컴파일러 선에서 인지할 수 있도록 코딩해야 한다.
(나중에 애플리케이션이 구동하는 과정에서 문제를 일으키기 때문이다.)

class Fruit
public static final Fruit APPLE = new Fruit();
public static final Fruit PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
(각각의 인스턴스를 넣는다, 데이터 타입은 같다)
class Company
(위에서의 APPLE과 데이터 타입이 달라지게 된다. -> 둘을 비교하게 되면 컴파일 자체를 거부한다.)
하지만 상수를 사용할 수 없게 된다.
어떤 문제점을 해결하다보니 목적에서 문제가 발생하게 된 것이다.
cf) switch 문을 사용할 때 조건으로는 몇 가지 제한된 데이터 타입만을 사용할 수 있다.(원시 자료형 데이터 타입)

Finally. enum을 사용한다.
(열거형 enumerated type) 서로 연관된 상수(바뀌지 않는 값)들의 집합
3번에서 class를 enum으로 바꿔준다.
1
2
3
4
5
6
enum Fruit{
     APPLE, PEACH, BANANA;
}
enum Company{
      GOOGLE, FACEBOOK, APPLE;
}
cs
APPLE, PEACH, GOOGLE 등을 레이블이라 부른다.(enum class = Fruit)

클래스이기 때문에 생성자를 갖을 수 있다.
APPLE, PEACH, BANANA를 생성할 때 마다 생성자가 호출된다.
Fruit( ){
     System.out.println("call contructor".this);
}
이 생성자를 통해서 상수가 되는 클래스가 어떠한 값을 갖을 수 있도록 한다.
즉 변수를 정의할 수 있다.
또한 메소드도 정의할 수 있다.

code>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
enum Fruit{
    APPLE("red"), PEACH("pink"), BANANA("yellow");
    String color;
    Fruit(String color){
        this.color = color;
    }
}
 
public class Main
{
    public static void main(String[] arg){
        for(Fruit f:Fruit.values()){
            System.out.println( f +"은" + f.color + "색 입니다.");
        }
    }
}
 
> APPLE은 red 색 입니다.
> PEACH는 pink 색 입니다.
> BANANA는 yellow 색 입니다.
cs


포스팅 내용은 생활코딩의 이고잉님의 강의자료를 기준으로 작성하였습니다. 문제가 될 시 삭제하겠습니다.

Chapter 13. The End