item 23 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e μμ΄ν 23λ₯Ό μμ½ν λ΄μ© μ λλ€.
λ κ°μ§ μ΄μμ μλ―Έ
λ₯Ό ννν μ μμΌλ©°, κ·Έμ€ νμ¬ νννλ μλ―Έλ₯Ό νκ·Έ
κ°μΌλ‘ μλ €μ£Όλ ν΄λμ€λ₯Ό λ³Έ μ μ΄ μμ κ²μ΄λ€. λ€μ μ½λλ μ
κ³Ό μ¬κ°ν
μ ννν μ μλ ν΄λμ€λ€.
class Figure P
enum Shape { RECTANGLE, CIRCLE };
...
// μμ© μμ±μ
Figure(double radius) {
shape = Shape.CIRCLE;
this.radius = radius;
}
// μ¬κ²©νμ© μμ±μ
Figure(double length, double width) {
shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
double area() {
switch(shape) {
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
throw new AssertionError(shape);
}
}
λ¨μ
μ΄ νκ°λμ΄λ€.
νκ·Έ λ¬λ¦° ν΄λμ€μλ μ°μ μ΄κ±° νμ
μ μΈ
, νκ·Έ νλ
, switch
λ¬Έ λ± μΈλ°μλ μ½λκ° λ§λ€. μ¬λ¬ ꡬνμ΄ ν ν΄λμ€μ νΌν©λΌ μμ΄μ κ°λ
μ±
λ λμλ€. λ€λ₯Έ μλ―Έλ₯Ό μν μ½λλ μΈμ λ ν¨κ» νλ λ©λͺ¨λ¦¬
λ λ§μ΄ μ¬μ©νλ€. νλλ€μ final
λ‘ μ μΈνλ €λ©΄ ν΄λΉ μλ―Έμ μ°μ΄μ§ μλ νλλ€κΉμ§ μμ±μμμ μ΄κΈ°ν
ν΄μΌ νλ€.
λν, μλ‘μ΄ μλ―Έλ₯Ό μΆκ°ν λλ§λ€ λͺ¨λ switch
λ¬Έμ μ°Ύμ μ μλ―Έλ₯Ό μ²λ¦¬νλ μ½λλ₯Ό μΆκ°ν΄μΌ νλλ°, νλλΌλ λΉ λ¨λ¦¬λ©΄ μμ λ°νμ
μ λ¬Έμ κ° λΆκ±°μ Έ λμ¬ κ²μ΄λ€. λ§μ§λ§μΌλ‘, μΈμ€ν΄μ€μ νμ
λ§μΌλ‘λ νμ¬ λνλ΄λ μλ―Έ
λ₯Ό μ κΈΈμ΄ μ ν μλ€. νλ§λλ‘, νκ·Έ λ¬λ¦° ν΄λμ€λ μ₯ν©νκ³ , μ€λ₯λ₯Ό λ΄κΈ° μ½κ³ λΉν¨μ¨μ
μ΄λ€.
μλΈνμ΄ν
λ€νν μλ°μ κ°μ κ°μ²΄ μ§ν₯ μΈμ΄λ νμ
νλλ‘ λ€μν μλ―Έμ κ°μ²΄λ₯Ό νννλ ν¨μ¬ λμ μλ¨μ μ 곡νλ€. λ°λ‘ ν΄λμ€ κ³μΈ΅ ꡬ쑰λ₯Ό νμ©νλ μλΈνμ΄ν(subtyping)
μ΄λ€.
νκ·Έ κ°μ λ°λΌ λμμ΄ λ¬λΌ μ§λ λ©μλλ€μ λ£¨νΈ ν΄λμ€
μ μΆμ λ©μλ
λ‘ μ μΈνλ€.
abstract class Figure {
abstract double area();
}
class Circle extends Figure {
final double radius;
Circle(double radius) { this.radius = radius; }
@Override double area() { return Math.PI * (radius * radius); }
}
class Rectangle extends Figure {
final double length;
final double width;
Rectangle(double length, double width;) {
this.length = length;
this.width = width;
}
@Override double area() { return length * width; }
}
νμ
μ΄ μλ―Έ λ³λ‘ λ°λ‘ μ‘΄μ¬νλ λ³μμ μλ―Έλ₯Ό λͺ
μνκ±°λ μ νν μ μκ³ , λ νΉμ μλ―Έλ§ λ§€κ° λ³μλ‘ λ°μ μ μλ€. λν, νμ
μ¬μ΄μ μμ°μ€λ¬μ΄ κ³μΈ΅ κ΄κ³λ₯Ό λ°μν μ μμ΄μ μ μ°μ±
μ λ¬Όλ‘ μ»΄νμΌ νμ
νμ
κ²μ¬ λ₯λ ₯μ λμ¬μ€ μ μλ€.
class Square extends Rectangle {
Square(double side) {
super(side, side);
}
}
μ 리
νκ·Έ λ¬λ¦° ν΄λμ€λ₯Ό μ¨μΌ νλ μν©μ κ±°μ μλ€. μλ‘μ΄ ν΄λμ€λ₯Ό μμ±νλ λ° νκ·Έ νλ
κ° λ±μ₯νλ€λ©΄ νκ·Έλ₯Ό μμ λ κ³μΈ΅ ꡬ쑰
λ‘ λ체νλ λ°©λ²μ μκ°ν΄λ³΄μ.