IT 관련 책 정리 및 후기/객체지향의 사실과 오해

[3장] 타입과 추상화

JUN0126 2022. 7. 9. 21:10

컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는것에 관한 모든 것 이라는것을 깨닫고 나면 컴퓨터 프로그래밍을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해 진다 - 키스 데블린

 

기존의 지형과 위치를 고려하여 나온 복잡한 지하철 노선도는 단순하고 직관적으로 역 간의 네트워크를 표현한 지하철 노선도가 나옴으로써

복잡하게 이해되고 보기 어렵던 노선도는 쉽게 파악되며 사용되어졌습니다. 

추상화도 이 처럼 이해하기 쉽고 단순하며 목적에 부합하는 수준으로 설정하여 개발자에게 복잡성을 극복해 낼 수 있습니다.

 

추상화를 통한 복잡성 극복

- 위의 지하철 노선도 사례에서 봤을때 중요한 점은 역의 위치가 중요한것이 아니라 역과 역 사이의 연결 관계가 중요했던 것입니다.

그래서 훌륭한 추상화는 목적에 부합하는 것이어야 합니다.

 

추상화의 정의

 - 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법

 1. 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만든다.

 2. 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써 단순하게 만드는 것

 결론 : 복잡성을 이해하기 쉬운 수준으로 단순화 하는것

 

객체지향과 추상화

 - 개념 (Concept) : 공통점을 기반으로 객체들을 묶기 위한 그릇, 각 객체는 특정한 개념을 표현하는 그룹의 일원

 개념의 3가지 관점

  1. 심볼 (Symbol) : 개념을 가리키는 간략한 이름이나 명칭 EX) 앨리스 나라의 트럼프
  2. 내연 (Intension) : 개념의 정의, 개념을 객체에 적용할 수 있는지 여부를 판단하기 위한 조건 EX) 토끼는 트럼프가 될 수 없다
  3. 외연 (Excension) : 개념의 인스턴스들이 모여 이뤄진 집합 EX) 트럼프 인간들(정원사,병사 여왕 등)   

위에서 설명한 개념을 기반으로 객체를 개념 기반으로 분류 하여야 한다

 

그렇다면 분류란 무엇일까?

 - 분류는 객체에 특정한 개념을 적용하는 작업입니다

 - 객체에 특정한 개념을 적용하기로 했을 떄 해당 객체를 특정한 집합의 멤버로 분류하고 있는 것입니다.

 

타입

- 공통점을 기반으로 객체들을 묶기 위한 틀, 앞에 말한 개념과 완전한 동일한 의미이다.

- 컴퓨터 안에 데이터는 0과 1로 이루어진 비트열이기 떄문에 이것만으로는 데이터가 무엇을 의미하는지 알 수 없다 그러하여 타입을 통하여 데이터가 어떠한 개념인지 알 수 있도록 한다

 

타입 시스템

- 데이터가 잘못 사용되지 않도록 제약사항을 부과하는 것이다.

 

타입시스템의 관점

1. 데이터가 어떻게 사용되는냐에 관한 관점

  - 데이터에 어떤 연산자를 적용할 수 있느냐에 따라 해당 데이터의 타입이 결정된다.

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

  - 개발자는 해당 데이터 타입을 사용하기 위해 데이터 타입에 적용할 수 있는 연산자만 알고 있으면 된다.

 

객체의 관점으로써의 타입

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

2. 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다 (캡슐화)

 

 

행동이 우선이다

동일한 책임을 수행하는 일련의 객체는 동일한 타입에 속한다고 할 수 있다.

 - 객체가 다른 객체와 동일한 데이터를 가지고 있더라도 다른 행동을 한다면 그 객체들은 서로 다른 타입으로 분류 되어야 한다

   2장에서 말했던 객체는 식별자를 가지고 있기에 다른 타입으로 분류되어야 하는것이 맞다고 생각한다.

 

결론적으로 객체의 타입을 결정하는 것은 객체의 행동 뿐이다. 객체가 어떤 데이터를 보유하고 있는지 타입을 결정하는 데 아무런 영향도 미치지 않는다.

객체를 결정하는것은 행동이다. 데이터는 단지 행동을 따를 뿐이다. 이것이 객체를 객체답게 만드는 핵심적인 원칙이다.

 

타입의 계층

 - 앨리스의 이야기에서 보았을 떄 트럼프 인간은 트럼프 카드 행동보다 걸어다닌다라는 특화된 행동을 하는 특수한 개념인데, 이 두 개념사이의 관계를 일반화/특수화 관계라고 한다. EX) 트럼프인간 extends 트럼프

 

여기서 중요한것은 객체지향에서 일반화 특수화 관계를 결정하는 것은 객체의 상태를 표현하는 데이터가 아니라 행동이라는것 입니다.

객체가 외부에 제공하는 행동이 일반화/특수화 관계에 있어서 중요하다.

 

슈퍼타입과 서브타입

- 일반화가 슈퍼 타입, 특수화가 서브 타입이다 단어로보면 헷갈릴 수 잇는데 일반적인 타입을 사용하는것이 슈퍼타입이고, 특수한 행동을 하는 타입을 서브타입이라 생각하면 좀 더 나을것 같다 EX) subType extends superType

- 서브타입은 슈퍼타입을 대체할 수 있어야 한다.

- 어떤 타입을 다른 타입의 서브타입이라고 말할 수 있으려면 다른 타입을 대체할 수 있어야 한다 SOLID의 L : 리스코프 치환 원칙

 

정적 모델

 타입을 사용하는 이유

- 인간의 인지 능력으로는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기가 어렵기 때문에

 

 타입은 추상화다

- 타입을 이용하면 객체의 동적인 특성을 추상화 할 수 있으며, 타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화 할 수 있는 효과적인 방법인것이다.

 

객체를 생각할 떄 고려하는 두가지 모델

1. 동적 모델

  - 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 나타내는 모델

2. 정적 모델  

 - 객체가 가질 수 잇는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 것이다.

 

클래스

 - 정적인 모델은 클래스를 이용하여 구현된다, 따라서 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것

 

클래스와 타입은 동일하지 않다

 - 타입은 객체를 분류하기 위해 사용되는 개념이며 클래스는 타입을 구현할 수 있는 여러가지 구현 방법 중 하나일 뿐이다.

  -> 이해가 잘 가지 않는다..

 

객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이라는 사실을 기억하라

 

결론 : 객체지향에서 중요한 것은 동적으로 변하는 객체의 상태와 상태를 변경하는 행위이다.

 

 

해당 내용은 객체지향의 사실과 오해 를 읽으며 제가 이해한 내용으로 정리한 내용입니다.

자세한 내용과 적확한 내용은 책을 읽어주시길 바랍니다. (책을 읽는것을 추천드립니다)

 

책 : https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=60550259

 

객체지향의 사실과 오해

위키북스 IT Leaders 시리즈 23권. 객체지향이란 무엇인가? 이 책은 이 질문에 대한 답을 찾기 위해 노력하고 있는 모든 개발자를 위한 책이다.

www.aladin.co.kr