예를들어.
public final static int APPLE = 1;
public final static int PEACH = 2;
public final static int GOOGLE = 1;
public final static int APPLE = 2;
APPLE이 겹친다.
이름앞에 주석을 달아준다
FRUITE_APPLE
COMPANY_APPLE
interface FRUIT {
int APPLE = 1, PEACH = 2, BANANA = 3;
}
interface COMPANY {
int GOOGLE = 1, APPLE = 2, ORACLE = 3;
}
더 간결 해졌다.
왜?
앞에 public static final 이라는 것을 암시적으로 가지고 있다.
아깐 접두사를 붙여서 각각의 이름의 충돌성을 낮추려고했는데 지금은 인터페이스를 통해서 그것이 과일인지 기업인지 상수를 격리시켰기떄문에 이름이 충돌할 확률이 없다.
예를들어 FRUIT.APPLE == COMPANY.APPLE
하면,
상수가 똑같을 시에 실제로 true라고 나온다. 원래는 비교조차 안되는 건데 말이다.
그리고 컴파일 시에 문제도 없기 때문에 나중에 문제찾기가 굉장히 어렵다.
먼저 문제가 발생한 원인을 보자
이유는 int라는 같은 데이터타입을 사용하기때문에 비교가 가능하다
만약에 좌,우항이 서로 다른 데이터타입을 사용하면 비교가 불가능할것이다
그러면 데이터타입을 다르게해보자.
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 {
public static final Fruit GOOGLE = new Fruit();
public static final Fruit APPLE = new Fruit();
public static final Fruit ORACLE = new Fruit();
}
데이터타입이 다르기 때문에 아예 서로 비교할 수가 없다
주로 상수를 쓰면 switch 문과 같이 사용하는데 switch 문에 들어올수있는 데이터타입은 primitive 데이터 타입과 그것을 참조형으로 바꾼것과 지금 배울 enum 밖에 쓸 수 없다.
enum Fruit {
APPLE, PEACH, BANANA;
}
위에 있는 class Fruit 보다 이와 같이 간결하게 사용이 가능하다.
사진은 Fruit에 color라는 상태를 주었을 떄를 보여준다.
먼저 필드에 변수를 선언하고 그것을 생성자로 사진과 같이 사용하면 된다.
enum도 클래스이기 때문에 메소드도 사용이 가능하다.
color를 꺼낼 때 데이터를 보호하기 위해서
String을 리턴하는 getColor() 메소드를 만들어서 꺼내는 것도 바람직한 생각이다.
for(Fruit f : Fruit.values()){
print(f);
}