객체지향 추상화를 설명할 때

기존에 제가 이해하고 설명했던 추상화의 정의는 아직 프로그래밍의 첫 글자도 모르는 친구에게 설명하기에는 어려움이 있었습니다.

사물이나 대상을 어떤 성질이나 공통점, 기능적 측면으로 그것을 추출해서 파악하는 것

또는

핵심적인 개념 또는 기능을 간추려 내는 것

또는

불필요한 정보는 숨기고 중요한 정보만 표현하는 것

이런 식으로 설명할 수 있었는데 쉽게 와닿지가 않았나 봅니다.

계속해서 설명하려 하다 보니 이런 접근이 용이하다는 것을 깨달았습니다.

문제 해결을 위한 관점으로 대상을 바라보는 것이다. 추상화는 관점으로 바라보기이다.

안타깝게도 요즘 시대는 관점의 의미를 모르는 젊은 친구들도 꽤 있습니다. 이어서 이런 예를 소개 합니다.

`자동차`는
운전자의 관점에서 운전할 대상이고
탑승자에게는 이동 수단이고
주유소 직원에게는 연료를 주입해야 하는 대상이고
수리기사에게는 고쳐야 할 대상이다.

이것이 대상을 바라보는 다양한 관점이고, 추상화는 그러한 관점으로 대상을 바라보는 행위 이다. 이런 식으로 설명을 합니다.

여러분에게는 어떻게 느껴지세요?

7 Likes

조금 더 부연 설명하자면 위의 예시는 수평적 추상화로 인터페이스에 해당합니다.

추상 클래스로 접근하자면 수직적 추상화로 일반화의 개념과 유사하다. 라고 설명할 수 있을 것 같습니다.

2 Likes

관점, 일면과 같은 단어들을 통해 있는 그대로의 의미를 함축적으로 표현 가능하다고 생각합니다. 수직적 추상화도 마찬가지라고 생각해요. 수직적 상하관계가 있다 해도 각각이 다른 관점인 건 맞으니까요.

3 Likes

저는 추상화를 팩토리 패턴 외에는 사용하지 않기 때문에 오브젝트 팩토리로 설명합니다.
자동차 추상 클래스는 derived class 소형, 중형, 트럭, 버스로 파생

3 Likes

객체는 그 객체가 나타내는 사물이 가지는 속성과 행위(이하 속성)의 집합으로 표현합니다.

이 집합의 멤버가 되는 속성을 선택할 때 적용되는 원칙이 "추상화"입니다.

사물이 가지는 속성들을 가급적 많이 쓸어 담지 말고, “필요한 만큼만 최소로” 하라는 의미로, 중요한 맥점은 모두 표현하신 것 같습니다.

예를 들어, 프로그램에서 "사람"을 정의할 때, 세포 갯수, 눈 갯수, 코 갯수 등, 프로그램 내에서 쓰지도 않을 "속성"들을 다 때려 넣지 말고, { 이름, 태어난날, 성별} 정도로 프로그램 목적 상 필요한 것들만 간추려 담으라는 의미입니다.

아무런 의도 없이 모아진 것들은 "집합(set)"이라고 부르는 반면, 의도적으로 모아 놓은 것들은 "모듬(class)"이라고 부릅니다.

속성의 집합은 사물을 나타내기 위한 의도로 모아 놓은 것이기 때문에, 집합이 아닌 "모듬"입니다.

그래서, 모든 객체 지향 언어는 객체를 정의할 때, 모듬(class)이라고 표현하는 것이고, 그 모듬의 이름을 통해 무엇을 추상화하는지를 나타냅니다.

추상화, 간략화, 모델링 모두 같은 의미로, 모듬의 크기와 직접적 관련이 있습니다.

여기에 상속이라는 원칙은 이러한 속성들을 하나의 모듬에 다 때려 담지 말고, 수직적 계층 체계로 분류해서 나눠 담으라는 의미입니다.

그런데, 이 추상화는 추상클래스와 인터페이스를 지칭하는 "추상"과는 다른 의미입니다.
이 추상은 “정의의 실체가 없는” 이라는 뜻입니다.

모듬의 멤버는 "실체적"이어야 합니다.
예를 들어, 아래와 같이 미완성된 멤버를 담으면, 실체가 없는 것은 안된다고 컴파일러가 성질을 냅니다.

class Person
{
     public Voice Speak() {    }
}

모듬은 때로는 실체가 없는 멤버를 담을 필요도 있고, 실체 없는 것들만 담을 수 있는 모듬도 필요합니다.
abstract 는 전자, 후자인 경우 사용하는 것이고, interface는 후자를 위한 것입니다.

이 수단을 통해 정의된 객체를 “추상 객체” 라고 부릅니다.

abstract class Person
{
     public abstract Voice Speak();
}

interface ISpeakable
{
    public Voice Speak();
}

이렇게 미확정 의도를 명시적으로 표현하면, 컴파일러는 더 이상 문제 삼지 않습니다.

4 Likes

그게 가능한가요
컴포지트 패턴 같은 경우에는 함수 포인터 배열과 void 포인터를 쓰시는 건가요

1 Like

[unity] 디자인 패턴 : 팩토리 패턴(Factory Pattern) (tistory.com)
그냥 흔히 쓰는 팩토리 패턴입니다.

2 Likes

@dimohy 아주아주 와닿습니다…

1 Like