6장. 클래스 다루기
목차
- 6.1 클래스의 토대: 추상 데이터형(ADT)
- 6.2 좋은 클래스 인터페이스
- 6.3 설계와 구현에 관한 이슈
- 6.4 클래스를 작성하는 이유
- 6.5 프로그래밍 언어에 특화된 이슈
- 6.6 클래스를 넘어서: 패키지
6.1 클래스의 토대: 추상 데이터형
객체지향 프로그래밍을 이해하기 위해서는 ADT를 반드시 이해해야 한다. ADT를 이해하지 못하고서는 이름만 클래스인 클래스를 작성하게 될 것이다. 그런 클래스는 실제로는 연관성이 높지 않은 데이터와 루틴을 편의를 위해 보관하는 상자와 다를 게 없다.
ADT를 사용하면 구현 세부 사항을 감출 수 있고, 변경이 전체에 영향을 미치지 않게 할 수 있다.
실제 존재하는 객체를 다룰 수 있게 해주기 때문에 ADT는 개발을 하는데 상당한 편의를 가져다 줄 수 있다. 예를 들어 스택을 만들 때, ADT는 add, pop, top, reset 4가지 기능만 보여주도록 해 사용자와 개발자 모두에게 이것만 신경쓸 수 있는 환경을 제공할 수 있다.
6.2 좋은 클래스 인터페이스
// 추상화를 잘 나타낸 클래스 인터페이스를 C++로 작성한 예제
class Emplyee {
public:
Employee();
Employee(
FullName name,
String address,
String workPhone,
String homePhone,
TaxId taxIdNumber,
JobClassification jobClass
);
virtual ~Employee();
// 공개 루틴
FullName GetName() const;
String GetAddress() const;
String getWorkPhone() const;
String GetHomePhone() const;
TaxId getTaxIdNumber() const;
JobClassification GetJobClassification() const;
...
private:
...
};
이 클래스는 외부에 노출된 인터페이스 외에도 내부적인 작업을 처리하기 위해 여러 루틴과 데이터를 가지고 있겠지만, 클래스의 사용자는 그러한 부분에 대해 전혀 알 필요가 없다. 인터페이스에 있는 모든 루틴이 긴밀하게 연관되어 있어서 훌륭한 추상화를 제공하고 있다.
이번 장을 읽으면서 글쓴이가 클래스의 추상화 및 일관성을 유지하는 것을 굉장히 중요하게 생각하고 있다는 것을 느꼈다. 부끄럽지만 지금까지 나는 클래스를 그렇게 중요하게 생각하지 않았다. 그냥 여러개를 모아놓는 도구 정도로 생각해왔다.
이번 6장을 읽은 이후로는 클래스 설계에 주의를 기울여야겠다는 생각이 많이 들었고, 좋은 추상화와 캡슐화를 통해 유지보수가 쉽고 개발이 편리한 설계에 도전하고 싶은 마음이 생겼다.
6.3 설계와 구현 문제
약 7개 이상의 데이터 멤버를 포함하는 클래스를 주의하라. "7 +- 2" 매직 넘버를 항상 기억하고, 이를 적용하라. 만약 클래스가 데이터를 7개 이상 포함하고 있다면 이를 나누는 것이 유익할 것이다.
상속은 굉장히 편리하면서 동시에 많은 문제점을 유발할 수 있는 기능이라는 것을 배웠다.
상속에 대한 규칙
- 다중 클래스가 공통 데이터는 공유하지만 행위를 공유하지 않는다면 그 클래스가 포함할 수 있는 공통 객체를 만든다.
- 다중 클래스가 공통 행위는 공유하지만 데이터를 공유하지 않는다면 공통적인 루틴을 정의한 기본 공통 클래스를 상속받는다.
- 다중 클래스가 공통 데이터와 행위를 공유한다면 공통적인 데이터와 루틴을 정의한 기본 공통 클래스를 상속받는다.
- 인터페이스를 제어하기 위한 기본 클래스가 필요할 때는 상속을 하고 인터페이스를 제어하고 싶다면 포함한다.
6.4 클래스를 작성하는 이유
- 현실 세계의 개체를 모델링한다.
- 추상 객체를 모델링한다.
- 복잡성을 줄인다.
- 복잡성을 고립시킨다.
- 구현 세부사항을 숨긴다.
- 변경의 효과를 제한한다.
- 전역 데이터를 숨긴다.
- 매개변수 전달을 간소화한다.
- 중앙 집중 관리한다.
- 코드 재사용을 돕는다.
- 프로그램 전체를 고려한다.
- 연고나된 기능을 패키지로 구성한다.
- 특정한 리팩터링을 수행한다.
피해야 할 클래스
- 신(God) 클래스를 생성하지 말라.
- 관련이 없는 클래스를 제거하라.
- 동사를 뒤에 붙이는 클래스를 피하라.
6.5 프로그래밍 언어와 관련된 이슈
6.6 클래스를 넘어서: 패키지
이번 장을 읽으면서 느낀점도 많았지만, 동시에 어렵다는 생각이 많이 들었다. 아직 객체 지향에 익숙하지 않은 상태에서 클래스에 관해 공부하는 것은 나에게 조금 버거웠다.
지금 나에게 주어진 과제는
- 객체 지향 프로그래밍에 대해 공부하기
- 설계를 해보기
- 다시 6장을 읽고 적용하기