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

신명철·2022년 2월 20일
0

Effective Java

목록 보기
21/80

태그 달린 클래스의 문제점

태그 달린 클래스?
해당 클래스가 어떤 타입인지를 나타내는 필드를 포함하는 클래스

태그 달린 클래스는 단점이 한가득이다. 장황하고 오류를 내기 쉽고 비효율적이다.

아래의 예시를 보자

class Figure{
	enum Shape { RECTANGLE, CIRCLE };
    
    final Shape shape;
    
    // 사각형일 때만 사용
    double width;
    double length;
    
    // 원 일 경우에만 사용
    double radius; 
    
    Figure(double radius){
    	shape = Shape.CIRCLE;
        this.radius = radius;
    }
    
    Figure(double length, double width){
    	shape = Shape.RECTANGLE;
        this.width = width;
        this.length = length;
    }
    
    double area(){
    	switch(shape){
        	case RECTANGLE:
            	return length*width;
            case CIRCLE:
            	return MATH.PI * (radius * radius);
			default:
            	throw new AssertionError(shape);
        }
	}
}
  • 열거 타입, 태그 필드, switch 문 등 쓸데없는 코드가 너무 많다
  • 여러 구현이 한 클래스에 혼합되어 가독성이 나쁘다
  • 다른 의미를 위한 코드가 포함되어 있어 메모리를 많이 사용한다
  • 필드들을 final 로 선언하려면 해당 의미에 쓰이지 않는 필드들까지 생성자에서 초기화해야 한다.

태그 달린 클래스는 계층 구조로 대체하자

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 width * length };
}

class Square extends Rectangle{
	Square(double side){
    	super(side, side);
	}
}
profile
내 머릿속 지우개

0개의 댓글