작성자: 프람
작성일시: 2024_05_03
안녕하세요~. 프람입니다⛴️ 이번 주 이것 저것 한다고 많이들 바쁘셨죠? 그래도 어김없이 돌아오는 불금입니다.
일주일의 마무리를 이펙티브 자바를 함께 공부해보며 마무리해봅시다.💪💪💪
그럼 본격적으로 태그 달린 클래스보다는 클래스 계층구조를 활용하라
에 대해 알아봅시다.
글을 읽다가 태그란 무엇을 일까?? 라고 생각을 해봤는데요.
아마 아래 어학사전에서 설명하는 사전적 의미가 아닐까 생각이 듭니다.
혹시, 정확한 뜻을 아신다면, 말씀해주세요~
네이버 어학사전피셜
: (어떤 표시를 하기 위해 붙인) 꼬리표
그렇다면, 같이 예제를 보고 태그 달린 클래스를 확인해봅시다.
class Figure {
enum Shape { RECTANGLE, CIRCLE }
// 태그 필드
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) {
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:
}
}
}
우리 친구들~~ 이 코드만 봐도 토가 쏠리지 않나요? 🤮 어떤 문제점들이 있는지 하나씩 짚어보아요🤗
특히, 위 코드는 객체지향의 꽃인 OCP
를 위반하고 있어 매우 매우 불편한데요.
FIGURE에 Shape이 추가될 때마다 불필요한 인스턴스 변수 추가, 생성자 추가 그리고 area메서드의 switch문에 넓이 구현 로직이 추가 되어야한다는 것이죠.
이렇게 된다면 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.lenght = length;
this.width = width;
}
@Override
double area() { return length * width }
}
위 코드와 같이 상속을 사용해서 계층 구조를 만들어 확장하는 방식을 책에서는 소개하고 있다.
이렇게 된다면, 태그를 사용한 클래스의 문제점인 확장이 닫힌 문제점을 해결하고 각 클래스에서 쓸데 없는 코드도 없어진 모습을 볼 수 있다.
클래스의 적절한 분리(확장, 구현)를 통해 유지보수성을 증가 시켜주자.