[Object-Oriented] 3. 타입과 추상화

이성민·2024년 3월 10일
post-thumbnail

서론

과거 런던의 지하철 노선도

현재 런던 지하철 노선도

과거와 현재의 런던 지하철 노선도를 살펴보면, 훨씬 가독성이 좋음

과거의 런던 지하철 노선도는 다른 것들보다 아래 요소들을 보이는데에 집중함

  • 거리
  • 실제 위치

하지만 사람들은 실제 위치나 거리에 생각보다 신경쓰지 않아 현재는 다른 요소들에 집중함

  • 순서
  • 환승 가능 역

즉, 과거에는 목적이 잘못 설정되어 가독성 떨어지고, 사람들이 보기 어려운 노선도를 사용했지만,
현재는 사람들이 노선도를 보는 목적을 제대로 파악하여 간단히 만들었음 → 지하철 노선도를 추상화



추상화를 통한 복잡성 극복

  • 현실에 존재하는 것들을 이해해야 하는데, 그렇다기엔 너무 복잡
    → 이해하기 쉽고 간단한 것으로 현실을 분해하고 단순화 해야 함

  • 추상화란 현실에서 시작하되, 목적에 따라 정말 필요한 요소들만 남겨 본질을 보이게 함

  • 하지만, 추상화도 목적에 맞지 않게 사용한다면, 잘못 사용되는 것

이 책에서 추상화의 정의

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

복잡성을 다루기 위해 추상화는 두 차원에서 이뤄진다.

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

모든 경우에 추상화의 목적은 목잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점을 기억하라.

따라서, 객체지향 패러다임은, `객체`라는 `추상화`를 통해 현실의 복잡성을 극복한다


객체지향과 추상화

모두 트럼프일 뿐

이상한 나라의 앨리스 이야기 중
앨리스가 정원에 입장해 하트 여왕과 다양한 트럼프 병사들,
그리고 하얀 토끼를 만나는 장면에 대한 묘사

앨리스는 마지막에 “기껏해야 트럼프에 불과해. 무서워할 필요 없어” 라고 말함


그룹으로 나누어 단순화하기

앨리스의 그룹화

  • 앨리스는 “기껏해야 트럼프에 불과해. 무서워할 필요 없어” 이라고 말함
    → 다양한 트럼프 병사들을 그저 ‘트럼프 병사’로 그룹화 함
    → 하지만 이 그룹에 ‘하얀 토끼’는 포함되지 않음 / 동일한 특성을 갖고 있지 않기 때문
    명확한 경계를 가져 구별할 수 있는 것들을 객체라고 함

  • 이번 이야기의 등장인물들 중, 정원사, 병사, 신하, 왕자, 공주, 왕, 왕비, 하트 잭 … 등은
    모두 ‘트럼프’와 동일한 외형과 행동 방식을 지니고 있음
    → 위 등장인물들을 모두 트럼프 그룹에 포함시킬 수 있음
    → 하얀 토끼는 트럼프에 속하지 못함
    → 결과적으로 앨리스는 등장인물들으 두 개의 그룹으로 나눔 / 트럼프, 토끼


개념

개념 이란
공통점을 기반으로 객체들을 묶기 위한 그릇
우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념

  • 개념을 이용하면 객체를 여러 그룹으로 분류할 수 있음
    → 개념은 여러 객체의 공통점을 기준으로 객체들을 분류할 수 있는 ‘체’

  • 어떤 객체에 특정 개념을 적용할 수 있게 되어, 해당 개념 그룹에 속하게 될 때
    → 해당 객체를 이 개념의 인스턴스라고 함

객체란, 특정 개념을 적용할 수 있는 구체적인 사물을 의미함
개념이 객체에 적용되었을 때 객체를 개념의 인스턴스라고 함


개념의 세 가지 관점

일반적으로 개념을 객체의 분류 장치로 생각할 때, 세 가지 관점이 있음

  • 심볼: 개념을 가리키는 간략한 이름이나 명칭
    e.g. ‘트럼프’라는 이름
  • 내연: 개념의 완전한 정의를 나타내며, 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있음
    e.g. ‘트럼프’는 ‘몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있음’
  • 외연: 개념에 속하는 모든 객체의 집합
    e.g. ‘정원사’, ‘병사’, ‘신하’, ‘왕자와 공주’, ‘하객’, ‘하트 잭’, ‘하트 왕’, ‘하트 여왕’ 등
