DAY 6
오늘 읽은 범위 : 6장, 객체와 자료 구조
변수를 private로 정의하는 이유가 있다. 남들이 변수에 의존하지 않게 만 들고 싶어서다. 충동이든 변덕이든, 변수 타입이나 구현을 맘대로 바꾸고 싶어 서다. 그렇다면 어째서 수많은 프로그래머가 get 함수와 set 함수를 당연 하게 public해 비공개 변수를 외부에 노출할까?
// 목록 6-3 구체적인 Vehicle 클래스
public interface Vehicle {
double getFuelTankCapacityInGallons();
double getGallonsOfGasoline();
}
// 목록 6-4 추상적인 Vehicle 클래스
public interface Vehicle {
double getPercentFuelRemaining();
}
목록 6-3과 목록 6-4에서는 목록 6-4가 더 좋다. 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. 인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다. 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. 아무 생각 없이 조회/설정 함수를 추가하는 방법이 가장 나쁘다.
객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기는 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다. 자료 구조는 별다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다.
(어떤) 시스템을 구현할 때, 새로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다. 다른 경우로 새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다. 우수한 소프트웨어 개발자는 편견 없이 이 사실을 이해해 직면한 문제에 최적인 해결책을 선택한다.
이번 장을 통하여 내가 더러운 코드를 작성하고 있었구나 생각이 들었다.
객체 지향 코드를 잘 설계하기 위하여 최적인 해결책을 끊임없이 생각하고 고치자.