자료 추상화
아래 두 클래스는 모두 2차원 점을 표현한다.
차이점은 한 클래스는 구현을 외부로 노출하고 다른 클래스는 구현을 완전히 숨겼다.
//6-1) 구체적인 Point 클래스
public class Point{
public double x;
public double y;
}
//6-2) 추상적인 Point 클래스
public interface Point{
double getX();
double getY();
void setCartesian(double x, double y);
double getR();
double getTheta();
void setPolar(double r, double theta);
}
6-2 코드는 어떤 좌표계를 사용하는지 알 길이 없지만 인터페이스는 자료 구조를 명백하게 표현한다.
사실 6-2는 자료 구조 이상을 표현한다.
클래스 메소드가 접근 정책을 강제한다.
좌표를 읽을 때는 각 값을 개별적으로 읽어야 한다. 하지만 좌표를 설정할 때는 두 값을 한꺼번에 설정해야 한다.
6-1은 명확하게 직교좌표계를 사용하는 것을 명백하게 알 수 있다. 또한 개별적으로 좌표값을 읽고 설정하게 강제한다.
구현도 노출하고 있다. 변수를 private으로 선언하더라고 get/set을 제공하게 되면 구현을 노출하는 것과 같다.
구현을 감추려면 추상화가 필요하다.
그저 조회 함수와 설정 함수로 변수를 다룬다고 클래스가 되지는 않는다.
그보다는 추상 인터페이스를 제공하여 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 의미 있는 클래스이다.
아래 6-3과 6-4 코드를 살펴보자.
6-3에서는 자동차 연료 상태를 구체적인 숫자 값으로 알려주고, 두 함수가 변수값을 읽어 반환한다는 걸 알 수 있다.
6-4에서는 자동차 연료 상태를 백분율이라는 추상적인 개념으로 알려주고, 정보가 어디서 들어오는지 전려 드러나지 않는다.
//6-3) 구체적인 Vehicle 클래스
public class Vehicle{
double getFuelTankCapacityInGallons();
double getGallonsOfGasoline();
}
//6-4) 추상적인 Vehicle 클래스
public interface Vehicle{
double getPercentFuelRemaining;
}
자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다.
인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다.
개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 고민해야 한다.
'클린 코드' 카테고리의 다른 글
[클린 코드] 객체와 자료구조(3) (0) | 2022.01.26 |
---|---|
[클린 코드] 객체와 자료구조(2) (0) | 2022.01.26 |
[클린 코드] 형식 맞추기(2) (0) | 2022.01.17 |
[클린 코드] 형식 맞추기(1) (0) | 2022.01.11 |
[클린 코드] 주석(2) (0) | 2022.01.05 |