스터디

[객체지향의 사실과 오해] 3장, 4장 정리

nkdev 2025. 8. 16. 22:33

3장. 타입과 추상화

intro

지하철 노선도를 실제 지리와 다르게 거리와 역 이름만 표현

-> '정확성'을 버리고 '목적'에 집중. 꼭 알아야 하는 사실만 정확히 표현하고 몰라도 되는 정보는 무시한 것

추상화를 통한 복잡성 극복

추상화란?

- 공통점은 취하고 차이점은 버려 단순하게 만듦

- 불필요한 세부사항을 제거하여 중요한 부분을 강조

 

추상화의 목적?

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

객체지향과 추상화

1) 그룹으로 나누어 단순화하기

앨리스는 외형+행동방식이 동일한 사람들을 '트럼프'라고 불렀다.

그룹에 속한 객체가 단 하나뿐이라고 해도, 이렇게 그룹으로 나누어 단순화하면 내재된 복잡성을 효과적으로 감소시킬 수 있다.

2) 개념(concept)

개념이란 공통점을 기반으로 객체들을 여러 그룹으로 분류할 수 있는 체이다.

객체에 개념이라는 체를 적용하여 분류하면, 객체는 인스턴스가 된다.

추상화란 어떤 것을 더 명확하게 이해하기 위해 공통점을 취하고 차이점을 버리는 일반화를 통해 단순하게 만드는 것이다.

앨리스가 차이점을 무시하고 공통점만 취해 '트럼프'라는 개념으로 단순화한 것은 추상화의 일종이다.

3) 개념의 세 가지 관점

- 심볼(symbol) : 개념을 가리키는 명칭 (ex. 트럼프)

- 내연(intension) : 개념의 정의. 내연의 의미를 이용해 객체가 개념에 속하는지 여부 확인 가능 (ex. 몸이 납작하고 두 손발이 귀퉁이에)

- 외연(extension) : 개념에 속하는 모든 객체의 집합 (ex. 정원사, 병사, 신하..)

이 세 가지는 객체를 어떻게 분류할 것인지에 대한 지침이자 개념의 구성요소이다.

4) 객체를 분류하기 위한 틀

심볼, 내연, 외연 (=개념) 은 객체를 분류하기 위한 틀이라고 했다.

그런데 이 분류가 정말 중요하다.

왜냐하면 분류는 객체지향의 품질을 결정하기 때문이다. 

⭐️ 분류란, 특정 '개념'을 객체에 적용하여 객체를 특정 집합의 멤버로 포함시키는 것이다.

- 유지보수가 쉬움

- 변화에 쉽게 대응할 수 있음

-> 적절한 분류체계를 가지고 직관적으로 분류하는 것이 중요하다!

5) 분류는 추상화를 위한 도구다

다시 한 번 정리하는 추상화

- 공통점은 취하고 차이점은 버려 단순화시키는 것

- 필요없는 세부사항은 무시하여 중요한 부분을 강조하는 것

이 두가지는 개념을 사용해 객체를 분류하는 과정이기도 하다.

-> 개념(을 가지고 분류하는 것)은 추상화의 도구라고 할 수 있음!

 

타입

1) 타입은 개념이다

지금까지 설명한 '개념'을 공학자들의 용어로는 '타입'이라고 함

타입의 정의는 개념의 정의와 완전히 동일하다.

어떤 객체에 타입을 적용할 수 있을 때, 그 객체를 타입의 인스턴스라고 한다.

2) 데이터 타입

타입의 필요성은, 어떤 비트에 의미를 부여하기 위함이다.

-> 메모리에 저장된 0, 1을 구분하여 데이터가 잘못 사용되지 않게 하기 위함

공통점 기반으로 문자열형, 숫자혈, 논리형 등으로 분류된다.

 

타입에 관련된 중요한 사실 두 가지!

- 그 데이터에 어떤 작업을 수행할 수 있는지(=어떤 연산을 적용할 수 있는지)에 따라서 데이터 타입이 결정된다.

- 개발자는 그 타입에 속한 데이터가 메모리에 어떻게 표현되는지 몰라도 지장없다.

3) 객체와 타입

데이터 타입은 어떤 연산이 적용될 수 있는지에 따라 분류된다고 했다.

객체 타입은 객체가 동일한 행동을 수행할 수 있는지에 따라 분류된다.

4) 행동이 우선이다

객체가 어떤 행동을 할 수 있냐에 따라 객체 타입이 결정된다.객체의 타입을 결정하는 것은 객체의 행동 뿐이다.

객체 내부 표현 방식 (객체가 어떤 데이터를 갖고 있는지)는 타입을 결정하는 데 전혀 영향을 미치지 X

 

같은 타입의 객체가 동일 행동(=동일 책임, 동일 메시지만 수신)한다면서로 다른 데이터를 가질 수 있다.

-> 동일한 요청에 대해 서로 다른 방식으로 처리 => 다형성

-> 동일 요청 받으려면 같은 타입이 되어야 하니까 다형성을 이루는 객체들은 같음 타입일 수밖에 없음

 

행동만이 타입을 결정한다.

-> 데이터는 외부로부터 감춰야됨 + 행동만 외부에 노출 => 캡슐화

