Skip to content

Latest commit

Β 

History

History
97 lines (74 loc) Β· 3.14 KB

Item_23._use_class_hierarchy.md

File metadata and controls

97 lines (74 loc) Β· 3.14 KB

νƒœκ·Έ 달린 ν΄λž˜μŠ€λ³΄λ‹€λŠ” 클래슀 계측ꡬ쑰λ₯Ό ν™œμš©

νƒœκ·Έ 달린 클래슀

  • ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ 두 가지 μ΄μƒμ˜ 의미λ₯Ό ν‘œν˜„ν•  수 있으며, κ·Έ 쀑 ν˜„μž¬ ν‘œν˜„ν•˜λŠ” 의미λ₯Ό νƒœκ·Έ κ°’μœΌλ‘œ μ•Œλ €μ£ΌλŠ” 클래슀
  • 각 의미λ₯Ό ν‘œν˜„ν•˜κΈ° μœ„ν•œ ν•„λ“œλ₯Ό λͺ¨λ‘ μ†Œμœ ν•˜κ³ , νƒœκ·Έ ν•„λ“œλ₯Ό μ†Œμœ ν•΄μ•Ό 함

μ˜ˆμ‹œ - λ‹€μ–‘ν•œ λ„ν˜•μ„ ν‘œν˜„ν•  수 μžˆλŠ” Figure 클래슀

class Figure {
    enum Shape { RECTANGLE, CIRCLE };

    final Shape shape; // νƒœκ·Έ ν•„λ“œ

    // shapeκ°€ μ‚¬κ°ν˜•μΌ λ•Œλ₯Ό μœ„ν•œ ν•„λ“œ
    double length;
    double width;

    // shapeκ°€ 원일 λ•Œλ₯Ό μœ„ν•œ ν•„λ“œ
    double radius;

    Figure(double length, double width) {
        shape = Shape.RECTANGLE;
        this.length = length;
        this.width = width;
    }

    Figure(double radius) {
        shape = Shape.CIRCLE;
        this.radius = radius;
    }

    double area() {
        return switch (shape) {
            case RECTANGLE -> length * width;
            case CIRCLE -> Math.PI * radius * radius;
        };
    }
}

νƒœκ·Έ 달린 클래슀의 문제점

  • 일단 SRP μœ„λ°˜
    • ν•˜λ‚˜μ˜ 의미 λ‚΄ μˆ˜μ •μ΄ μΌμ–΄λ‚˜λ©΄ 전체 ν΄λž˜μŠ€μ— 영ν–₯을 λ―ΈμΉ¨
  • ν•˜λ‚˜μ˜ 의미λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•΄λ‹Ή μ˜λ―Έμ— μ‚¬μš©λ˜μ§€ μ•ŠλŠ” ν•„λ“œλ“€κΉŒμ§€ μ΄ˆκΈ°ν™”λ¨
  • μƒˆ 의미λ₯Ό μΆ”κ°€ν•˜λ©΄ λ©”μ„œλ“œ λ‚΄ λͺ¨λ“  switch 문을 μˆ˜μ •ν•΄μ€˜μ•Ό 함
  • λΉ„νš¨μœ¨μ μ΄κ³ , 였λ₯˜λ₯Ό λ‚΄κΈ° μ‰¬μš°λ©°, 가독성도 μ•ˆμ’‹μŒ

νƒœκ·Έ 달린 클래슀 λŒ€μ‹  클래슀 계측ꡬ쑰λ₯Ό ν™œμš©

  • 각 의미λ₯Ό ν‘œν˜„ν•  클래슀의 뿌리(root)κ°€ 될 좔상 클래슀λ₯Ό μ„ μ–Έν•˜κ³ , μ˜λ―Έμ™€ 상관 없이 λ™μΌν•œ 의미λ₯Ό κ°–λŠ” ν•„λ“œ/λ™μΌν•œ λ™μž‘μ„ μˆ˜ν–‰ν•˜λŠ” λ©”μ„œλ“œλ₯Ό root ν΄λž˜μŠ€μ— 올림
  • μ˜λ―Έμ— 따라 λ™μž‘μ΄ λ‹¬λΌμ§€λŠ” λ©”μ„œλ“œλŠ” 좔상 λ©”μ„œλ“œλ‘œ μ •μ˜
  • 루트 클래슀λ₯Ό ν™•μž₯(상속)ν•œ ꡬ체 클래슀λ₯Ό μ˜λ―Έλ³„λ‘œ ν•˜λ‚˜μ”© μ •μ˜ν•˜λ©°, ν•΄λ‹Ή 클래슀 λ‚΄μ—μ„œ ν•„μš”ν•œ ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό μ„ μ–Έ

μ˜ˆμ‹œ - μœ„μ˜ Figure 클래슀λ₯Ό 클래슀 κ³„μΈ΅κ΅¬μ‘°λ‘œ λ³€ν™˜

abstract class Figure {
    abstract double area();
}

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 Circle extends Figure {
    final double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double area() {
        return Math.PI * radius * radius;
    }
}
  • 각 ꡬ체 ν΄λž˜μŠ€λ“€μ€ ν•˜λ‚˜μ˜ μ±…μž„λ§Œμ„ μˆ˜ν–‰
  • κ΄€λ ¨ μ—†λŠ” ν•„λ“œλ₯Ό μ†Œμœ ν•˜μ§€ μ•ŠμŒ
  • ν•œ ꡬ체 클래슀의 λ³€ν™”κ°€ λ‹€λ₯Έ ꡬ체 ν΄λž˜μŠ€μ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŒ
  • κ°„κ²°ν•˜κ³  λͺ…ν™•ν•˜λ©°, μƒˆλ‘œμš΄ ꡬ체 클래슀λ₯Ό μΆ”κ°€ν•˜κΈ° 쉬움
  • κΈ°μ‘΄ ν•„λ“œλ“€μ€ μ˜λ―Έκ°€ λ³€ν™”ν•  수 있기 λ•Œλ¬Έμ— λΆˆλ³€μœΌλ‘œ μ •μ˜ν•  수 μ—†μ—ˆμœΌλ‚˜, 클래슀 계측ꡬ쑰λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μƒμ„±μžλ₯Ό 톡해 값을 μ΄ˆκΈ°ν™”ν•œ λ’€ 값이 λ³€ν™”ν•˜μ§€ μ•ŠμŒμ„ 보μž₯ν•  수 μžˆλ‹€λ©΄ λΆˆλ³€μœΌλ‘œ μ •μ˜ν•  수 있음