item 23 sungjaeyoon - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค ๋ณด๋‹ค๋Š” ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜๋ผ.

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ์˜๋ฏธ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ํ‘œํ˜„ํ•˜๋ ค๋Š” ์˜๋ฏธ๋ฅผ ํƒœ๊ทธ๊ฐ’์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ํด๋ž˜์Šค์ด๋‹ค.

class Figure {
    enum Shape { RECTANGLE, CIRCLE };

    final Shape shape; // ํƒœ๊ทธ ํ•„๋“œ - ํ˜„์žฌ ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

    // ๋‹ค์Œ ํ•„๋“œ๋“ค์€ ๋ชจ์–‘์ด ์‚ฌ๊ฐํ˜•(RECTANGLE)์ผ ๋•Œ๋งŒ ์“ฐ์ธ๋‹ค.
    double length;
    double width;

    // ๋‹ค์Œ ํ•„๋“œ๋Š ๋ชจ์–‘์ด ์›(CIRCLE)์ผ ๋•Œ๋งŒ ์“ฐ์ธ๋‹ค.
    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);
        }
    }
}

์ด๋Ÿฐ ํƒœ๊ทธ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” ๋‹จ์ ์ด ํ•œ๊ฐ€๋“์ด๋‹ค.

  1. ์—ด๊ฑฐํƒ€์ž…, ํƒœ๊ทธํ•„๋“œ ๋“ฑ ์“ธ๋ฐ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ๋‹ค.
  2. ์—ฌ๋Ÿฌ ๊ตฌํ˜„์ด ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
  3. ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋„ ์–ธ์ œ๋‚˜ ํ•จ๊ป˜ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

=> ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋Š” ์žฅํ™ฉํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋‚ด๊ธฐ ์‰ฝ๊ณ  ๋น„ํšจ์œจ์ ์ด๋‹ค.


ํƒœ๊ทธ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ฅผ ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•

  1. ๊ฐ€์žฅ ๋จผ์ € ๊ณ„์ธต ๊ตฌ์กฐ์˜ ๋ฃจํŠธ๊ฐ€ ๋  ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.
  2. ํƒœ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง€๋Š” ๋ฉ”์„œ๋“œ๋“ค์„ ๋ฃจํŠธํด๋ž˜์Šค์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธํ•œ๋‹ค.
  3. ๋™์ž‘์ด ์ผ์ •ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฃจํŠธํด๋ž˜์Šค์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  4. ๋‹ค์Œ์œผ๋กœ ๋ฃจํŠธ ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•œ ๊ตฌ์ฒด ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜์”ฉ ์ •์˜ํ•œ๋‹ค.
    ์ด์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ Figure ํด๋ž˜์Šค๋ฅผ ์žฌ์ •์˜ ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.
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);
    }
}

์ •๋ฆฌ

ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ฅผ ์จ์•ผํ•˜๋Š” ์ƒํ™ฉ์€ ๊ฑฐ์˜ ์—†๋‹ค. ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ํƒœ๊ทธ ํ•„๋“œ๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค๋ฉด
ํƒœ๊ทธ๋ฅผ ์—†์• ๊ณ  ๊ณ„์ธต๊ตฌ์กฐ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ณด์ž.