Open callmeaxxe opened 1 year ago
태그 달린 클래스란 클래스가 가지고 있는 필드중에 일부가 클래스의 구체적인 타입을 나타내는 경우를 의미함
// 코드 23-1 태그 달린 클래스 - 클래스 계층구조보다 훨씬 나쁘다! (142-143쪽) class Figure { enum Shape { RECTANGLE, CIRCLE, SQUARE }; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 Figure(double radius) { shape = Shape.CIRCLE; this.radius = radius; } // 사각형용 생성자 Figure(double length, double width) { if (this.length == this.width) { shape = Shape.SQUARE; } else { shape = Shape.RECTANGLE; } this.length = length; this.width = width; } double area() { switch(shape) { case RECTANGLE, SQUARE: return length * width; case CIRCLE: return Math.PI * (radius * radius); default: throw new AssertionError(shape); } } }
Figure
Shape
// 코드 23-2 태그 달린 클래스를 클래스 계층구조로 변환 (144쪽) 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; } }
아이템 23. 태그 달린 클래스보다는 클래스 계층 구조를 활용하라
태그 달린 클래스란 클래스가 가지고 있는 필드중에 일부가 클래스의 구체적인 타입을 나타내는 경우를 의미함
핵심 정리
Before
Figure
클래스는Shape
enum 을 필드로 들고 있어, RECTANGLE 또는 CIRCLE 을 나타내게 된다.After