객체는 그 객체가 나타내는 사물이 가지는 속성과 행위(이하 속성)의 집합으로 표현합니다.
이 집합의 멤버가 되는 속성을 선택할 때 적용되는 원칙이 "추상화"입니다.
사물이 가지는 속성들을 가급적 많이 쓸어 담지 말고, “필요한 만큼만 최소로” 하라는 의미로, 중요한 맥점은 모두 표현하신 것 같습니다.
예를 들어, 프로그램에서 "사람"을 정의할 때, 세포 갯수, 눈 갯수, 코 갯수 등, 프로그램 내에서 쓰지도 않을 "속성"들을 다 때려 넣지 말고, { 이름, 태어난날, 성별} 정도로 프로그램 목적 상 필요한 것들만 간추려 담으라는 의미입니다.
아무런 의도 없이 모아진 것들은 "집합(set)"이라고 부르는 반면, 의도적으로 모아 놓은 것들은 "모듬(class)"이라고 부릅니다.
속성의 집합은 사물을 나타내기 위한 의도로 모아 놓은 것이기 때문에, 집합이 아닌 "모듬"입니다.
그래서, 모든 객체 지향 언어는 객체를 정의할 때, 모듬(class)이라고 표현하는 것이고, 그 모듬의 이름을 통해 무엇을 추상화하는지를 나타냅니다.
추상화, 간략화, 모델링 모두 같은 의미로, 모듬의 크기와 직접적 관련이 있습니다.
여기에 상속이라는 원칙은 이러한 속성들을 하나의 모듬에 다 때려 담지 말고, 수직적 계층 체계로 분류해서 나눠 담으라는 의미입니다.
그런데, 이 추상화는 추상클래스와 인터페이스를 지칭하는 "추상"과는 다른 의미입니다.
이 추상은 “정의의 실체가 없는” 이라는 뜻입니다.
모듬의 멤버는 "실체적"이어야 합니다.
예를 들어, 아래와 같이 미완성된 멤버를 담으면, 실체가 없는 것은 안된다고 컴파일러가 성질을 냅니다.
class Person
{
public Voice Speak() { }
}
모듬은 때로는 실체가 없는 멤버를 담을 필요도 있고, 실체 없는 것들만 담을 수 있는 모듬도 필요합니다.
abstract 는 전자, 후자인 경우 사용하는 것이고, interface는 후자를 위한 것입니다.
이 수단을 통해 정의된 객체를 “추상 객체” 라고 부릅니다.
abstract class Person
{
public abstract Voice Speak();
}
interface ISpeakable
{
public Voice Speak();
}
이렇게 미확정 의도를 명시적으로 표현하면, 컴파일러는 더 이상 문제 삼지 않습니다.