1. 클래스란?
연관성이 높고 잘 정의된 기능을 공유하는 데이터와 루틴의 모음
2. 클래스의 토대: 추상 데이터형(Abstract Data Type, ADT)
- ‘추상 데이터형’은 데이터와 데이터를 처리하는 연산의 집합
- 객체지향 프로그래밍을 이해하기 위해서는 반드시 ADT를 이해해야함
2.1. ADT 사용의 장점
- 구현의 세부사항을 감출 수 있다.(은닉화)
- 하나의 변경이 전체에 영향을 미치지 않는다.
-
프로그램이 명백하게 정확해진다.
- ex) currentFont.bold = true 보다 currentFont.setBold() 가 훨씬 의미가 강력하게 전달된다.
-
프로그램의 가독성이 높아진다.
- ex) currentFont.attribute = ‘font-size 16px’ 보다 currentFont.chageSize(16)이 낫다.
2.2. 클래스의 설계와 구현 문제
1. 포함(‘has a’ 관계)
클래스의 멤버 변수(데이터)로 구현한다.
-
최후의 수단으로 비공개 상속을 통해서 ‘has a’를 구현하라
- 책을 읽어도 무슨 말인지 이해가 안가는데, 결국 추천하지 않는 방법임
-
약 7개 이상의 데이터 멤버를 포함하는 클래스를 주의하라
- 더 작은 단위의 클래스들로 나눌 수 있는 가능성이 있다.
- 공통점이 있는 경우, 나눌 수 있으면 한번 더 나누자!
2. 상속(‘is a’ 관계)
‘상속’의 목적은 두 개 이상의 파생 클래스에서 공통으로 사용되는 요소를 갖는 기본 클래스를 정의하여 더 간단한 코드를 작성하는 데 있다.
- 공개 상속을 통해 ‘is a’를 구현해라
-
리스코프 치환의 원칙(LSP)
- 파생 클래스(sub class)가 기본 클래스(최상위 부모 클래스)와 ‘is a’ 관계가 형성되지 않는다면 상속 받으면 안된다.
- 파생 클래스(sub class)의 사용자가 부모클래스와의 차이점을 못 느낀 채 부모 클래스의 인터페이스를 사용할 수 있어야 한다. => 개발자의 상속에 대한 고민도 줄어들게 할 수가 있음