item 23 hyowon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
νκ·Έ λ¬λ¦° ν΄λμ€λ
λ κ°μ§ μ΄μμ μλ―Έλ₯Ό ννν μ μμΌλ©°, κ·Έμ€ νμ¬ νννλ μλ―Έλ₯Ό νκ·Έ κ°μΌλ‘ μλ €μ£Όλ ν΄λμ€
public class Figure {
enum Shape { RECTANGLE, CIRCLE };
// νκ·Έ νλ - νμ¬ λͺ¨μμ λνλΈλ€.
final Shape shape;
// λ€μ νλλ€μ λͺ¨μμ΄ μ¬κ°νμΌ λλ§ μ°μΈλ€.
double length;
double width;
// λ€μ νλλ λͺ¨μμ΄ μμΌλλ§ μ°μΈλ€.
double radius;
// μμ© μμ±μ
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λ¬Έ...)
- μ¬λ¬ ꡬνμ΄ ν ν΄λμ€μ νΌν©λΌ μμ΄μ κ°λ μ±λ λμλ€. (SRPμλ°)
- λ€λ₯Έ μλ―Έλ₯Ό μν μ½λλ ν¨κ»νλ λ©λͺ¨λ¦¬λ₯Ό λ§μ΄ μ¬μ©νλ€.
- νλλ₯Ό final μ μΈν λλ λ€λ₯Έ μλ―Έλ₯Ό μν νλλ€λ final μ μΈ ν μ΄κΈ°ν ν΄μΌν΄ λΆνμν μ½λκ° λμ΄λλ€.
- μμ±μκ° νκ·Έ νλλ₯Ό μ΄κΈ°ννλλ° μ»΄νμΌλ¬κ° μλ¬λ₯Ό μ‘λλ° λμ μ£ΌκΈ°κ° μ΄λ ΅λ€. (λ°νμ μμλ μ€λ₯κ° λ°κ²¬λλ€.)(?)
β ν λ§λλ‘, νκ·Έ λ¬λ¦° ν΄λμ€λ μ₯ν©νκ³ , μ€λ₯λ₯Ό λ΄κΈ° μ½κ³ , λΉν¨μ¨μ μ΄λ€.
λμ
νκ·Έ λ¬λ¦° ν΄λμ€λ₯Ό ν΄λμ€ κ³μΈ΅κ΅¬μ‘°λ₯Ό νμ©νλ μλΈ νμ΄ν(sub-typing)μΌλ‘ λ³κ²½
- κ³μΈ΅ ꡬ쑰μ 루νΈκ° λ μΆμ ν΄λμ€λ₯Ό μ μ ν,
- νκ·Έ κ°μ λ°λΌ λμμ΄ λ¬λΌμ§λ λ©μλλ€μ μΆμ λ©μλλ‘ μ μΈ
- νκ·Έ κ°μ μκ΄ μμ΄ λμμ΄ μΌμ ν λ©μλλ₯Ό μΌλ° λ©μλλ‘ μΆκ°
- λͺ¨λ νμ ν΄λμ€μμ 곡ν΅μΌλ‘ μ¬μ©νλ νλλ μΆκ°νλ€.
- λ£¨νΈ ν΄λμ€λ₯Ό νμ₯ν ꡬ체 ν΄λμ€λ₯Ό μλ―Έλ³λ‘ νλμ© μ μνλ€.
abstract class Figure {
abstract double area();
}
class Circle extends Figure {
final double radius;
Circle(double radius) { this.radius = radius; }
@Override double area() { return 0; }
}
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; }
}
κ°κ²°νκ³ λͺ ννλ©° μΈλ°μλ μ½λλ λͺ¨λ μ¬λΌμ‘λ€.
νκ·Έ λ¬λ¦° ν΄λμ€μ λ¨μ μ ν΄κ²°νλλ°,
- κ° μλ―Έλ₯Ό λ 립λ ν΄λμ€μ λ΄μ κ΄λ ¨ μλ λ°μ΄ν° νλλ₯Ό λͺ¨λ μ κ±°
- μ΄μλ¨μ νλλ€μ λͺ¨λ finalμ΄λ€.
- μ»΄νμΌ νμμ final νλκ° μ΄κΈ°νλλμ§, μΆμ λ©μλκ° κ΅¬νλλμ§ μ²΄ν¬λλ€.(switchλ¬Έ μ κ±°)
- λ£¨νΈ ν΄λμ€μ μ½λλ₯Ό 건λλ¦¬μ§ μκ³ λ λ 립μ μΌλ‘ κ³μΈ΅κ΅¬μ‘°λ₯Ό νμ₯ κ°λ₯νλ€. (OCP μμΉ μΆ©μ‘±)
- νμ μ΄ μλ―Έλ³λ‘ λ°λ‘ μ‘΄μ¬νλ λ³μμ μλ―Έλ₯Ό λͺ μνκ±°λ μ νν μ μκ³ , λ νΉμ μλ―Έλ§ λ§€κ°λ³μλ‘ λ°μ μ μλ€.
- νμ μ¬μ΄μ μμ°μ€λ¬μ΄ κ³μΈ΅ κ΄κ³λ₯Ό λ°μν μ μμ΄μ μ μ°μ±, μ»΄νμΌνμ νμ κ²μ¬ λ₯λ ₯μ λμ¬μ€λ€.
// μ§μ¬κ°ν μλμ μ μ¬κ°ν
class Square extends Rectangle {
Square(double side) {
super(side, side);
}
}
κ²°λ‘
νκ·Έ λ¬λ¦° ν΄λμ€λ³΄λ€λ κ³μΈ΅ κ΅¬μ‘°λ‘ μ½λλ₯Ό μ§λλ‘ νμ.