Study/Effective-Java

[item#23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라

hongeeii 2023. 11. 30. 10:42
728x90
반응형

태그 달린 클래스보다는 클래스 계층구조를 활용하라.

태글 달린 클래스란, 해당 클래스가 어떠한 타입인지에 대한 정보를 담고 있는 멤버 변수인 태그를 이용하여 구현되는 클래스. (두 가지 이상의 의미를 표현할 수 있는 클래스. 두 가지 이상의 의미를 가지고 있기 때문에 생성자도 따로 필드들도 따로 구현되어야 한다.)

태그란?

  • 클래스가 어떠한 타입인지에 대한 정보를 담고 있는 멤버 변수(필드)를 의미한다.

하지만 태그 달린 클래스는 많은 단점을 가지고 있다.

  1. 쓸데없는 코드가 많다.
  2. 가독성이 나쁘다.
  3. 메모리도 많이 사용한다.
  4. 필드를 final로 선언하려면 불필요한 필드까지 초기화해야 한다.
  5. 인스턴스 타입만으로는 현재 나타내는 의미를 알 길이 없다.
public static 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 newAssertionError(shape);
        }
    }
}

따라서 자바에서는 태그 클래스 대신 클래스 계층구조를 활용하여 구현하는 것이 더 바람직하다.

클래스 계층구조를 활용하면 상속 및 다형성을 이용하여 코드를 간결하게 작성할 수 있으며, 가독성도 향상된다.

가장 먼저 계층구조의 루트가 될 추상 클래스를 정의하고, 태그 값에 따라 동작이 달라지는 메서드들을 루트 클래스의 추상 메서드로 선언한다.

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

SRP(Single Responsibility Principle)

클래스는 하나의 기능만 가져야 하는 SRP(Single Responsibility Principle)원칙을 지켜야 한다.

하나의 기능만 가져야 유지보수하기도 편하고, 객체지향적으로 잘 작성할 수 있다.

728x90
반응형