sami355 2024. 1. 10. 17:12

목차

추상화는 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다.

3장에서 말하는 추상화에 대한 개요를 언급하는 부분이라고 생각합니다. 

 

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

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

 

3장에서는 추상화의 정의와 두 가지 차원들이 어떻게 실생활에 적용되고 또 어떻게 코드로 적용되는지를 설명합니다.

 

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

 

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

 

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

 

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

 

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

 

어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다.

 

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

 

첫째, 타입은 데이터가 어떻게 사용되느냐에 관한 것이다.

책의 저자는 이렇게 말함과 동시에 숫자형 데이터, 문자열 데이터를 예시로 들며 설명합니다. 이를 인용하며 만약 숫자형 데이터, 문자열 데이터가 존재하지 않는다면 프로그래머는 비트를 보고 데이터가 무엇인지 판단해야 합니다. 그렇기 때문에 데이터의 타입을 보고 해당 타입의 데이터에 어떠한 연산자를 적용시킬수 있는지가 중요한 포인트라고 할 수 있습니다.

 

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

이는 ,적어도 제가 알고 있는것으로는, 흔히 추상화의 보편적인 개념과도 어느정도 일맥상통하는 말이라고 생각합니다. 

 

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

 

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

1장에서 언급한 내용을 이어서 설명한다고 생각합니다. 1장에서도 객체의 행동을 기준으로 객체의 범위를 나눈다고 하였습니다.

 

다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다. 동일한 메시지를 서로 다른 방식으로 처리하기 위해서는 객체들은 동일한 메시지를 수신할 수 있어야 하기 때문에 결과적으로 다형적인 객체들은 동일한 타입(또는 타입 계층)에 속하게 된다.

 

훌륭한 객체지향 설계는 외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야 한다. 이 원칙을 흔히 캡슐화라고 한다.

 

타입과 타입 사이에는 일반화/특수화 관계가 존재할 수 있다. 그리고 특수하다는 것은 일반적인 개념보다 범위가 더 좁다는 것을 의미한다.

 

슈퍼타입과 서브타입에서 중요한 것은 두 차입 간의 관계가 행동에 의해 결정된다는 점이다.

 

어떤 타입을 다른 타입의 서브타입이라고 말할 수 있으려면 다른 타입을 대체할 수 있어야한다.
(자식 객체를 부모 객체의 자리로 바꿔 끼울수 있어야 한다.)

 

타입은 시간에 따라 동적으로 변하는 앨리스의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 해준다.
ex) 앨리스의 키가 100, 80, 300, 40cm... -> 앨리스라는 객체는 키라는 프로퍼티를 가지며 "버섯을 먹다.", "음료를 마시다.", "부채질하다."와 같은 행동을 가진다.

 

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

 

타입은 객체를 분류하기 위해 사용하는 개념이다. 반면 클래스는 단지 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나이다.