객체는 행동으로 추상화한다

MinHwi·2022년 11월 18일
0
  • 공부 내용 : 객체지향의 사실과 오해 3장
  • 공부 기간 : 2022년 11월 16일 수요일


기억하고 싶은 것

추상화는 현실의 복잡성을 극복하기 위한 인지 수단이다. 객체를 개념에 따라 분류하여 일반화하고 단순화할 수 있다. 소프트웨어에서 개념은 타입이며, 타입을 결정하는 것은 객체의 행동이다. 행동은 다형성, 캡슐화, 상속을 설명한다. 타입은 객체의 동적인 상태 변화를 정적으로 추상화하며, 클래스는 타입을 구현하는 수단이다.

질문

  1. 추상화는 무엇이고 그 목적은 무엇인가?
  2. 개념에 의한 분류는 추상화를 어떻게 적용하는가?
  3. 소프트웨어에서 객체 분류의 기준인 개념은 무엇인가?
  4. 타입을 결정하는 것은 무엇인가?
  5. 다형적인 객체는 왜 동일한 타입인가?
  6. 객체를 행동에 따라 분류하려면 객체는 어떤 모습이어야 하는가?
  7. 슈퍼타입과 서브타입을 결정하는 것은 무엇인가?
  8. 타입은 객체의 무엇을 추상화하는가?
  9. 클래스는 무엇을 구현하는가?


1. 추상화는 무엇이고 그 목적은 무엇인가?

추상화는 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 인지 수단이다. 훌륭한 추상화는 목적에 부합하는 것이어야 한다.(객체지향에서는 협력 양상 이해가 목적) 추상화는 일반화와 단순화로 이루어진다. 일반화는 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 것이고, 단순화는 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거하는 것이다.

2. 개념에 의한 분류는 추상화를 어떻게 적용하는가?

일반화와 단순화를 적용한다. 정원사, 병사, 신하, 왕자와 공주, 왕과 왕비, 하트 잭, 하트 왕, 하트 영왕을 트럼프라는 개념으로 묶은 것은 개별 객체 간의 차이점은 무시하고 공통점을 취한 결과이다. 트럼프에 속하는 객체들의 공통점 중에서도 우리가 중요하다고 생각하는 특징은 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있다는 것 뿐이다. 그 외의 사항은 앨리스의 이야기를 풀어나가는데 어떤 도움도 되지 않기 때문에 세부 사항을 제거했다고 볼 수 있다.

3. 소프트웨어에서 객체의 타입을 결정하는 것은 무엇인가?

여기서 타입은 개념과 동일하다.
객체가 어떤 타입에 속하는지 결정하는 것은 객체가 수행하는 행동이다. 어떤 객체들이 동일한 행동을 수행할 수 있다면 그 객체들은 동일한 타입으로 분류될 수 있다. 예를 들어 데이터 타입에서 +, - 등의 산술 연산자를 적용할 수 있는 타입은 숫자형 타입이다.

4. 다형적인 객체는 왜 동일한 타입인가?

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

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

5. 객체를 행동에 따라 분류하려면 객체는 어떤 모습이어야 하는가?

객체는 분명한 책임을 가지는 행동만을 외부에 노출해야 한다. 데이터의 내부 표현 방식과 무관하게 행동만이 고려 대상이라는 사실은 외부에 데이터를 감춰야 한다는 것을 의미한다. 따라서 훌륭한 객체 지향 설계는 외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야 한다. 데이터가 캡슐의 벽을 뚫고 객체의 인터페이스를 오염시키는 순간 객체의 분류 체계는 급격히 위험에 노출되고 결과적으로 유연하지 못한 설계를 낳는다.

6. 슈퍼타입과 서브타입을 결정하는 것은 무엇인가?

타입 행위의 호환성이다. 일반적인 타입은 특수한 타입에 비해 더 적은 수의 행동을 가지며 특수한 타입은 일반적인 타입에 비해 더 많은 행동을 가진다. 특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행할 수 있어야 한다.

슈퍼타입과 서브타입으로 타입을 나누는 것은 일반화를 적용한 것이다. 트럼프라는 슈퍼 타입은 납작 엎드릴 수 있고 뒤집어질 수 있다. 트럼프 인간이라는 서브 타입은 걸을 수 있다는 특징을 추가적으로 가지고 있다. 앨리스는 트럼프 인간 무리를 보았을 때, 기껏해야 트럼프에 불과하다고 생각했다. 앨리스는 트럼프 인간의 특수한 능력은 제거하고 종이 조각처럼 쉽게 뒤집어지는 트럼프의 특성에 집중하여 상황을 단순하게 만들었다.

7. 타입은 객체의 무엇을 추상화하는가?

타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 제거하고 철저하게 정적인 관점에서 객체의 모습을 묘사한다. 일반적으로 이런 모델을 타입 모델(정적 모델)이라고 한다. 앨리스의 키는 특정 행동을 할 때 값이 변한다. 이때 중요한 것은 값이 변한다는 가능성이지 그런 행동을 할 때 키가 어떤 값을 가지는지 중요하지 않다.

8. 클래스는 무엇을 구현하는가?

클래스는 객체지향 프로그래밍 언어에서 정적인 모델을 구현한다. 타입은 객체를 분류하기 위해 사용되는 개념이고, 클래스는 타입을 구현할 수 있는 여러 구현 매커니즘 중 하나이다. 클래스는 타입의 구현 외에도 코드를 재사용하는 용도로도 사용되기 때문에 클래스와 타입을 동일시하는 것은 많은 오해와 혼란을 불러 일으킨다.

profile
딩가딩가 백엔드 개발자

0개의 댓글