πŸ“‚ JAVA/μ΄νŽ™ν‹°λΈŒ μžλ°”

νƒœκ·Έ 달린 ν΄λž˜μŠ€λ³΄λ‹€λŠ” 클래슀 계측ꡬ쑰λ₯Ό ν™œμš©ν•˜λΌ - [4μž₯. ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€(μ•„μ΄ν…œ23)]

Amenable 2023. 5. 8. 20:53

1. νƒœκ·Έ 달린 클래슀 🎧

  νƒœκ·Έ 달린 ν΄λž˜μŠ€λž€ 두 κ°€μ§€ μ΄μƒμ˜ 의미λ₯Ό ν‘œν˜„ν•  수 있으며, 그쀑 ν˜„μž¬ ν‘œν˜„ν•˜λŠ” 의미λ₯Ό νƒœκ·Έ κ°’μœΌλ‘œ μ•Œλ €μ£ΌλŠ” 클래슀λ₯Ό λ§ν•œλ‹€.

  μ•„λž˜ μ½”λ“œλŠ” 원과 μ‚¬κ°ν˜•μ„ ν‘œν˜„ν•  수 μžˆλŠ” νƒœκ·Έ 달린 ν΄λž˜μŠ€μ΄λ‹€.

public class Figure {

    enum Shape {RECTANGLE, CIRCLE};

    // νƒœκ·Έ ν•„λ“œ - ν˜„μž¬ λͺ¨μ–‘을 λ‚˜νƒ€λ‚Έλ‹€.
    final Shape shape;

    // λ‹€μŒ ν•„λ“œλ“€μ€ λͺ¨μ–‘이 μ‚¬κ°ν˜•(RECTANGLE)일 λ•Œλ§Œ 쓰인닀.
    double length;
    double width;

    // λ‹€μŒ ν•„λ“œλŠ” λͺ¨μ–‘이 원(CIRCLE)일 λ•Œλ§Œ 쓰인닀.
    double radius;

    // μ›μš© μƒμ„±μž
    Figure2(double radius){
        shape = Shape.CIRCLE;
        this.radius = radius;
    }

    // μ‚¬κ°ν˜•μš© μƒμ„±μž
    Figure2(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);
        }
    }
}

 

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

  νƒœκ·Έ 달린 ν΄λž˜μŠ€μ—λŠ” 단점이 λ„ˆλ¬΄λ‚˜λ„ λ§Žλ‹€.

πŸ“• 단점 1. μ—΄κ±° νƒ€μž… μ„ μ–Έ, νƒœκ·Έ ν•„λ“œ, switch λ¬Έ λ“± μ“Έλ°μ—†λŠ” μ½”λ“œκ°€ λ§Žλ‹€.

πŸ“• λ‹¨μ  2. μ—¬λŸ¬ κ΅¬ν˜„이 ν•œ ν΄λž˜μŠ€μ— ν˜Όν•©λΌ μžˆμ–΄μ„œ κ°€λ…성이 λ‚˜μ˜λ‹€.

πŸ“• λ‹¨μ  3. λ‹€λ₯Έ μ˜λ―Έλ₯Ό μœ„ν•œ μ½”λ“œλ„ μ–Έμ œλ‚˜ ν•¨κ»˜ ν•˜λ‹ˆ λ©”λͺ¨λ¦¬λ„ λ§Žμ΄ μ‚¬μš©ν•œλ‹€.

πŸ“• λ‹¨μ  4. ν•„λ“œλ“€μ„ final둜 μ„ μ–Έν•˜λ €λ©΄ ν•΄λ‹Ή μ˜λ―Έμ— μ“°μ΄μ§€ μ•ŠλŠ” ν•„λ“œλ“€κΉŒμ§€ μƒμ„±μžμ—μ„œ μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€.

πŸ“• λ‹¨μ  5. λ˜ λ‹€λ₯Έ μ˜λ―Έλ₯Ό μΆ”κ°€ν•˜λ €λ©΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.

  μ •μ‚¬κ°ν˜•μ„ λ‚˜νƒ€λ‚΄λŠ” Squareλ₯Ό μΆ”κ°€ν•œλ‹€κ³  생각해 보면 area()의 switch λ¬Έμ—μ„œ μƒˆ 의미λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. ν•˜λ‚˜λΌλ„ 빠뜨리면 λŸ°νƒ€μž„μ— λ¬Έμ œκ°€ μƒκΈ°κ²Œ λœλ‹€.

단점 6. μΈμŠ€ν„΄μŠ€ νƒ€μž…λ§ŒμœΌλ‘œλŠ” ν˜„μž¬ λ‚˜νƒ€λ‚΄λŠ” μ˜λ―Έλ₯Ό μ•Œ κΈΈμ΄ μ „ν˜€ μ—†λ‹€.

  Figure νƒ€μž…μ„ μ‚¬μš©ν•œλ‹€κ³  ν•΄μ„œ ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€κ°€ 원을 λ‚˜νƒ€λ‚΄λŠ” 것인지 μ‚¬κ°ν˜•μ„ λ‚˜νƒ€λ‚΄λŠ” 것인지 μ•Œ μˆ˜κ°€ μ—†λ‹€.

 