🍑 행동에 따라 객체를 분류하기 위해서는 데이터 먼저 결정 후 책임을 생각하는게 아니라,

책임!!!!! 즉 객체가 외부에 제공해야 하는 행동을 먼저 생각해야한다.

이게 책임-주도 설계의 핵심이다.

 

타입의 계층

1) 일반화/특수화 관계

여기서도 강조되는 '행동'..

객체지향에서 일반화/특수화 관계를 결정하는 것은 객체의 상태가 아니라 행동이다.

다른 객체보다 더 일반적인 또는 더 특수한 상태를 표현한다고 해서 일반화/특수화 관계가 성립하는 것은 아니다.

일반적인 타입은 다른 객체보다 더 적은 수의 행동을, 특수한 타입은 다른 객체보다 더 많은 수의 행동을 가진다.

단, 특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행할 수 있어야 한다.

 

 

4장. 역할, 책임, 협력

intro

1. 협력 ----> 2. 행동 ----> 3. 상태

객체 간에는 협력이라는 문맥을 고려하는 게 최우선!

그러면 행동, 상태가 자연스럽게 결정된다.

객체 지향 설계의 전체적인 품질을 결정하는 것은 개별 객체의 품질이 아니라 객체들의 협력의 품질이다.

 

협력

1) 요청하고 응답하며 협력하는 사람들

협력의 본질은 다수의 연쇄적인 요청+응답의 흐름이다.

객체지향은 동일 목적(=하트잭의 재판)을 달성하기 위해 협력(= 재판 요청, 증언 요청, 증인 호출 ..)하는 객체들의 공동체이다.

책임

객체가 요청을 받았다는 건, 그 객체가 그 요청을 받아서 적절한 방식으로 응답하는데 필요한 지식 + 행동 방식을 가지고 있다는 의미.

즉!! 객체가 '책임'을 가진다는 의미이다. 

이 책임을 어떻게 잘 할당하느냐가 객체지향에서 가장 중요하다.

1) 책임의 분류

객체가 '책임을 가진다'는 의미?

- 요청에 응답할 수 있음

- 적절한 행동을 할 의무가 있음

 

'책임'의 분류?

- 하는 것(doing)

   - 스스로 하는 것 (객체 생성/계산)

   - 다른 객체의 행동을 시작시키는 것

   - 다른 객체의 활동을 제어하고 조절하는 것

- 아는 것(knowing)

   - 개인적인 정보에 관해 아는 것

   - 관련된 객체에 관해 아는 것

   - 자신이 유도하거나 계산할 수 있는 것에 관해 아는 것

 

* 책임이 명확해야 한다!

* 책임(=객체 외부에 제공해줄 수 있는 정보(knowing), 서비스(doing)의 목록)

은 객체의 public interface(공용 인터페이스)를 구성한다!

 

2) 책임과 메시지

송신자(책임) -----(메시지 전송)-----> 수신자(책임)

- 책임 : 요청을 받았을 때만 자신에게 주어진 책임을 수행

- 메시지 : 협력의 유일한 방법

 

책임 vs 메시지

- 책임 : 다른 객체와 협력하는 맥락이 아니라도 그냥 객체 하나의 입장에서 외부에 제공할 수 있는 행위의 일부를 말함

- 메시지 : 객체 간에 상호협력하는 맥락에서 사용되는 말

 

* 책임과 메시지의 수준은 같지 않다

객체지향 설계할 때 먼저 어떤 객체가 무슨 책임을 가지고 어떻게 서로 협력해야 하는지까지만 설계하는 게 중요하다.

이렇게 책임과 협력의 구조 수준까지만 설계하고, 그 책임을 어떻게 메시지로 주고받게 구현할지는 다 설계된 다음에 생각해야 한다.

 

역할

1) 책임의 집합이 의미하는 것

역할은 협력 내에서 '해당 역할을 수행할 수 있는 어떤 객체라도 대체할 수 있습니다'라고 표현하는 것과 같다.

-> 역할은 재사용 가능하고 유연한 객체지향 설계를 위한 가장 중요한 구성요소이다!

 

2) 역할이 답이다

왕 대신 여왕, 모자 장수 대신 요리사가 협력에 참여한다면..?

-> 과정이 유사하다면 각각의 협력을 별도로 관리하고 수정하기보다는, 하나의 협력으로 다룰 수 있다.

 

* 아무나 역할을 대체할 수 있는 건 아니다.

협력 내에서 동일한 역할을 수행(= 동일한 책임의 집합을 수행 = 동일한 메시지를 수신/이해)할 수 있는 객체만이 역할을 대체할 수 있다.

 

3) 협력의 추상화

객체를 추상적인 역할로 대체하여, 하나의 협력 안에 여러 종류의 객체가 참여할 수 있게 하는 것

 

4) 대체 가능성

역할이란 다른 객체에 의해 대체 가능한 것이고, 대체 가능하려면 같은 행동을 수행할 수 있어야 한다.

그런데 주의할 점은 객테는 역할이 암시하는 책임보다 더 많은 다른 책임도 수행할 수 있다는 점이다. (일반화/특수화 관계)