Skip to content

Latest commit

 

History

History
201 lines (108 loc) · 9.14 KB

File metadata and controls

201 lines (108 loc) · 9.14 KB

타입과 추상화

지하철 노선도

  • ‘정확성’을 버리고 ‘목적’에 집중한 결과

승객이 꼭 알아야하는 사실만 정확하게 표현하고 몰라도 되는 정보는 무시함으로써 이해하기 쉽고 단순하며 목적에 부합하는 지하철 노선도를 창조해 낼 수 있었다.


추상화를 통한 복잡성 극복

현실은 복잡성의 총체이다. 이 현실을 이해하기 위해서 분해하고 단순화하는 전략을 따른다.

추상화는 아래의 두가지 차원에서 진행된다.

  1. 공통점은 취하고 차이점을 버리는 일반화
  2. 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거하는 단순화
📌 추상화의 목적은 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이다.

‘트럼프’라는 공통점을 통해 묶이지만 각각을 쉽게 구분할 수 있다.

이처럼 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서는 객체라고한다.

이렇게 각각을 구분할 수 있으나, 공통적으로 일반적인 외형과 행동방식을 지니고 있기 때문에 ‘트럼프’라고 말할 수 있는 것이다.

‘기껏해야 트럼프에 불과해!’

인물들의 차이점을 무시하고 공통점만을 강조함으로써 트럼프라는 개념으로 단순화하는 것은 추상화의 일종이다.

이처럼 공통점을 기반으로 객체들을 묶기 위한 그릇을 ‘개념’ 이라고 한다.

📌 개념이란 일반적으로 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 뜻한다.

이 ‘개념’을 이용하면 객체를 여러 그룹으로 ‘분류’할 수 있다.

객체에 어떤 개념을 적용하여 개념 그룹의 일원이 될 때, 이 객체를 그 개념의 ‘인스턴스’라고 한다.

객체 → 개념 → 분류 → 개념의 인스턴스

개념은 객체의 분류장치이다. 이 때, 세 가지 관점을 이야기한다.

  1. 심볼 - 개념을 가리키는 간략한 이름 / 명칭 (이름)
  2. 내연 - 개념의 정의, 이 내연을 통해 객체가 개념에 속하는가를 판단할 수 있다. (기준)
  3. 외연 - 개념에 속하는 모든 객체의 집합 (집합)

예를 들어 트럼프

  1. 심볼 - 트럼프
  2. 내연 - 납작하고 두손과 두발이 귀퉁이에 달려있는 등장인물
  3. 외연 - 등등..

외연의 입장에서 객체를 개념에 적용한다는 것은 이 객체를 객체 집합에 포함시킨다는 것을 의미한다.

이렇게 ‘분류’하는 것은 추상화의 두가지 차원을 모두 사용한다.

  1. 공통점은 취하고 차이점을 버리는 일반화

    → 개별 객체 간의 차이를 배제하고 공통점만을 취하여 ‘트럼프’로 포함시켰다.

  2. 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거하는 단순화

    → 내연이 납작하고 두손과 두발이 모서리에 달려있다는 기준만을 생각하고 이외의 사항들은 무시하였다.


타입은 개념이다.

타입은 개념과 동일하지만, 컴퓨터 내부로 들어오는 순간 좀 더 기계적인 의미로 윤색될 수 밖에 없다.

메모리 세상에서는 ‘타입’이라는 질서가 존재하지 않는다. 하지만 데이터를 어떻게 사용되느냐를 구분하기 위해서 ‘타입’이 생겨나게 되었다.

  1. 타입은 데이터가 어떻게 사용되는가에 관한 것이다.

    실제로 타입이 생겨난 이유는 데이터를 어떻게 사용할 것(숫자로, 문자로 등등)인가를 결정하기 위해서이다.

    → 연산자의 종류가 아니라 어떤 데이터에 어떤 연산자를 적용할 수 있느냐가 그 데이터의 타입을 결정한다.

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

    연산자만 알고 있으면 타입을 사용할 수 있다.


객체와 타입

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

  • 하지만 데이터는 아니다.
    • 객체는 행위에 따라 변할 수 있는 상태를 가지고 있다.
    • 객체에 중요한 것은 객체의 행동이다.
  1. 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.
  2. 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.

행동이 우선이다