3. 클래슀 계측 ꡬ쑰 (ν•΄κ²°μ±…) πŸ“»

  μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” 클래슀 계측ꡬ쑰λ₯Ό ν™œμš©ν•΄μ•Ό ν•œλ‹€.

  μ‚¬μš©λ²•μ€ μ•„λž˜μ™€ κ°™λ‹€.

  1. κ³„μΈ΅κ΅¬μ‘°μ˜ λ£¨νŠΈ(root)κ°€ λ  μΆ”상 ν΄λž˜μŠ€λ₯Ό μ •μ˜ν•œλ‹€.
  2. νƒœκ·Έ 값에 따라 λ™μž‘μ΄ λ‹¬λΌμ§€λŠ” λ©”μ„œλ“œλ“€μ„ 루트 클래슀의 좔상 λ©”μ„œλ“œλ‘œ μ„ μ–Έν•œλ‹€.
  3. νƒœκ·Έ 값에 상관없이 λ™μž‘μ΄ μΌμ •ν•œ λ©”μ„œλ“œλ“€μ„ 루트 ν΄λž˜μŠ€μ— 일반 λ©”μ„œλ“œλ‘œ μΆ”κ°€ν•œλ‹€.
  4. λͺ¨λ“  ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 데이터 ν•„λ“œλ“€λ„ μ „λΆ€ 루트 클래슀둜 μ˜¬λ¦°λ‹€.
abstract public class Figure {

    // νƒœκ·Έ 값에 따라 λ™μž‘μ΄ λ‹¬λΌμ§€λŠ” λ©”μ„œλ“œλ₯Ό 좔상 λ©”μ„œλ“œλ‘œ μ„ μ–Έ
    abstract double area();
}

----------

public class Circle extends Figure {

    final double radius;

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

    @Override
    double area() {
        return Math.PI * (radius * radius);
    }
}

----------

public class Rectangle extends Figure {

    final double length;
    final double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    double area() {
        return length * width;
    }
}

  μœ„μ™€ 같은 클래슀 κ³„μΈ΅κ΅¬μ‘°λŠ” νƒœκ·Έ 달린 클래슀의 단점듀을 λͺ¨λ‘ 없애버린닀. μž₯점은 μ•„λž˜μ™€ κ°™λ‹€.

πŸ“˜ μž₯점 1. κ°„κ²°ν•˜κ³  λͺ…ν™•ν•˜κ³ , μ“Έλ°μ—†λŠ” μ½”λ“œλ„ λͺ¨λ‘ 사라진닀.

πŸ“˜ μž₯점 2. 각 μ˜λ―Έμ— λ…λ¦½λœ ν΄λž˜μŠ€μ— λ‹΄μ•„ κ΄€λ ¨ μ—†λ˜ 데이터 ν•„λ“œλ₯Ό λͺ¨λ‘ μ œκ±°ν•œλ‹€.

πŸ“˜ μž₯점 3. 살아남은 ν•„λ“œλ“€μ€ λͺ¨λ‘ final이닀.

πŸ“˜ μž₯점 4. μ‹€μˆ˜λ‘œ 빼먹은 caseλ¬Έ λ•Œλ¬Έμ— λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•  일도 μ—†λ‹€.

πŸ“˜ μž₯점 5. λ£¨νŠΈ ν΄λž˜μŠ€μ˜ μ½”λ“œλ₯Ό κ±΄λ“œλ¦¬μ§€ μ•Šκ³ λ„ λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ λ…λ¦½μ μœΌλ‘œ κ³„측ꡬ쑰λ₯Ό ν™•μž₯ν•˜κ³  ν•¨κ»˜ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€. (μ•„λž˜μ˜ Squareκ°€ κ·Έ μ˜ˆμ‹œμ΄λ‹€.)

public class Square extends Rectangle {

    Square(double side){
        super(side, side);
    }
}

  νƒœκ·Έ 달린 클래슀λ₯Ό 써야 ν•˜λŠ” 상황은 거의 μ—†λ‹€. κ·ΈλŸ¬λ―€λ‘œ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 데 νƒœκ·Έκ°€ λ“±μž₯ν•œλ‹€λ©΄ νƒœκ·Έλ₯Ό μ—†μ• κ³  κ³„μΈ΅κ΅¬μ‘°λ‘œ λŒ€μ²΄ν•˜λŠ” 방법을 생각해 보자. λ˜ν•œ, κΈ°μ‘΄ ν΄λž˜μŠ€κ°€ νƒœκ·Έ ν•„λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€λ©΄ κ³„μΈ΅κ΅¬μ‘°λ‘œ λ¦¬νŒ©ν„°λ§ ν•˜λŠ” κ±Έ κ³ λ―Όν•΄ 보자.