자바 1.5 배포판에는 enum 타입이라는 새로운 클래스와 annotation이라는 새로운 인터페이스가 추가되었다.
이 장에서는 새로운 타입들을 잘 사용할 수 있는 방법을 설명한다.
int 상수 대신 enum을 사용하자
int 상수에 비해 enum 타입은 훨씬 더 가독성이 좋고, 안전하며, 강력하다.
// int enum 패턴 - 너무 빈약하다!
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;
public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;
int enum 패턴의 단점
– 타입 안전을 보장하는 방법이나 편리하게 사용할 수 있는 방법을 제공하지 않는다. (예. 오렌지를 인자로 받는 메소드에 사과를 전달하고 오렌지와 사과를 == 연산자로 비교해도 컴파일 에러가 나지 않는다) – int enum 상수와 연관된 int 값이 변경되면 클라이언트 코드를 다시 컴파일 해야 한다. – int enum 상수를 출력 가능한 문자열로 쉽게 바꾸는 방법도 없다.
public enum Apple {FUJI, PIPPIN, GRANNY_SMITH}
public enum Orange {NAVEL, TEMPLE, BLOOD}
enum 타입의 장점
– 컴파일 시점의 타입 안전을 제공한다. – 각 enum 타입은 자신의 네임 스페이스를 갖기 때문에, 동일한 이름의 상수를 갖는 enum 타입의 공존이 가능하다. – enum 타입의 toString 메소드를 호출하면 enum을 출력 가능한 문자열로 변환할 수 있다. – 자기 나름의 메소드와 필드를 추가할 수 있고 인터페이스를 구현할 수 있다.
// 데이터와 메소드를 갖는 enum 타입
public enum Planet {
MERCURY(3.302e+23, 2.439e6),
VENUS (4.869e+24, 6.052e6),
EARTH (5.975e+24, 6.378e6),
MARS (6.419e+23, 3.393e6),
JUPITER(1.899e+27, 7.149e7),
SATURN (5.685e+26, 6.027e7),
URANUS (8.683e+25, 2.556e7),
NEPTUNE(1.024e+26, 2.477e7);
private final double mass; // In kilograms
private final double radius; // In meters
private final double surfaceGravity; // In m / s^2
// 만유인력 상수 m^3 / kg s^2
private static final double G = 6.67300E-11;
// Constructor
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
surfaceGravity = G * mass / (radius * radius);
}
public double mass() { return mass; }
public double radius() { return radius; }
public double surfaceGravity() { return surfaceGravity; }
public double surfaceWeight(double mass) {
return mass * surfaceGravity; // F = ma
}
}
// 특정 객체의 지구 무게를 명령행 인자(175)로 받아서 그 객체의 모든 8개 행성에서의 무게를 출력
public class WeightTable {
public static void main(String[] args) {
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}
---------- execute ----------
Weight on MERCURY is 66.133672
Weight on VENUS is 158.383926
Weight on EARTH is 175.000000
Weight on MARS is 66.430699
Weight on JUPITER is 442.693902
Weight on SATURN is 186.464970
Weight on URANUS is 158.349709
Weight on NEPTUNE is 198.846116
– Object 클래스의 모든 메소드를 양질로 구현한 메소드를 제공하며, Comparable과 Serializable 인터페이스를 구현하고 있다.
creative by java