개념을 이용해 공통점을 갖는 객체들을 분류할 수 있음 !!!

객체를 분류하기 위한 툴

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

  • 분류가 객체지향의 품질을 결정함
    → 객체를 적절히 분류하면, 유지보수성 증가, 변경에 유연하게 대처 가능
    → 적절한 분류 체계가 객체들 간의 ‘지도’ 역할을 함

분류는 추상화를 위한 도구다

  • 추상화의 두 가지 차원
    → 사물 간의 공통점만 취하고 차이점은 버림
    → 필수적인 부분을 강조하기 위해 불필요한 세부사항은 무시

  • 개념은 구체적인 사물들 간의 공통점을 기반으로 만든 분류 체계
    → 따라서, 추상화의 두 가지 차원 중, 사물 간의 공통점을 취한 것에 해당



타입

타입은 개념이다

  • 개념을 좀 더 컴공스럽게 말한다면 : 타입

타입의 정의

타입은 개념과 동일하다.

따라서 타입이란 우리가 인식하고 있는
다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 의미한다.

어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다.

타입의 인스턴스는 타입을 구성하는 외연인 객체 집합의 일원이 된다.


데이터 타입

타입에 관한 두 가지 조언

  • 타입은 데이터가 어떻게 사용되느냐에 관한 것
    → 숫자형 데이터들끼리는 사칙연산이 가능
    → 문자열 데이터들끼리는 두 문자열을 연결하거나 길이를 알 수 있음
    → 데이터의 타입을 결정하는 것은, 데이터에 적용할 수 있는 작업, 즉, 연산자
    데이터에 어떤 연산자를 적용할 수 있는지가 이 데이터의 타입을 결정함

  • 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부에서 철저히 감춰짐

데이터 타입의 정의

데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터다.
데이터에 대한 분류는 암시적으로 어떤 종류의 연산이 해당 데이터에 대해 수행될 수 있는지를 결정한다.


객체와 타입

  • 이전에 데이터 타입에 대해 설명한 이유
    → 전통적인 데이터 타입과 객체지향의 타입 사이에는 깊은 연관이 있기 때문
    → 객체지향에서 우리는 객체를 일종의 데이터처럼 사용

객체에 관한 두 가지 조언

  • 이전에 ‘타입에 관한 두 가지 조언’과 동일

  • 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동
    → 동일한 행동을 한다면, 동일한 객체로 분류 가능

  • 객체가 내부적으로 어떻게 표현되는지는 외부에서 철저히 감춰짐
    → 객체의 타입은 내부 표현과는 일절 상관 없음


행동이 우선이다

  • 어떤 객체를 다른 객체와 동일한 타입으로 분류하는 기준 ?
    → 두 객체가 동일한 행동을 하는지
    → 동일한 상태를 갖고 있더라도, 다른 행동이라면 다른 타입
    객체의 타입을 결정하는건 객체의 행동 뿐

  • 같은 타입 = 동일한 행동
    → 동일한 행동 = 동일한 책임
    → 동일한 책임 = 동일한 메시지의 수신
    → 같은 타입인 객체는, 내부의 데이터 표현 방식이 다르더라도, 동일한 메시지를 수신해 이를 처리할 수 있음
    → But, 메시지의 처리 방식은 다를 수 있음
    다형성

  • 객체가 할 수 있는 행동만을 외부에 공개하고, 내부의 데이터는 행동 뒤로 감춰야 함
    캡슐화

  • 객체를 원활히 분류하기 위해서는 내부의 데이터가 아니라 외부의 행동을 먼저 고려해야 함
    1) 객체가 외부에 제공해야 하는 책임을 결정
    2) 책임을 수행하는 데 적합한 데이터를 결정
    3) 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 데이터를 캡슐화
    책임-주도 설계



타입의 계층

트럼프 계층

  • 정원사, 병사, 신하, 왕자, 공주 등은 정말 ‘트럼프’ 일까 ?
    → 카드게임을 할 때 트럼프와 외형은 동일하지만, 행동은 동일하지 않음
    → ‘트럼프’가 아니라 ‘트럼프 인간’이 더 정확
    → ‘트럼프 인간’ 타입은 ‘트럼프’ 타입의 객체가 할 수 있는 행동 + 걸어다니는 행동 할 수 있음
    → ‘트럼프 인간’은 ‘트럼프’보다 조금 더 특화된 행동을 함

  • 외연의 관점에서 ‘트럼프’와 ‘트럼프 카드’를 살펴보자
    → ‘트럼프 인간’의 외연은 ‘트럼프’ 외연의 부분집합
    → ‘트럼프 인간’과 ‘트럼프’ 사이의 관계를 일반화/특수화 관계라고 함


