private final static int APPLE = 1;
private final static int PEACH = 2;
private final static int BANANA = 3;
private final static int GOOGLE = 1;
private final static int APPLE = 2;
private final static int ORANGE = 3;
interface를 이용한 상수 정의
interface Fruit{
int APPLE = 1;
int PEACH = 2;
int BANANA = 3;
}
interface Company{
int GOOGLE = 1;
int APPLE = 2;
int ORANGE = 3;
}
다음과 같이 interface를 문법적 특징 ( interface의 맴버는 기본적으로 public static final )을 이용하여 상수를 구분하여 정리 할 수 있지만 이렇게 하게 되면
if(Fruit.APPLE == Company.APPLE){
someLogic();
}
위와 같은 경우에서 컴파일 에러가 발생하지 않는다. 문법적으로는 Fruit.APPLE과 Company.APPLE을 비교하는 것이 가능하기 때문이다. 하지만 논리적으로 생각해본다면 이러한 비교는 옳지 않다. 이러한 논리적인 에러는 런타임에 돌려봐야만 알 수 있기 때문이다.
클래스를 이용하여 상수 정의
class Company{
public static final Company APPLE = new Company();
public static final Company GOOGLE = new Company();
public static final Company ORACLE = new Company();
}
class Fruit{
public static final Fruit APPLE = new Fruit();
public static final Fruit PEACH = new Fruit();
public static final Fruit BANANA = new Fruit();
}
if(Fruit.APPLE == Company.APPLE){
someLogic();
}
위와같은 방법을 이용하면 논리적인 오류를 컴파일 타임에 확인 할 수 있게 된다!
하지만 이러한 방법은 switch문에서는 쓸 수가 없다....
기본적인 사용 방법
enum Fruit{
APPLE, PEACH, BANANA
}
Fruit type = Fruit.APPLE
switch(type){
case APPLE:
someLogic();
break;
case BANANA:
someLogic();
break;
case PEACH:
someLogic();
break;
}
enum이라는 것은 사실상 Class이다.
문법적 특징
enum Fruit{
APPLE("red"), PEACH("pink"), BANANA("yellow")
// 1. enum에서 생성자를 call 하는 방식
// 2. APPLE PEACH BANANA는 각각 다른 Instance
private int color;
public String getColor(){
return this.color;
}// 3. 클래스와 같이 메소드를 정의 할 수도 있다.
Fruit(int color){
// 4. 클래스와 같이 생성자를 가질 수 있다.
System.out.println("Call Constructor" + this);
this.color = color;
}
}
Class로 상수를 선언할 때와는 달리 .values()를 이용해 열거가 가능하다.
for(Fruit f : Fruit.values()){
someLogics();
}
- 연관된 값들(상수)들을 저장한다.
- 그 자체가 클래스이기 때문에 member, method등을 가질 수 있다.
- 열거 가능 ( enumeration )
https://www.youtube.com/watch?v=vFDsVdaZeao&list=PL_xKLSp5T58uRhl94cQcbEKdpuM8p-V5k&index=140