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) 대체 가능성
역할이란 다른 객체에 의해 대체 가능한 것이고, 대체 가능하려면 같은 행동을 수행할 수 있어야 한다.
그런데 주의할 점은 객테는 역할이 암시하는 책임보다 더 많은 다른 책임도 수행할 수 있다는 점이다. (일반화/특수화 관계)
'스터디' 카테고리의 다른 글
| [객체지향의 사실과 오해] 7장 정리 (0) | 2025.08.31 |
|---|---|
| [객체지향의 사실과 오해] 5장, 6장 정리 (2) | 2025.08.23 |
| [객체지향의 사실과 오해] 1장, 2장 정리 (4) | 2025.08.09 |