일반화 / 특수화 관계

  • 일반화와 특수화는 동시에 이뤄짐
    → ‘트럼프 인간’은 ‘트럼프’를 좀 더 구체적으로 표현한 것
    → 어떤 객체가 다른 객체보다 더 구체적인 상태를 표현한다고 일반화 / 특수화 관계가 성립하는 것은 아님
    → 한 타입이 다른 타입보다 더 구체적인 행동을 해야 함
    일반화 / 특수화 관계를 결정하는 것도 행동

  • 내연, 외연 관점에서의 일반화 / 특수화 관계
    → 일반적인 타입의 외연은 특수한 타입의 외연보다 크다
    → 일반적인 타입의 내연의 가짓수는 특수한 타입의 내연의 가짓수보다 작다


슈퍼타입과 서브타입

  • 일반화 / 특수화 관계
    → 슈퍼타입 / 서브타입 관계
    슈퍼타입: 일반적인 타입
    서브타입: 특수한 타입

  • 슈퍼타입과 서브타입의 관계는 두 타입의 행동에 의해 결정됨
    한 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족해야 함
    → 어떤 타입을 다른 타입의 서브타입이라고 말할 수 있으려면 다른 타입을 대체할 수 있어야 함
    → Liskov Substitution Principle ( LSP )

  • 일반화 / 특수화 관계를 표기하는 방법
    → 슈퍼타입을 상단에, 서브타입을 하단에
    → 속이 빈 삼각형 화살표가 서브타입에서 슈퍼타입을 향하도록 연결


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

  • 추상화의 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거해 단순화하는 것
    → 앨리스가 ‘트럼프 인간’이 아니라 ‘트럼프’라고 한 이유도 이와 유사
    → ‘트럼프 인간’이 할 수 있는 구체적인 행동은 불필요해서 단순화 한 ‘트럼프’라고 생각

  • 앨리스는 추상화의 두 가지 기법을 모두 사용함
    → 등장인물들 사이의 차이점은 배제하고 공통점만으로 ‘트럼프 인간’으로 분류함
    → ‘트럼프 인간’을 더 단순한 관점에서 바라보고 불필요한 세부 사항은 무시함으로서 ‘트럼프’로 일반화



정적 모델

타입의 목적

  • 왜 타입을 사용하는가 ?
    → 인간의 인지 능력으로는 동적으로 변화하는 객체의 복잡성을 따라가기 어렵기 때문
    → 앨리스의 키가 아무리 변해도 앨리스는 앨리스

  • 타입은 동적으로 변화하는 객체의 상태에 무관하게 정적인 모습으로 다룰 수 있게 해줌


그래서 결국 타입은 추상화다

  • 타입을 사용함으로써 객체의 동적인 상태를 정적으로 표현할 수 있게 해줌
    결국 타입도 추상화
타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법

동적 모델과 정적 모델

  • 스냅샷: 하나의 객체가 특정 시점에 구체적으로 어떤 상태를 갖는지
    → UML에서 객체 다이어그램이라고도 불림
    동적 모델: 스냅샷처럼 객체의 변화를 포착하는 것

  • 타입 모델: 객체가 가질 수 있는 모든 상태와 행동을 시간에 독립적으로 표현한 것
    정적 모델 이라고도 함

  • 객체지향 애플리케이션을 잘 활용하기 위해서는 동적 모델, 정적 모델을 적절히 잘 사용해야 함
    → 클래스를 작성하는 시점에는 변화하지 않기 때문에 정적 모델
    → 디버깅 등 객체의 변화를 따라가는 시점에는 동적 모델


클래스

  • 객체지향에서 정적인 모델의 ‘타입’은 주로 클래스를 통해 구현됨
    → 하지만, 클래스는 타입의 다양한 구현 방법 중 하나
    → 따라서, 클래스와 타입은 다른 개념
    → 클래스는 타입의 구현 외에도 코드의 재사용의 용도로도 사용됨

  • 객체를 분류하는 기준은 타입 / 타입을 나누는 기준은 객체가 수행하는 행동



객체지향의 사실과 오해

profile
TIL을 기록하기 위한 게시글들 | 노션에 기록해 둔 것들 옮길 예정 !

0개의 댓글