객체지향의 사실과 오해

[객체지향의 사실과 오해] 3. 타입과 추상화

jny0 2023. 8. 3. 00:28

 

 

객체지향의 사실과 오해 | 조영호 - 교보문고

객체지향의 사실과 오해 | 객체지향에 대한 선입견을 버려라!『객체지향의 사실과 오해』는 객체지향이란 무엇인가라는 원론적면서도 다소 위험한 질문에 답하기 위해 쓰여진 책이다. 안타깝

product.kyobobook.co.kr

 

추상화를 통한 복잡성 극복


지하철 노선도의 변화 : 얼마나 사실적으로 지형을 묘사했느냐 → 역과 역사이의 연결성을 얼마나 직관적으로 표현했느냐

진정한 의미에서 추상화란, 지하철 노선도처럼 불필요한 부분을 도려내면서 복잡한 부분을 단순화시켜 사물의 본질을 드러나게 하는 과정이다.

 

추상화

어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.

  • 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만드는 것이다.
  • 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것이다.

 

 

객체지향과 추상화


앨리스는 하트여왕, 신하들, 공주와 왕자들을 모두 ‘트럼프’라고 지칭하고 있다.

왜? → 그들의 차이점은 무시한 채 트럼프라는 유사성을 기반으로 추상화해서 바라보기 때문

결과적으로 앨리스는 인물을을 두 개의 그룹으로 나누었다 : 트럼프와 토끼

추상화하여 정원을 바라본 것은 정원에 내제된 복잡성을 효과적으로 감소시켰다.

 

개념

앨리스가 인물들의 차이점을 무시하고 공통점만을 취해 단순화한 것은 추상화의 일종이다.

  • 개념 : 공통점을 기반으로 객체들을 묶기 위한 그릇
    • 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념
  • 개념을 이용하면 객체를 여러 그룹으로 분류할 수 있다
  • 인스턴스 : 객체가 어떤 개념 그룹의 일원이 될 때
💡 객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다.
    개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다.

 

객체의 세 가지 관점

  • 심볼(symbol)
    • 개념을 가리키는 간략한 이름이나 명칭
    • 앨리스에서 트럼프
  • 내연(intension)
    • 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할수 있다.
    • 앨리스 - 몸이 납작하고 두손과 두발이 네모난 몸 모서리에 달려 있다는 트럼프에 대한 설명
  • 외연(extension)
    • 개념에 속하는 모든 객체의 집합(set) / 개념의 인스턴스들의 집합
    • 앨리스 - 정원사, 병사, 신하, 왕자와 공주, 하트 왕과 하트 여왕 등

 

💡 분류란 객체에 특정한 개념을 적용하는 작업이다.
    객체에 특정한 개념을 적용하기로 결심했을 때 우리는 그 객체를 특정한 집합의 멤버로 분류하고 있는 것이다.

적절하게 분류된 앱은 유지보수가 용이하고 변경에 유연하게 대처할 수 있다.

결국 분류는 추상화를 위한 도구이다.

 

 

타입


타입은 개념이다

  • 타입은 개념을 대체할 수 있는 세련된 용어이다. but 기계적인 의미를 가짐

 

데이터 타입

타입 시스템의 목적은 데이터가 잘못 사용되지 않도록 제약사항을 부과하는 것이다.

메모리 안에 저장된 0과 1에 대해 수행 가능한 작업과 불가능한 작업을 구분 → 잘못 사용 방지

  • 어떤 데이터에 어떤 연산자를 적용할 수 있느냐가 그 데이터의 타입을 결정한다
  • 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부로부터 철저하게 감춰진다
    • 단지 해당 데이터 타입에 적용할 수 있는 연산자만 알면 됨

 

객체와 타입

객체를 타입에 따라 분류하고 그 타입에 이름을 붙이는 것은 결국 프로그램에서 사용할 새로운 데이터 타입을 선언하는 것과 같다.

  • 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
  • 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.

 

 

행동이 우선이다

객체가 어떤 행동을 하느냐에 따라 객체의 타입이 결정된다. 객체의 타입은 객체의 내부 표현과는 아무런 상관이 없다.

  • 즉, 객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 동일한 타입에 속한다.
  • 다형성 : 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력
    • 다형적인 객체들은 동일한 타입에 속한다.
  • 책임-주도 설계 : 객체가 외부에 제공해야 하는 책임을 먼저 결정하고, 그 책임을 수행하는 데 적합한 데이터를 나중에 결정한 후, 데이터를 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 캡슐화해야 한다.

 

 

타입의 계층


트럼프 하위에 트럼프 인간 → 트럼프 인간을 포함하는 개념 사이의 관계 = 일반화/특수화 관계

 

일반화/특수화 관계

  • 일반화/특수화 관계를 결정하는 것은 행동이다
  • 일반적인 타입은 특수한 타입보다 더 적은 수의 행동을 가지고 특수한 타입은 더 많은 수의 행동을 가진다.
  • 단, 특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행할 수 있어야 한다.
  • 내연을 의미하는 행동의 가짓수와 외연을 의미하는 집합의 크기는 서로 반대이다.
    • 행동의 수 : 일반<특수
    • 집합의 크기 : 일반>특수

 

슈퍼타입과 서브타입

  • 일반적인 타입을 슈퍼타입, 특수한 타입을 서브타입이라고 부른다.
  • 서브타입은 슈퍼타입의 모든 행동을 수행할 수 있으므로 서브타입은 슈퍼타입을 대체할 수 있어야한다.

 

 

 

정적모델


타입의 목적

타입을 사용하는 이유는 인간의 인지 능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기 어렵기 때문이다.

  • 타입은 시간에 따라 동적으로 변하는 상태를 정적인 모습으로 다룰 수 있게 해준다,
  • 즉 복잡성을 부과하는 요소를 제거함
💡 결국 타입은 추상화

 

동적 모델과 정적 모델

  • 스냅샷 : 객체 다이어그램. 객체가 특정 시점에서 구체적으로 어떤 상태를 가지느냐
  • 동적 모델 : 스냅샷처럼 객체가 살아 움직이는 동안에 상태의 변화, 행동을 포착하는 것
  • 정적 모델 : 타입 모델. 객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현한 것

 

클래스

객체지향 프로그래밍 언어에서 정적인 모델은 클래스를 이용해 구현된다. 따라서 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것이다. 클래스는 타입을 구현할 수 있는 메커니즘일 뿐이지 타입이 아니다.

💡 객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.
    객체지향에서 중요한 것은 동적으로 변하는 객체의 ‘상태’와 상태를 변경하는 ‘행위’이다.