호댕의 iOS 개발

[독서 후기] 객체지향의 사실과 오해 3장 본문

Book/개발

[독서 후기] 객체지향의 사실과 오해 3장

호르댕댕댕 2022. 4. 13. 23:02

3장에서는 타입과 추상화의 개념에 대해 중점적으로 설명을 하고 있다. 

 

💭 추상화

추상화의 경우 지하철 노선도의 예를 들어 설명하고 있다. 사실 지하철 노선도의 경우 실제 지형적 특징이나 거리를 반영하지 않고 단순히 다음 역이 어떤 역이고 특정 역까지 가려면 몇 정거장이 남아있는지를 보여준다. 

 

지하철 노선도가 필요한 경우는 지형적 특징이 궁금할 때가 아니라 지하철을 타고 얼마나 이동해야할 지 확인해야 할 때이기 때문이다. 따라서 불필요한 지형적 특징은 제거하고 단순화하는 것이다. 

 

이는 추상화에서 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거하고 단순화한 것이다. 

이외에도 추상화는 사물 간 공통점을 취하고 차이점은 버리는 방식으로 이뤄질 수도 있다. 

 

그럼 추상화는 어떻게 정의해볼 수 있을까? 

 

일단 추상화가 필요한 상황은 복잡한 것들을 최대한 단순화하여 특정 목적을 달성하기 위함이다. 따라서 추상화는 불필요한 것들을 제거하며 목적에 맞는 본질을 찾아가는 과정이라 볼 수 있다. 

 

⚖️ 개념과 분류

이상한 나라의 앨리스에선 병정, 왕, 여왕, 정원사 등을 단순히 트럼프로 추상화할 수 있다. 이렇게 다양한 객체들을 하나의 개념으로 묶을 수 있는 것이다. 

앞에서도 유사하게 몇 번 등장하긴 했지만 객체는 이 책에서 이렇게 정의하고 있다. 

 

명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서는 객체라고 한다 .
- 객체지향의 사실과 오해 p/81 - 

 

트럼프라는 개념을 통해 트럼프와 트럼프 이외의 토끼 같은 것들을 분류할 수 있다. 

 

또한 개념 객체에 적용이 되었을 때 각각의 객체는 인스턴스라고 할 수 있다. 

 

여기서 개념을 조금 더 자세히 살펴보자. 

 

💡 개념

  • 심볼: 개념을 가리키는 이름 / 명칭
  • 내연: 개념의 정의 -> 트럼프의 경우 납작하고 네모난 것들이 내연이 될 수 있다.
  • 외연: 특정 개념으로 묶을 수 있는 것들의 집합

다만 여기서 심볼, 외연, 내연보다 중요한 것은 개념으로 객체를 분류할 수 있다는 것이다. 

어떤 객체를 어떤 개념으로 분류할지가 객체 지향 설계의 품질을 결정하게 된다. 객체를 적절한 개념으로 분류를 할 경우 각각의 역할과 행동이 분명하기 때문에 유지보수도 용이하며 변화에도 유연하게 대처할 수 있게 된다. 

 

이런 개념은 프로그래밍에서 타입이라고 볼 수 있다. 

 

타입을 좀 더 자세히 알아보기 전에 데이터 타입에 대해 먼저 알아보자. 

 

💽 데이터 타입

실제 메모리에서는 0, 1로 데이터가 구성이 되어 있다. 이는 일련의 비트열로 구성이 되어 있기 때문에 이 비트열의 의미는 값을 가져다 쓰는 어플리케이션에 의해 결정이 된다. 

 

이 때 데이터에 타입이 있어야 데이터가 뭔지 분류를 할 수 있다. 따라서 생겨난 것이 데이터 타입이다. 데이터가 잘못 사용되지 않도록 기준을 만들어 이를 통해 분류할 수 있도록 하는 것이다. 

 

데이터 타입의 경우 어떤 데이터에 어떤 연산자(Operator)를 적용할 수 있는지가 데이터의 타입을 결정하게 된다. 

또한 데이터 자체가 어떻게 표현되는지는 외부에 감춰지게 된다

 

✳️ 객체

이런 데이터 타입처럼 객체 각각도 하나의 데이터처럼 사용된다. 다만 객체 == 데이터라는 의미는 아니다. 객체를 타입으로 분류하고 타입에 이름을 붙이는 것은 데이터 타입을 정의해놓는 것과 유사하지만 말이다. 

 

물론 객체에서 가장 중요한 것은 객체의 행동이다. 

따라서 객체가 동일한 행동을 한다면, 동일한 타입으로 볼 수 있다. 이 때 다른 데이터를 가지고 있다고 해도 동일한 메세지를 받아 처리할 수 있다면 동일한 타입이다. 따라서 다형적인 객체들은 같은 타입에 속한다고 볼 수 있다. 

 

여기서 다형성은 동일한 요청(메세지)에 대해 서로 다른 방식으로 처리할 수 있는 능력으로, 다른 방식으로 처리하긴 하지만 동일한 메세지를 받아 처리하기 때문에 다형적인 객체가 같은 타입으로 볼 수 있는 것이다. 

 

또한 데이터 자체가 어떻게 표현되는지는 외부에 감추는 데이터 타입처럼, 객체도 외부에 행동만 드러내고 상태(프로퍼티)는 감추는 캡슐화를 해줘야 한다. 

 

그럼 왜 타입을 사용하는 것일까?

행동에 따라 동적으로 객체가 변하게 되는데 이런 복잡성을 추상화하기 위함이다. 

타입을 사용해 상태가 변하는 것에 집중을 하기보단 어떤 행동에 상태가 변하는 지에 대해 단순화하여 정의할 수 있다. 

 

Swift의 경우 클래스 이외에도 Struct, Enum을 통해 타입을 정의할 수 있다. 

 

Comments