본문 바로가기
독서

객체지향의 사실과 오해 - 3장 타입과 추상화

by tempus 2022. 4. 27.
반응형

아래 내용은 조영호 님의 "객체지향의 사실과 오해"를 읽고 공부한 내용을 개인적으로 정리하였습니다.

 

3장. 타입과 추상화

📕 추상화

현실은 복잡하고 혼돈의 덩어리이다. 이를 이해하기 위해 인간이 지니고 있는 인지 능력과 저장공간이 너무나 보잘것이 없다. 그래서 이를 해결하기 위해 인간은 본능적으로 이해하기 쉽고 예측 가능한 수준으로 현실을 분해하고 단순화하는 전략을 따른다.

 

즉, 추상화란? 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하여 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위한 것

 

그렇다고 무분별하게 불필요한 부분을 제거하면 안된다. 중요한 것은 하려는 목적에 부합하게 불필요한 것을 제거해야 한다.

 

추상화는 2가치 차원에서 이루어진다.

 

① 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순화하기 (예, 트럼프 카드)

② 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거해서 단순화 하기 (예, 지하철 노선도)

 

다시 한번 강조하면 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점!

 

 

이번에는 객체지향 패러다임의 관점에서 추상화를 보자~

 

객체지향 패러다임에서 객체를 다음과 같이 정의할 수 있다.

명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물

 

객체들은 다양하고 그 수는 무궁무진하기 때문에 우리는 이를 쉽게 이해할 수 있게 추상화할 필요가 있다. 이때 사용되는 것이 개념이다. 개념은 공통점을 기반으로 객체들을 묶기 위한 그릇을 의미한다.

 

그리고 우리는 개념을 통해 객체들을 여러 그룹으로 분류 할 수 있다. 결국 객체는 특정한 개념을 표현하는 그룹의 일원으로 포함된다. ⇒ 개념 그룹의 일원이 될 때 그 객체를 그 개념의 인스턴스라고 한다. (개념이 객체에 적용되었을 때)

 

그리고 이러한 개념을 구성하는 3 가지 관점이 있다.

  • 심볼 : 개념을 가리키는 간략한 이름이나 명칭
  • 내연 : 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인
  • 외연 : 개념에 속하는 모든 객체의 집합

 

다음은 책에 나온 예시로 해당 단어들을 대입해 보았다.

심볼 ⇒ 개념을 가르키는 이름(예 - 트럼프)

내연 ⇒ 개념의 의미 (예 - 몸이 납작하고 두 손과 두 발은 네모 귀퉁이에 달려 있는 등장인물 )

외연 ⇒ 개념에 속하는 객체들, 객체의 인스턴스들이 모여 이뤄진 집합 (스페이드, 하트, 클로버, 다이아)

 

정리하면 우리는 개념을 이용해 객체를 분류할 수 있고 분류하는 차원 위의 2가지 차원을 통해 할 수 있다.

 

📕 타입

공학자들은 개념을 대체할 수 있는 좀 더 세련돼 보이는 용어를 수학으로부터 차용해왔다. 그것이 타입이다.

⇒ 타입은 공통점을 기반으로 객체들을 묶기 위한 틀!

 

👉 데이터 타입

실제 메모리 안에는 0과 1의 행렬만이 존재한다. 이는 어떤 값을 의미하는지 알기 어렵다. 그래서 사람들은 자신이 다뤄야 하는 데이터의 용도와 해동에 따라 그것을 분류하였다.

 

그리하여 타입 시스템이 만들어지기 시작했다. 타입 시스템의 목적은 데이터가 잘못 사용되지 않도록 제약사항을 부과하는 것이다.

 

타입에 관한 2가지 사실이 있다.

① 타입은 데이터가 어떻게 사용되느냐에 관한 것이다.

② 타입에 속한 데이터를 메모리에 어떻게 표현하는지 외부로부터 철저하게 감춰진다.

 

👉 객체 타입

이번에는 데이터에서 타입이 아닌 객체에서 타입은 무엇인가? 실제로 우리는 객체를 일종의 데이터처럼 사용하는데 사실 객체는 데이터가 아니다. 실질적으로 객체에서 타입을 나누는 기준은 행동이 된다.

 

그리고 객체에서 타입은 다음과 같은 특성이 있다.

① 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.

② 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.

 

위에 따라서 객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다. (이로 인해 객체지향 패러다임에서는 캡슐화, 다형성이라는 개념이 있다.)

결론적으로 객체의 타입을 결정하는 것은 객체의 행동이다.

 

👉 일반화/특수화 관계 (슈퍼 타입과 서브타입)

 

객체 지향에서 일반화/특수화 관계를 결정하는 것은 객체의 상태를 표현하는 데이터가 아닌 행동이라는 것이다. 행동의 관점에서 특수한 타입은 일반적인 타입이 가진 모든 타입을 포함하지만 거기에 더해 자신만의 행동을 추가하는 타입을 말한다.

 

슈퍼 타입 = 일반 타입

서브 타입 = 특수한 타입

 

특수한 타입은 일반적인 타입보다 더 많은 수의 행동을 가지지만 더 적은 크기의 외연 집합을 가진다.

(예 : 슈퍼 타입 - 자동차 , 서브 타입 - BMW 자동차, 기아 자동차, 테슬라 자동차)

 

우리는 흔히 이러한 관계를 상속이라고 말한다.

 

👉 정적모델과 동적 모델

왜 타입을 사용해야 하는가?

A : 인간의 인지 능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기 너무 어렵기 때문에~~!!!

 

타입은 시간에 따라 동적으로 변하는 객체의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 해 준다. 즉, 타입은 추상화다. 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다.

 

  • 스냅샷 : 객체의 특정 시점에 구체적으로 어떤 상태를 가지느냐
  • 동적모델 : 실제로 객체가 살아 움직이는 동안 상태가 어떻게 변하고 행동하는지는 포착하는 모델
  • 정적 모델 : 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 모델

 

우리는 객체지향 애플리케이션을 설계하고 구현하기 위해서는 객체 관점의 동적 모델과 객체를 추상화한 타입 관점의 정적 모델을 적절히 혼용해야 한다.

 

정적인 관점 : 클래스를 작성하는 것

동적인 관점 : 실제로 앱을 실행해 객체의 상태 변경을 추적하고 디버깅하는 것

 

👉 클래스

타입을 구현하는 가장 보편적인 방법 중 하나다. 즉, 클래스와 타입은 동일한 것이 아니다.

클래스는 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나라고 생각하면 된다.

 

 

📕 정리

  • 객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.
  • 타입을 구현할 수 있는 한 가지 방법이 클래스

 

반응형

댓글


loading