태그 달린 클래스?
해당 클래스가 어떤 타입인지를 나타내는 필드를 포함하는 클래스
태그 달린 클래스는 단점이 한가득이다. 장황하고 오류를 내기 쉽고 비효율적이다.
아래의 예시를 보자
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);
        }
	}
}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);
	}
}