객체의 내부 표현 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다.

  • 다른 두 객체를 동일한 타입으로 분류하는 기준은 “**동일한 행동을 하는가”**이다.
  • 즉, 같은 타입에 속한 객체는 행동만 동일하다면 서로 다른 데이터를 가질 수 있다.

동일한 행동이란 동일한 책임을 의미하며, 동일한 책임이란 동일한 메시지 수신을 의미한다.

  • 내부의 데이터 표현 방식이 다르더라도 동일한 메시지를 수신할 수 있어야한다. 즉, 메시지를 처리하는 방식은 객체마다 달라질 수 있다. → ‘다형성’
📌 다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력
  • 이렇게 데이터 내부 표현 방식과 무관하게 행동만이 고려 대상이라는 사실은 외부에 데이터를 감춰야한다는 것을 의미한다. → ‘캡슐화’

책임 주도 설계

  1. 객체가 외부에 제공해야할 책임을 결정
  2. 책임에 적합한 데이터 결정
  3. 데이터를 외부 인터페이스 뒤로 캡슐화

타입의 계층

‘트럼프 카드’와 ‘트럼프 인간’의 차이는 무엇인가?

  • 행동에 집중해야한다.
    • 트럼프 카드 → ‘납작 엎드리고 뒤집어질 수 있다’
    • 트럼프 인간 → ‘납작 엎드리고 뒤집어질 수 있다’ + ‘걸을 때마다 몸이 좌우로 펄럭일 수 있다’

즉, ‘트럼프 카드’ 타입의 외연에 ‘트럼프 인간’ 타입의 외연이 포함된다.

‘트럼프’는 ‘트럼프 인간’을 포괄하는 좀 더 일반적인 개념이다. ‘트럼프 인간’은 좀 더 특화된 행동을 하는 특수한 개념이다. 두 타입의 관계를 ‘일반화/특수화’ 관계이다

📌 일반화/특수화 관계를 결정하는 것은 객체의 상태를 표현하는 데이터가 아니라 행동이라는 것이다.

일반적인 타입은 특수한 타입보다 더 적은 수의 행동을 가진다.

  • 일반적인 타입은 특수한 타입이 가진 행동 중에서 일부만 가진다.
  • 특수한 타입은 일반적인 타입의 모든 행동을 포함하지만, 추가적인 행동이 존재한다.

일반적인 타입은 특수한 타입보다 외연이 더 크다.


슈퍼타입/서브타입

일반적인 타입이 ‘슈퍼타입’ 특수한 타입이 ‘서브타입’이다.

어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족시켜야 한다. 즉, 서브타입은 슈퍼타입을 대체할 수 있어야 한다.

  • 서브타입은 슈퍼타입의 행위에 추가적으로 특수한 자신만의 행동을 추가하는 것이다.

일반화는 추상화를 위한 도구이다.

중요한 부분을 강조하기 위해 불필요한 세부사항을 제거하는 단순화를 통해 일반화/특수화 계층을 만들었다.

  • 트럼프 인간 → 트럼프 계층을 분리한 것은 ‘걸어다니는 행동’을 제거함으로써 가능했다.
  • 이 계층의 차이는 행동의 차이이다.
📌 트럼프 인간을 좀 더 단순한 관점에서 바라보기 위해 불필요한 특성을 배제하고 좀 더 포괄적인 의미를 지닌 트럼프로 일반화 했다.

타입의 목적

객체지향은 객체를 다루는 것인데, 타입이 필요한 이유는 무엇인가?

타입을 사용하는 이유는 동적으로 변하는 객체의 복잡성을 극복하기 위해서이다.

객체의 상태는 변하지만, 객체를 다른 객체와 구분하는 ‘식별성’은 유지된다.

  • 변화하는 객체의 상태와 무관하게 객체를 정적인 모습으로 다룰 수 있게 한다. 즉, 복잡성을 제거한다.

    → 결국 타입 또한 복잡성을 제거하는 단순화, 즉 추상화이다.


클래스

타입을 구현하는 방법이 ‘클래스’이다.

  • 타입 - 객체를 분류하기 위해 사용하는 ‘개념’
  • 클래스 - 타입을 구현하기 위한 ‘방법’
📌 **객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 ‘객체가 수행하는 행동’이다. 타입을 구현할 수 있는 방법이 ‘클래스’이다.**