반응형

Chapter03 타입과 추상화

추상화 정의

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

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

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

단, 추상화는 복잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 것을 명심해야한다.

현실세계에서의 추상화

지하철 노선도의 변화

첫 지하철 노선도는 위치와 지형정보, 동선을 고려해 노선도를 만들었었다.

해당 노선도는 실 사용자들에게는 오히려 혼란을 가져왔고, 이용자들이 알아야 할 필요가 없는 지형정보 등이 같이 흘러들어와서 노선도를 이해하기 어려워했다.

이 노선도를 불편하게 여긴 해리 벡은 지형과 축척을 무시하고 역 사이의 연결성에만 집중한 노선도를 만들어냈고, 이 노선도는 역의 순서와 갈아타는 역의 표시만이 정확했고, 나머지는 임의로 만들어진 노선이였다. 하지만, 해리벡이 제시한 이 노선도는 현재까지도 유용하게 쓰이고있다.

객체지향의 세계에서의 추상화

  • 특징만 담은 추상화
    • 앨리스 세계에서 나오는 트럼프왕국 시민들 → 트럼프
    • 시민들의 종류를 배제한 추상화가 이루어짐
  • 그룹으로 나누어 단순화
    • 앨리스에서는 하트, 스페이드, 클로버, 다이아몬드 등 각 문양을 갖고 있는데, 문양으로 이루어진 특징으로 나눌 수도 있고, 앨리스 이야기에 등장하는 왕, 왕비, 신하, 정원사 등 역할로 나눌 수도 있을 것이다. 이 역할이 다양하지만, 트럼프 왕국이 아닌 앨리스 세계 관점으로 본다면 토끼, 앨리스 등 다른 객체와 만나게 된다면 왕, 왕비, 신하, 정원사가 모여서 사는 클로버왕국 그룹이다.

개념

공통점을 기반으로 객체들을 묶기 위한 그릇을 `개념(concept)라고` 한다

해당 개념을 통해 하늘을 나는 빠른 교통수단을 비행기라고 부를 수 있는 것이다.

이 개념을 이용하면 객체를 여러 그룹으로 분류(classification) 할 수 있다. 이 분류를 통해 앨리스 이야기에 나오는 각 객체들을 그 개념의 인스턴스(instance) 라고 한다.

객체란 특정한 개념을 적용할 수 있는 구체적인 사물을 의미한다. 개념이 객체에 적용됐을 때 객체를 개념의 인스턴스라고 한다.

개념의 세 가지 관점

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

앨리스 이야기에서의 세 가지 관점의 개념

  • 심볼 : 트럼프
  • 내연 : 몸이 납작하고 두 손과 두 발은 네모 귀퉁이에 달려 있는 등장인물
  • 외연 : 정원사, 병사, 신하, 왕자, 하트왕비, 하트병사, 클로버병사 등
우테코 2주차 자동차 경주에서의 세가지 관점의 개념
심볼 : 자동차
내연 : 자동차 전진, 랜덤으로뽑기
외연 : List<Car> cars
일급컬렉션들?

때문에 필요한 추상화의 정도에 따라 분류된 관점으로 개념을 분류하면 될 것 같다.

객체를 분류하기 위한 틀

외연의 관점에서 추가적인 특징을 부여해서 특정 개념을 적용하는 것을 분류라고한다.

트럼프 분류를 하트 개념으로 적용한다면 위에서 언급했던 하트왕비하트병사가 하트 트럼프로 분류가 될 것이다.

분류의 정확한 정의는

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

라고 한다.

분류는 객체지향의 가장 중요한 개념 중 하나인데, 어떤 개념으로 분류할지에 따라 객체지향의 품질을 결정한다.

객체를 적절한 개념에 따라 분류해야 유지보수가 용이하고 변경에 유연하게 대처할 수 있게 될 것이다.

그렇기에 객체를 최대한 직관적으로 분류하는 것이 객체지향의 핵심이다..!!!

타입

타입은 개념이다

타입은 개념과 동일하다 따라서 타입이란 우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 의미한다. 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다. 타입의 인스턴스는 타입을 구성하는 외연인 객체 집합의 일원이 된다.

데이터 타입

컴퓨터는 작업을 수행하기 위해서 작업에 필요한 데이터를 메모리 안으로 불러들여야 한다.

만약 컴퓨터 세계에서 타입이 없다면 해당 값은 비트열(bit string)로 구성 될 것이다.

이를 해결하기 위해 데이터의 용도와 행동에 따라 의미를 부여해서 총 네가지로 분류된다.

  • 숫자형 - 어떤 데이터에 다른 데이터를 더하거나 빼거나 나누거나 곱할 수 있다
  • 문자열형 - 여러 문자로 구성되어있고, 다른 문자와 연결될 수 있다.
  • 논리형 - 어떤 사실에 대한 참/거짓 을 이야기할 수 있다.

이렇게 데이터를 목적에 따라 분류하며 타입 시스템이 자라나기 시작했다.

이 타입 시스템의 목적은 메모리 안의 모든 데이터가 비트열로 보임으로써 야기되는 혼란을 방지하는 것이다.

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

