티스토리 뷰
728x90
반응형
태그 달린 클래스보다는 클래스 계층구조를 활용하라
- 태그 달린 클래스란, 두 가지 이상의 의미를 표현할 수 있으며 현재 표현하는 의미를 태그 값으로 알려주는 클래스입니다.
🧨 예제 코드
- Figure 클래스는 원(Circle)과 사각형(Rectangle)을 나타내는 클래스이고, 하나의 클래스에서 두 타입에 대응이 가능합니다.
- area 메서드는 타입별로 맞는 크기를 계산해 반환하기에 편해보일 수 있습니다.
public class Figure {
enum Shape {
RECTANGLE, CIRCLE
}
// 공통 필드
final Shape shape;
double length;
double width;
double radius;
public Figure(double radius) {
this.shape = Shape.CIRCLE;
this.radius = radius;
}
public Figure(double length, double width) {
this.shape = Shape.RECTANGLE;
this.length = length;
this.width = width;
}
double area() {
switch (this.shape) {
case RECTANGLE:
return length * width;
case CIRCLE:
return Math.PI * (radius * radius);
default:
throw new AssertionError(shape);
}
}
}
🧨 단점
- 하나의 클래스에서 Enum, 태그 필드, switch문 등 부가적인 코드들이 많습니다.
- 부가적인 코드들이 많기 때문에 가독성이 떨어지게 됩니다.
- 하나의 타입으로 정해지면 그외에 타입을 위한 모든 코드는 불필요해지며, 메모리 낭비가 됩니다.
- 필드가 final인 경우 항상 초기화를 해줘야합니다.
- 새로운 타입이 추가될 때마다 분기가 필요한 모든 메서드에서 새로운 타입에 대응하는 코드를 작성해야 합니다.(switch)
💡 해결책
- 계층 구조의 루트 추상 클래스를 선언한 뒤, 태그에 따라 동작이 달라지는 추상 메서드를 선언합니다.
- 태그값에 상관없이 동일한 동작을 하는 메서드를 루트 클래스에 일반 메서드로 추가합니다.(area 메서드)
- 루트 클래스를 확장한 구체 클래스를 의미별로 만듭니다.
- 루트 클래스의 추상 메서드를 구체 클래스에서 의미별로 구현합니다.
public abstract class AbstractFigure {
abstract double area();
}
public class Circle extends AbstractFigure {
final double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
double area() {
return Math.PI * (radius * radius);
}
}
public class Rectangle extends AbstractFigure {
final double length;
final double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
double area() {
return length * width;
}
}
728x90
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - Item26. 로 타입은 사용하지 말라. (0) | 2022.07.17 |
---|---|
이펙티브 자바 - Item24. 멤버 클래스는 되도록 static으로 만들라. (0) | 2022.07.16 |
이펙티브 자바 - Item22. 인터페이스는 타입을 정의하는 용도로만 사용하라. (0) | 2022.07.16 |
이펙티브 자바 - Item21. 인터페이스는 구현하는 쪽을 생각해 설계하라. (0) | 2022.07.16 |
이펙티브 자바 - Item20. 추상 클래스보다는 인터페이스를 우선하라 (0) | 2022.07.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- pipeline architecture
- spring boot poi excel download
- space based architecture
- JDK Dynamic Proxy와 CGLIB의 차이
- redis sorted set
- spring boot excel download paging
- spring boot redisson sorted set
- spring boot redis 대기열 구현
- spring boot 엑셀 다운로드
- java ThreadLocal
- redis sorted set으로 대기열 구현
- polling publisher spring boot
- 레이어드 아키텍처란
- 자바 백엔드 개발자 추천 도서
- redis 대기열 구현
- 공간 기반 아키텍처
- 서비스 기반 아키텍처
- 람다 표현식
- service based architecture
- spring boot redisson destributed lock
- transactional outbox pattern
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- java userThread와 DaemonThread
- spring boot excel download oom
- pipe and filter architecture
- microkernel architecture
- spring boot redisson 분산락 구현
- transactional outbox pattern spring boot
- @ControllerAdvice
- 트랜잭셔널 아웃박스 패턴 스프링부트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함