Enum ?
int Enum Pattern์ ๋จ์
ํ์ ์์ ์ ๋ณด์ฅํ ๋ฐฉ๋ฒ์ด ์๋ค.
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;
์์ ๊ฐ์ ์์ ์์๋ ์ฌ๊ณผ์ฉ ์์ ์ด๋ฆ์ ๋ชจ๋ APPLE_
๋ก ์์,
์ค๋ ์ง์ฉ ์์๋ ORANGE_
๋ก ์์ํ๋ค.
์ด๋ ํํ๋ ฅ์ด ์ข์ง ์๋ค.
์๋ฐ๊ฐ ์ ์ ์ด๊ฑฐ ํจํด์ ์ํ ๋ณ๋ ์ด๋ฆ ๊ณต๊ฐ์ ์ง์ํ์ง ์๋๋ค.
ํ๋ก๊ทธ๋จ์ด ๊นจ์ง๊ธฐ ์ฝ๋ค.
ํ๋ฒํ ์์๋ฅผ ๋์ดํ ๊ฒ๋ฟ์ด๋ผ ์ปดํ์ผํ๋ฉด ๊ทธ ๊ฐ์ด ํด๋ผ์ด์ธํธ ํ์ผ์ ๊ทธ๋๋ก ์๊ฒจ์ง๋ค.
์์์ ๊ฐ์ด ๋ฐ๋๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ฐ๋์ ๋ค์ ์ปดํ์ผํด์ผ ํ๋ค.
๋ฌธ์์ด๋ก ์ถ๋ ฅํ๊ธฐ ๊น๋ค๋กญ๋ค.
๊ฐ์ ์ถ๋ ฅํ๊ฑฐ๋ ๋๋ฒ๊ฑฐ๋ก ์ดํด๋ณด๋ฉด ๋จ์ง ์ซ์๋ก๋ง ๋ณด์ฌ์ ์ฉ ๋์์ด ๋์ง ์๋๋ค.
๊ฐ์ ์ ์ ์ด๊ฑฐ ๊ทธ๋ฃน์ ์ํ ๋ชจ๋ ์์๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ๋ ๋ง๋
ํ์ง ์๋ค.
๋ ์ด ์์ ์์๊ฐ ๋ช ๊ฐ์ธ์ง๋ ์ ์ ์๋ค.
์ ์ ๋์ ๋ฌธ์์ด ์์๋ฅผ ์ฌ์ฉํ๋ ๋ณํ ํจํด์?
๋ ๋์๋ค.
์์์ ์๋ฏธ๋ฅผ ์ถ๋ ฅํ ์ ์๋ค๋ ์ ์ ์ข์ง๋ง,
๋ฌธ์์ด ์์๋ฆ ์ด๋ฆ ๋์ ๋ฌธ์์ด ๊ฐ์ ๊ทธ๋๋ก ํ๋์ฝ๋ฉํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌธ์์ด์ ์คํ๊ฐ ์์ด๋ ์ปดํ์ผ๋ฌ๋ ํ์ธํ ๊ธธ์ด ์์ผ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ฐํ์ ๋ฒ๊ทธ๊ฐ ์๊ธด๋ค.
๋ ๋ฌธ์์ด ๋น๊ต๋ ๋น๊ต์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํจ๋ค.
์ด๊ฑฐ ํ์ (Enum)
public enum Apple {FUJI, PIPPIN, GRANNY_SMITH}
public enum Orange {NAVEL, TEMPLE, BLOOD}
C, C++ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด์ ์ด๊ฑฐ ํ์ ๊ณผ ๋ค๋ฅธ ์ ์ ์๋ฐ์ ์ด๊ฑฐ ํ์ ์ ์์ ํ ํํ์ ํด๋์ค๋ค.
์ด๊ฑฐ ํ์
์์ฒด๋ ํด๋์ค๋ฉฐ, ์์ ํ๋๋น ์์ ์ ์ธ์คํด์ค๋ฅผ ํ๋์ฉ ๋ง๋ค์ด
public static final
ํ๋๋ก ๊ณต๊ฐํ๋ค.
์ด๊ฑฐ ํ์
์ ๋ฐ์์ ์ ๊ทผํ ์ ์๋ ์์ฑ์๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ์ฌ์ค์ final์ด๋ค.
๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ๊ฑฐ๋ ํ์ฅํ ์ ์์ผ๋ ์ด๊ฑฐ ํ์
์ ์ธ์ผ๋ก
๋ง๋ค์ด์ง ์ธ์คํด์ค๋ค์ ๋ฑ ํ๋์ฉ๋ง ์กด์ฌํจ์ด ๋ณด์ฅ๋๋ค.
์ฆ ์ด๊ฑฐ ํ์
์ ์ธ์คํด์ค ํต์ ๋๋ค.
์ฑ๊ธํด์ ์์๊ฐ ํ๋๋ฟ์ธ ์ด๊ฑฐํ์
์ด๋ผ ํ ์ ์๊ณ ,
์ด๊ฑฐ ํ์
์ ์ฑ๊ธํด์ ์ผ๋ฐํํ ํํ๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ปดํ์ผํ์ ํ์ ์์ ์ฑ ์ ๊ณต
public enum Apple {FUJI, PIPPIN, GRANNY_SMITH}
public enum Orange {NAVEL, TEMPLE, BLOOD}
์ ์ฝ๋์์ Apple์ ์ด๊ฑฐ ํ์
์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ค๋ฉด,
๊ฑด๋ค๋ฐ์ ์ฐธ์กฐ๋ Apple์ ์ธ ๊ฐ์ง ๊ฐ ์ค ํ๋์์ด ํ์คํ๋ค.
๋ค๋ฅธ ํ์
์ ๊ฐ์ ๋๊ธฐ๋ ค ํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋๋ค.
ํ์
์ด ๋ค๋ฅธ ์ด๊ฑฐ ํ์
๋ณ์์ ํ ๋นํ๋ ค ํ๊ฑฐ๋
๋ค๋ฅธ ์ด๊ฑฐ ํ์
์ ๊ฐ ๋ผ๋ฆฌ ==
์ฐ์ฐ์๋ก ๋น๊ตํ๋ ค๋ ๊ผด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์์ ์ด๋ฆ ๊ณต๊ฐ์ด ์กด์ฌํ๋ค.
๋๋ฌธ์ ์ด๋ฆ์ด ๊ฐ์ ์์๋ ํํ๋กญ๊ฒ ๊ณต์กดํ๋ค.
์ด๊ฑฐ ํ์
์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์๋ฅผ ๋ฐ๊ฟ๋ ๋ค์ ์ปดํ์ผ ํ์ง ์์๋ ๋๋ค.
์ด๊ฑฐ ํ์
์ ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์๋ฅผ ๋ฐ๊ฟ๋ ๋ค์ ์ปดํ์ผ ํ์ง ์์๋ ๋๋ค.
๊ณต๊ฐ๋๋ ๊ฒ์ด ์ค์ง ํ๋์ ์ด๋ฆ๋ฟ์ด๋ ,
์ ์ ์ด๊ฑฐ ํจํด๊ณผ ๋ฌ๋ฆฌ ์์ ๊ฐ์ด ํด๋ผ์ด์ธํธ๋ก ์ปดํ์ผ ๋์ด ๊ฐ์ธ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌธ์์ด๋ก ์ถ๋ ฅํ๊ธฐ ์ ํฉํ๋ค.
์ด๊ฑฐํ์
์ toString()
์ ์ถ๋ ฅํ๊ธฐ์ ์ ํฉํ ๋ฌธ์์ด์ ๋ด์ด์ค๋ค.
์์์ ๋ฉ์๋, ํ๋๋ฅผ ์ถ๊ฐํ๊ณ ์์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ ์๋ค.
Object
๋ฉ์๋๋ค์ ๋์ ํ์ง๋ก ๊ตฌํํด๋จ๊ณ , Comparable
๊ณผ Serializable
์
๊ตฌํํ์ผ๋ฉฐ, ๊ทธ ์ง๋ ฌํ ํํ๋ ์ฌ๋งํผ ๋ณํ์ ๊ฐํด๋ ๋ฌธ์ ์์ด ๋์ํ๊ฒ๋ ๊ตฌํํด๋จ๋ค.
์ด๊ฑฐ ํ์ ์ฌ์ฉ ๊ฒฝ์ฐ
๊ฐ ์์์ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ํด๋น ์์ ์์ฒด์ ๋ด์ฌ์ํฌ ๋
์์ ๋ก ๋ค์๋ Apple๊ณผ Orange์ ๊ณผ์ผ ์์ ์๋ ค์ฃผ๊ฑฐ๋,
๊ณผ์ผ ์ด๋ฏธ์ง๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ์ด๊ฑฐ ํ์
์ ์ด ๊ธฐ๋ฅ์ ๋ฉ์๋๋ก ์ถ๊ฐํ ์ ์๋ค.
๊ฐ์ฅ ๋จ์ํ๊ฒ๋ ๊ทธ์ ์์์ ๋ชจ์์ผ ๋ฟ์ธ ์ด๊ฑฐ ํ์
์ด์ง๋ง,
๊ณ ์ฐจ์์ ์ถ์ ๊ฐ๋
ํ๋๋ฅผ ์๋ฒฝํ ํํํด๋ผ ์๋ ์๋ค.
Example
ํ์๊ฐ์ ํ์ฑ์๋ ๊ฐ๊ฐ ์ง๋๊ณผ ๋ฐ์ง๋ฆ์ด ์๊ณ , ์ด ๋ ์์ฑ์ ์ด์ฉํด ํ๋ฉด์ค๋ ฅ์ ๊ณ์ฐํ ์ ์๋ค.
๋ฐ๋ผ์ ์ด๋ค ๊ฐ์ฒด์ ์ง๋์ด ์ฃผ์ด์ง๋ฉด ๊ทธ ๊ฐ์ฒด๊ฐ ํ์ฑ ํ๋ฉด์ ์์ ๋์ ๋ฌด๊ฒ๋ ๊ณ์ฐํ ์ ์๋ค.
ํ๋ฉด ์ค๋ ฅ์ ๊ณ์ฐํด ์ ์ฅํ ์ด์ ๋ ๋จ์ํ ์ต์ ํ๋ฅผ ์ํด์๋ค.
@Getter
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.447e7);
private final double mass; // ์ง๋(๋จ์: ํฌ๋ก๊ทธ๋จ)
private final double radius; // ๋ฐ์ง๋ฆ(๋จ์: ๋ฏธํฐ)
private final double surfaceGravity; // ํ๋ฉด์ค๋ ฅ(๋จ์: m / s^2)
// ์ค๋ ฅ์์ (๋จ์: m^3 / kg s^2)
private static final double G = 6.67300E-11;
// ์์ฑ์
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
this.surfaceGravity = G * mass / (radius * radius);
}
public double surfaceWeight(double mass) {
return mass * surfaceGravity;
}
}
์ด๊ฑฐ ํ์ ์์ ๊ฐ๊ฐ์ ํน์ ๋ฐ์ดํฐ์ ์ฐ๊ด์ง์ผ๋ ค๋ฉด ์์ฑ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ธ์คํด์ค ํ๋์ ์ ์ฅํ๋ฉด ๋๋ค.
์ด๊ฑฐ ํ์ ์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ด๋ผ ๋ชจ๋ ํ๋๋ final์ด์ด์ผ ํ๋ค.
ํ๋๋ฅผ public์ผ๋ก ์ ์ธํด๋ ๋์ง๋ง private๋ก ๋์ด ๋ณ๋์ public ์ ๊ทผ์ ๋ฉ์๋๋ฅผ ๋๋๊ฒ ๋ซ๋ค.
์ด๋ค ๊ฐ์ฒด์ ์ง๊ตฌ์์์ ๋ฌด๊ฒ๋ฅผ ์ ๋ ฅ๋ฐ์ ํ์ฑ์์์ ๋ฌด๊ฒ๋ฅผ ์ถ๋ ฅํ๋ ์ผ์ ๋ค์๊ฐ์ด ์งง๊ฒ ์์ฑํ ์๋ ์๋ค.
public classs WeightTable {
public static void main(String[] args) {
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight / Planet.EARTH.surfaceGravity();
for (Planet p : Palanet.values())
System.out.println("%s์์ ๋ฌด๊ฒ๋ %f์ด๋ค. %n", p, p.surfaceWeight(mass));
}
}
์ง์ํ๋ ๋ฉ์๋
values()
: ์์ ์์ ์ ์๋ ์์๋ค์ ๊ฐ์ ๋ฐฐ์ด์ ๋ด์ ๋ฐํํ๋ ์ ์ ๋ฉ์๋, ๊ฐ๋ค์ ์ ์ธ๋ ์์๋ก ์ ์ฅvalueOf()
: ์์ ์ด๋ฆ์ ์ ๋ ฅ๋ฐ์ ๊ทธ ์ด๋ฆ์ ํด๋นํ๋ ์์๋ฅผ ๋ฐํtoString()
: ์์ ์ด๋ฆ์ ๋ฌธ์์ด๋ก ๋ฐํ, ์ํ๋ ๋๋ก ์ฌ์ ์๋ ๊ฐ๋ฅํ๋ค.fromString()
:toString
์ด ๋ฐํํ๋ ๋ฌธ์์ด์ ํด๋น ์ด๊ฑฐ ํ์ ์์๋ก ๋ณํ
์ด๊ฑฐ ํ์ ์์ ์์๋ฅผ ํ๋ ์ ๊ฑฐํ๋ฉด?
์ ๊ฑฐํ ์์๋ฅผ ์ฐธ์กฐํ์ง ์๋ ํด๋ผ์ด์ธํธ์๋ ์๋ฌด ์ํฅ์ด ์๋ค.
์ ๊ฑฐ๋ ์์๋ฅผ ์ฐธ์กฐํ๋ ํด๋ผ์ด์ธํธ๋ ์ปดํ์ผํ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํด ์ด๋ฅผ ์ก์ ์ ์๋ค.
์์๋ง๋ค ๋์์ด ๋ฌ๋ผ์ ธ์ผ ํ ๊ฒฝ์ฐ
์ฌ์น์ฐ์ฐ ๊ณ์ฐ๊ธฐ์ ์ฐ์ฐ ์ข ๋ฅ๋ฅผ ์ด๊ฑฐ ํ์ ์ผ๋ก ์ ์ธํ๊ณ , ์ค์ ์ฐ์ฐ๊น์ง ์ด๊ฑฐ ํ์ ์์๊ฐ ์ง์ ์ํํ๊ธฐ๋ก ํ๋ค.
public enum Operation {
PLUS, MINUS, TIMES, DIVIDE
}
switch
๋ฌธ์ผ๋ก ๋ถ๊ธฐ์ฒ๋ฆฌ
/* ์์๊ฐ ๋ปํ๋ ์ฐ์ฐ์ ์ํํ๋ค. */
public double apply(double x, double y) {
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x / y;
}
throw new AssertionError("์ ์ ์๋ ์ฐ์ฐ: " + this);
}
์ด ๋ฐฉ๋ฒ์ ๋จ์ ์ ๊นจ์ง๊ธฐ ์ฌ์ด ์ฝ๋๋ผ๋ ๊ฒ์ด๋ค.
์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋น case ๋ฌธ๋ ์ถ๊ฐํด์ฃผ์ด์ผ ํ๋ค.
ํ์ง๋ง ๊ธฐ์กด ์ด๊ฑฐ ํ์
์ ์์๋ณ ๋์์ ํผํฉํด์ ๋ฃ์ ๋๋ ์ข์ ์ ํ์ด๋ค.
์ถ๊ฐํ๋ ค๋ ๋ฉ์๋๊ฐ ์๋ฏธ์ ์ด๊ฑฐ ํ์
์ ์ํ์ง ์๋๋ค๋ฉด ์ง์ ๋ง๋ ์ด๊ฑฐ ํ์
์ด๋ผ๋ ์ด ๋ฐฉ์์ด ์ ์ฉํ๋ค.
apply()
์ถ์ ๋ฉ์๋ ์ ์ธ
public enum Operation {
PLUS {public double apply(double x, double y) {return x + y;}},
MINUS {public double apply(double x, double y) {return x + y;}},
TIMES {public double apply(double x, double y) {return x + y;}},
DIVIDE {public double apply(double x, double y) {return x + y;}};
public abstract double apply(double x, double y);
}
apply()
๊ฐ ์ถ์ ๋ฉ์๋์ด๋ฏ๋ก ์ฌ์ ์ํ์ง ์์๋ค๋ฉด ์ปดํ์ผ ์ค๋ฅ๋ก ์๋ ค์ค๋ค.
์์๋ณ ํด๋์ค ๋ชธ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ
public enum Operation {
PLUS("+") {
public double apply(double x, double y) {return x + y;}
}
MINUS("-") {
public double apply(double x, double y) {return x - y;}
}
TIMES("*") {
public double apply(double x, double y) {return x * y;}
}
DIVIDE("/") {
public double apply(double x, double y) {return x / y;}
};
private final String symbol;
Operation(String symbol) {this.symbol = symbol;}
@Override public String toString() {return symbol;}
public abstract double apply(double x, double y);
}
์ด๊ฑฐ ํ์ ์ฉ fromString ๋ฉ์๋ ๊ตฌํ
private static final Map<String, Operation> stringToEnum =
Stream.of(values()).collect(toMap(Object::toString, e -> e));
/* ์ง์ ํ ๋ฌธ์์ด์ ํด๋นํ๋ Operation์ (์กด์ฌํ๋ค๋ฉด) ๋ฐํํ๋ค. */
public static Optional<Operation> fromString(String symbol) {
return Optional.ofNullable(stringToEnum.get(symbol));
}
Operation ์์๊ฐ stringToEnum ๋งต์ ์ถ๊ฐ๋๋ ์์ ์ ์ด๊ฑฐ ํ์ ์์ ์์ฑ ํ ์ ์ ํ๋๊ฐ ์ด๊ธฐํ ๋ ๋์ด๋ค.
์ ์์ ๋ values ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ฐฐ์ด ๋์ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ค.
์ด๊ฑฐ ํ์
์์๋ ์์ฑ์์์ ์์ ์ ์ธ์คํด์ค๋ฅผ ๋งต์ ์ถ๊ฐํ ์ ์๋ค.
์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋๋๋ฐ, ์ด ๋ฐฉ์์ด ํ์ฉ๋๋ค๋ฉด ๋ฐํ์์ NullPointerException
์ด ๋ฐ์ํ์ ๊ฒ์ด๋ค.
์ด๊ฑฐ ํ์ ์ ์ ์ ํ๋ ์ค ์ด๊ฑฐ ํ์ ์ ์์ฑ์์์ ์ ๊ทผํ ์ ์๋ ๊ฒ์ ์์ ๋ณ์ ๋ฟ์ด๋ค.
์ด๊ฑฐ ํ์
์์ฑ์๊ฐ ์คํ๋๋ ์์ ์๋ ์ ์ ํ๋๋ค์ด ์์ง ์ด๊ธฐํ๋๊ธฐ ์ ์ด๋ผ,
์๊ธฐ ์์ ์ ์ถ๊ฐํ์ง ๋ชปํ๊ฒ ํ๋ ์ ์ฝ์ด ๊ผญ ํ์ํ๋ค.
ํน์ํ ์๋ก, ์ด๊ฑฐ ํ์
์์ฑ์์์ ๊ฐ์ ์ด๊ฑฐ ํ์
์ ๋ค๋ฅธ ์์์๋ ์ ๊ทผํ ์ ์๋ค.
(์ด๊ฑฐ ํ์
์ ๊ฐ ์์๋ ํด๋น ์ด๊ฑฐ ํ์
์ ์ธ์คํด์ค๋ฅผ public static final
ํ๋๋ก ์ ์ธํ๋ค.
์ฆ, ๋ค๋ฅธ ํ์ ์์๋ static
์ด๋ฏ๋ก ์ด๊ฑฐ ํ์
์์ฑ์์์ ์ ์ ํ๋์ ์ ๊ทผํ ์ ์๋ค๋ ์ ์ฝ์ด ์ ์ฉ๋๋ค.)
๋ํ, ์ ์์ ์์ fromString
์ด Optional<Operation>
์ ๋ฐํํ๋ ์ ๋ ์ฃผ์ํ์.
์ฃผ์ด์ง ๋ฌธ์์ด์ด ๊ฐ๋ฆฌํค๋ ์ฐ์ฐ์ด ์กด์ฌํ์ง ์์ ์ ์์์ ํด๋ผ์ด์ธํธ์ ์๋ฆฌ๊ณ ,
๊ทธ ์ํฉ์ ํด๋ผ์ด์ธํธ์์ ๋์ฒํ๋๋ก ํ ๊ฒ์ด๋ค.
๊ฐ์ ๋ฐ๋ผ ๋ถ๊ธฐํ์ฌ ์ฝ๋๋ฅผ ๊ณต์ ํ๋ ์ด๊ฑฐ ํ์ - ์ข์ ๋ฐฉ๋ฒ์ธ๊ฐ?
์์๋ณ ๋ฉ์๋ ๊ตฌํ์๋ ์ด๊ฑฐ ํ์
์์๋ผ๋ฆฌ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์๋ค.
์์๋ก ๊ธ์ฌ๋ช
์ธ์์์ ์ธ ์์ผ์ ํํํ๋ ์ด๊ฑฐ ํ์
์ ์๋ก ์๊ฐํด ๋ณด๋ฉด,
์ง์์ ๊ธฐ๋ณธ ์๊ธ, ๊ทธ๋ ์ผํ ์๊ฐ์ด ์ฃผ์ด์ง๋ฉด ์ผ๋น์ ๊ณ์ฐํด์ฃผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฃผ์ค์ ์ค๋ฒํ์์ด ๋ฐ์ํ๋ฉด ์์
์์ฅ์ด ์ฃผ์ด์ง๊ณ , ์ฃผ๋ง์๋ ๋ฌด์กฐ๊ฑด ์์
์๋น์ด ์ฃผ์ด์ง๋ค.
switch
๋ฌธ์ ์ด์ฉํ๋ฉด case ๋ฌธ์ ๋ ์ง๋ณ๋ก ๋์ด ์ด ๊ณ์ฐ์ ์ฝ๊ฒ ์ํํ ์ ์๋ค.
enum PayrollDay {
MONDAY, TUESDAY, WEDSDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
private static final int MINS_PER_SHIFT = 8 * 60;
int pay(int minutesWorked, int payRate) {
int basePay = minutesWorked * payRate;
int overtimePay;
switch(this) {
case SATURDAY: case SUNDAY: // ์ฃผ๋ง
overtimePay = basePay / 2;
break;
default: // ์ฃผ์ค
overtimePay = minutesWOrked <= MINS_PER_SHIFT ?
0 : minutesWorked - MINS_PER_SHIFT) * payRate / 2;
}
return basePay + overtimePay;
}
}
์ด ์ฝ๋์ ๋ฌธ์ ์ ์ ํด๊ฐ์ ๊ฐ์ ์๋ก์ด ๊ฐ์ ์ด๊ฑฐ ํ์
์ ์ถ๊ฐํ๋ ค๋ฉด ๊ทธ ๊ฐ์ ์ฒ๋ฆฌํ๋
case
๋ฌธ์ ์์ง ๋ง๊ณ ์์ผ๋ก ๋ฃ์ด์ค์ผ ํ๋ค.
PayrollDay์ ํ์ผ ์์ ์๋น ๊ณ์ฐ์ฉ ๋ฉ์๋์ธ overtimePay๋ฅผ ๊ตฌํํด๋๊ณ , ์ฃผ๋ง ์์์์๋ง ์ฌ์ ์ํด ์จ๋, ์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ๋ฉด์ overtimePay ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ง ์์ผ๋ฉด ํ์ผ์ฉ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ๋ฌผ๋ ค๋ฐ๊ฒ ๋๋ค.
์ ๋ต ์ด๊ฑฐ ํ์ ํจํด
์๋ก์ด ์์๋ฅผ ์ถ๊ฐํ ๋ ์์
์๋น โ์ ๋ตโ์ ์ ํํ๋๋ก ํ๋ ๊ฒ์ด๋ค.
์์
์๋น ๊ณ์ฐ์ private ์ค์ฒฉ ์ด๊ฑฐ ํ์
(PayType)์ผ๋ก ์ฎ๊ธฐ๊ณ ,
PayrollDay ์ด๊ฑฐ ํ์
์ ์์ฑ์์์ ์ด ์ค ์ ๋นํ ๊ฒ์ ์ ํํ๋ค.
๊ทธ๋ฌ๋ฉด payrollDay ์ด๊ฑฐ ํ์ ์ ์์ ์๋น ๊ณ์ฐ์ ๊ทธ ์ ๋ต ์ด๊ฑฐ ํ์ ์ ์์ํ์ฌ, switch ๋ฌธ์ด๋ ์์๋ณ ๋ฉ์๋ ๊ตฌํ์ด ํ์ ์๊ฒ ๋๋ค.
enum PayrollDay {
MONDAY, TUESDAY, WEDSDAY, THURSDAY, FRIDAY,
SATURDAY(PayTyoe.WEEKEND), SUNDAY(PayType.WEEKEND);
private final PayType payType;
PayrollDya(PayType payTyoe) {this.payType = payType;}
int pay(int minutesWorked, int payRate) {
return payType.pay(minutesWorked, payRate);
}
/* ์ ๋ต ์ด๊ฑฐ ํ์
*/
enum PayType {
WEEKDAY {
int overtimePay(int minusWorked, int payRate) {
return minusWorked <= MINS_PER_SHIFT ? 0 :
(minusWorked - MINS_PER_SHIFT) * payRate / 2;
}
},
WEEKEND {
int overtimePay(int minusWorked, int payRate) {
return minusWorked * payRate / 2;
}
};
abstract int overtimePay(int mins, int payRate);
private static final int MINS_PER_SHIFT = 8 * 60;
int pay(int minsWorked, int payRate) {
int basePay = minsWorked * payRate;
return basePay + overtimePay(minsWorked, payRate);
}
}
}
ํ์ํ ์์๋ฅผ ์ปดํ์ผํ์์ ๋ค ์ ์ ์๋ ์์ ์งํฉ์ด๋ผ๋ฉด, ํญ์ ์ด๊ฑฐ ํ์ ์ ์ฌ์ฉํ์
์ด๊ฑฐ ํ์
์ ์ ์๋ ์์ ๊ฐ์๊ฐ ์์ํ ๊ณ ์ ๋ถ๋ณ์ผ ํ์๋ ์๋ค.
์ด๊ฑฐ ํ์
์ ๋์ค์ ์์๊ฐ ์ถ๊ฐ๋ผ๋ ๋ฐ์ด๋๋ฆฌ ์์ค์์ ํธํ๋๋๋ก ์ค๊ณ๋์๋ค.
์ ๋ฆฌ
- ์ด๊ฑฐ ํ์ ์ ์ ์ ์์๋ณด๋ค ์ฝ๊ธฐ ์ฝ๊ณ , ์์ ํ๊ณ ๊ฐ๋ ฅํ๋ค.
- ์ด๊ฑฐ ํ์ ์ ๋ช ์์ ์์ฑ์๋ ๋ฉ์๋ ์์ด ์ฐ์ด์ง๋ง, ๊ฐ ์์๋ฅผ ํน์ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐ์ง๊ฑฐ๋ ์์๋ง๋ค ๋ค๋ฅด๊ฒ ๋์ํ๊ฒ ํ ๋ ํ์ํ๋ค.
- ๋๋ฌผ๊ฒ ํ๋์ ๋ฉ์๋๊ฐ ์์๋ณ๋ก ๋ค๋ฅด๊ฒ ๋์ํด์ผ ํ ๋๋ ์๋ค. ์ด๋ฐ ์ด๊ฑฐ ํ์ ์์๋ switch ๋ฌธ ๋์ ์์๋ณ ๋ฉ์๋ ๊ตฌํ์ ์ฌ์ฉํ๋ค.
- ์ด๊ฑฐ ํ์ ์์ ์ผ๋ถ๊ฐ ๊ฐ์ ๋์์ ๊ณต์ ํ๋ฉด ์ ๋ต ์ด๊ฑฐ ํ์ ํจํด์ ์ฌ์ฉํ์.