객체와 타입

데이터 타입에서의 타입과 객체지향의 타입 사이에는 깊은 연관성이 있는데, 객체지향 프로그램을 작성할 때 우리는 객체를 일종의 데이터처럼 사용한다.

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

객체 타입의 특성

  • 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다. 어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다.
  • 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다. 객체의 행동을 가장 효과적으로 수행할 수만 있다면 객체 내부의 상태를 어떤 방식으로 표현하더라도 무방하다.

행동이 우선이다.

첫번째 특성을 따랐을 때 객체는 객체가 어떤 행동을 하느냐에 따라 객체의 타입이 결정된다.

두번째 특성을 따랐을 때 객체의 타입은 객체의 내부 표현과 상관이 없기 때문에 내부 방식이 다르더라도 어떤 객체들이 동일하게 행동한다면 그 객체들은 동일한 타입에 속한다.

이번에도 결론적으로는 이전과 동일하다.

객체끼리 같은 행동(책임이 같은)을 한다면 두 객체는 동일한 타입에 속한다고 말할 수 있다.타입을 결정하는데 객체의 데이터는 아무런 영향도 미치지 않는다.

이 특성을 적용하면 타입으로 분류할 때 사용해야 하는 기준이 명확해진다.

객체간에 동일한 데이터를 갖고 있어도 행동이 다르다면 그 객체들은 서로 다른 타입으로 분류되는것이 옳다.

이러한 특성(행동에 의해 타입이 결정된다)은 객체지향 세상을 특징 짓는 중요한 몇 가지 원리와 원칙에 의미를 부여한다.

  • 같은 타입에 속한 객체는 행동만 동일하다면 서로 다른 데이터를 가질 수 있다. 여기서 동일한 행동이란 동일한 책임을 의미하며 동일한 책임이란 동일한 메시지 수신을 의미한다.
  • 다만 내부의 표현 방식이 다르기 때문에 동일한 메시지를 처리하는 방식은 서로 다를 수밖에 없다.

위의 특성이 객체지향 세계의 다형성에 의미를 부여한다.

여기서 다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다.

동일한 메시지를 서로 다른 방식으로 처리하기 위해서는 객체들은 동일한 메시지를 수신할 수 있어야 하기 때문에 결과적으로 다형적인 객체들은 동일한 타입에 속하게 된다.

데이터의 내부 표현 방식과 무관하게 행동만이 고려 대상이라는 사실은 외부에 데이터를 노출 시키지 않는다는 것을 뜻하는데, 이렇게 외부에 행동만 제공하고 데이터를 감추는 객체 지향 원칙을 캡슐화라고 한다.

타입의 계층

트럼프 계층

우리가 추상화를 통해 트럼프 종류들을 모두 그저 ‘트럼프’라고 일반화를 시켰었는데, 사전적으로 생각했을 때 우리가 생각한 트럼프와는 다르다. 몇가지의 행동은 트럼프와 일치하지만, 걸을 수 있는 트럼프는 없다.

걸을 수 있는 트럼프 인간은 트럼프가 할 수 있는 모든 것을 할 수 있고, 걷기까지 할 수 있는 것이다.

일반화/특수화

트럼프와 트럼프 인간의 예시처럼 포괄적인 개념에서 좀 더 특화된 개념으로 변화된 개념을 일반화/특수화(generalization/specialization)관계 라고 한다.

객체의 일반화와 특수화 관계에 있어서도 중요한 것은 객체가 내부에 보관한 데이터가 아니라 객체가 외부에 제공하는 행동이다.

슈퍼타입과 서브타입

일반화/특수화를 했을 때 일반적인 타입을 슈퍼타입 이라고 하고 좀 더 특수한 타입을 서브타입이라고 한다.

슈퍼타입과 서브타입에서도 행동에 의해 두 타입간의 관계가 결정되는데, 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족시켜야 한다.

정적 모델

타입의 목적

정적모델은 시간에 따라 변화하는 모델이 아닌, 어느 시점에 사과를 먹어서 키를 변경시키거나 할 때 앨리스가 갖고있는 ‘키(상태)’를 갖고있게 해준다.

시간에 따라 변화하는 값(키 + 180cm)을 배제하는 것이다. 이렇게 시간의 영향과 상태의 변화를 배제한다면 정적 모델이 될 것이다.

결국 이 과정이 추상화. 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다.

동적 모델과 정적 모델

  • 동적 모델
    • 객체가 특정 시점에 구체적으로 어떤 상태를 가지는지
  • 정적 모델
    • 모든 행동을 시간에 독립적으로 표현하는 것
    • 동적으로 변하는 객체의 상태가 아니라 객체가 속한 타입의 정적인 모습을 표현

클래스

객체지향 프로그래밍 세계에서 정적인 모델은 클래스를 이용해 타입을 구현하면 된다.

  • 클래스와 타입을 동일하게 보면 유연한 객체지향 설계에 방해가 된다.
  • 클래스는 타입을 구현하는 용도로도 사용되고 코드를 재사용하는 용도로도 사용되기 때문이다.
반응형

+ Recent posts