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);
    }
}

정리

νƒœκ·Έ 달린 클래슀λ₯Ό 써야 ν•˜λŠ” 상황은 거의 μ—†λ‹€. μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 데 νƒœκ·Έ ν•„λ“œκ°€ λ“±μž₯ν•œλ‹€λ©΄ νƒœκ·Έλ₯Ό 없애도 계측 ꡬ쑰둜 λŒ€μ²΄ν•˜λŠ” 방법을 μƒκ°ν•΄λ³΄μž.