Study/Effective-Java
[item#23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라
hongeeii
2023. 11. 30. 10:42
728x90
반응형
태그 달린 클래스보다는 클래스 계층구조를 활용하라.
태글 달린 클래스란, 해당 클래스가 어떠한 타입인지에 대한 정보를 담고 있는 멤버 변수인 태그를 이용하여 구현되는 클래스. (두 가지 이상의 의미를 표현할 수 있는 클래스. 두 가지 이상의 의미를 가지고 있기 때문에 생성자도 따로 필드들도 따로 구현되어야 한다.)
태그란?
- 클래스가 어떠한 타입인지에 대한 정보를 담고 있는 멤버 변수(필드)를 의미한다.
하지만 태그 달린 클래스는 많은 단점을 가지고 있다.
- 쓸데없는 코드가 많다.
- 가독성이 나쁘다.
- 메모리도 많이 사용한다.
- 필드를 final로 선언하려면 불필요한 필드까지 초기화해야 한다.
- 인스턴스 타입만으로는 현재 나타내는 의미를 알 길이 없다.
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
반응형