
과거 런던의 지하철 노선도
현재 런던 지하철 노선도
과거와 현재의 런던 지하철 노선도를 살펴보면, 훨씬 가독성이 좋음
과거의 런던 지하철 노선도는 다른 것들보다 아래 요소들을 보이는데에 집중함
- 거리
- 실제 위치
하지만 사람들은 실제 위치나 거리에 생각보다 신경쓰지 않아 현재는 다른 요소들에 집중함
- 순서
- 환승 가능 역
즉, 과거에는 목적이 잘못 설정되어 가독성 떨어지고, 사람들이 보기 어려운 노선도를 사용했지만,
현재는 사람들이 노선도를 보는 목적을 제대로 파악하여 간단히 만들었음 → 지하철 노선도를추상화
현실에 존재하는 것들을 이해해야 하는데, 그렇다기엔 너무 복잡
→ 이해하기 쉽고 간단한 것으로 현실을 분해하고 단순화 해야 함
추상화란 현실에서 시작하되, 목적에 따라 정말 필요한 요소들만 남겨 본질을 보이게 함
하지만, 추상화도 목적에 맞지 않게 사용한다면, 잘못 사용되는 것
이 책에서
추상화의 정의어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해
특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.복잡성을 다루기 위해 추상화는 두 차원에서 이뤄진다.
- 첫 번째 차원은 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는
일반화를 통해 단순하게 만드는 것이다.- 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거함으로써
단순하게 만드는 것이다.모든 경우에 추상화의 목적은 목잡성을 이해하기 쉬운 수준으로 단순화하는 것이라는 점을 기억하라.
따라서, 객체지향 패러다임은, `객체`라는 `추상화`를 통해 현실의 복잡성을 극복한다
이상한 나라의 앨리스 이야기 중
앨리스가 정원에 입장해 하트 여왕과 다양한 트럼프 병사들,
그리고 하얀 토끼를 만나는 장면에 대한 묘사앨리스는 마지막에 “기껏해야 트럼프에 불과해. 무서워할 필요 없어” 라고 말함
앨리스의 그룹화
앨리스는 “기껏해야 트럼프에 불과해. 무서워할 필요 없어” 이라고 말함
→ 다양한 트럼프 병사들을 그저 ‘트럼프 병사’로 그룹화 함
→ 하지만 이 그룹에 ‘하얀 토끼’는 포함되지 않음 / 동일한 특성을 갖고 있지 않기 때문
→ 명확한 경계를 가져 구별할 수 있는 것들을 객체라고 함
이번 이야기의 등장인물들 중, 정원사, 병사, 신하, 왕자, 공주, 왕, 왕비, 하트 잭 … 등은
모두 ‘트럼프’와 동일한 외형과 행동 방식을 지니고 있음
→ 위 등장인물들을 모두 트럼프 그룹에 포함시킬 수 있음
→ 하얀 토끼는 트럼프에 속하지 못함
→ 결과적으로 앨리스는 등장인물들으 두 개의 그룹으로 나눔 / 트럼프, 토끼
개념
개념이란
공통점을 기반으로 객체들을 묶기 위한 그릇
우리가 인식하고 있는 다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념
개념을 이용하면 객체를 여러 그룹으로 분류할 수 있음
→ 개념은 여러 객체의 공통점을 기준으로 객체들을 분류할 수 있는 ‘체’
어떤 객체에 특정 개념을 적용할 수 있게 되어, 해당 개념 그룹에 속하게 될 때
→ 해당 객체를 이 개념의 인스턴스라고 함
객체란, 특정 개념을 적용할 수 있는 구체적인 사물을 의미함
개념이 객체에 적용되었을 때 객체를 개념의 인스턴스라고 함
일반적으로 개념을 객체의 분류 장치로 생각할 때, 세 가지 관점이 있음
심볼: 개념을 가리키는 간략한 이름이나 명칭
e.g. ‘트럼프’라는 이름내연: 개념의 완전한 정의를 나타내며, 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있음
e.g. ‘트럼프’는 ‘몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있음’외연: 개념에 속하는 모든 객체의 집합
e.g. ‘정원사’, ‘병사’, ‘신하’, ‘왕자와 공주’, ‘하객’, ‘하트 잭’, ‘하트 왕’, ‘하트 여왕’ 등
개념을 이용해 공통점을 갖는 객체들을 분류할 수 있음 !!!
분류란
객체에 특정한 개념을 적용하는 작업이다.
객체에 특정한 개념을 적용하기로 결심했을 때 우리는 그 객체를 특정한 집합의 멤버로 분류하는 것.
분류가 객체지향의 품질을 결정함추상화의 두 가지 차원
→ 사물 간의 공통점만 취하고 차이점은 버림
→ 필수적인 부분을 강조하기 위해 불필요한 세부사항은 무시
개념은 구체적인 사물들 간의 공통점을 기반으로 만든 분류 체계
→ 따라서, 추상화의 두 가지 차원 중, 사물 간의 공통점을 취한 것에 해당
타입
타입의 정의타입은 개념과 동일하다.
따라서
타입이란 우리가 인식하고 있는
다양한 사물이나 객체에 적용할 수 있는 아이디어나 관념을 의미한다.어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의
인스턴스라고 한다.타입의 인스턴스는 타입을 구성하는 외연인 객체 집합의 일원이 된다.
타입에 관한 두 가지 조언
타입은 데이터가 어떻게 사용되느냐에 관한 것
→ 숫자형 데이터들끼리는 사칙연산이 가능
→ 문자열 데이터들끼리는 두 문자열을 연결하거나 길이를 알 수 있음
→ 데이터의 타입을 결정하는 것은, 데이터에 적용할 수 있는 작업, 즉, 연산자
→ 데이터에 어떤 연산자를 적용할 수 있는지가 이 데이터의 타입을 결정함
타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부에서 철저히 감춰짐
데이터 타입의 정의데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터다.
데이터에 대한 분류는 암시적으로 어떤 종류의 연산이 해당 데이터에 대해 수행될 수 있는지를 결정한다.
객체에 관한 두 가지 조언
이전에 ‘타입에 관한 두 가지 조언’과 동일
어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동
→ 동일한 행동을 한다면, 동일한 객체로 분류 가능
객체가 내부적으로 어떻게 표현되는지는 외부에서 철저히 감춰짐
→ 객체의 타입은 내부 표현과는 일절 상관 없음
어떤 객체를 다른 객체와 동일한 타입으로 분류하는 기준 ?
→ 두 객체가 동일한 행동을 하는지
→ 동일한 상태를 갖고 있더라도, 다른 행동이라면 다른 타입
→ 객체의 타입을 결정하는건 객체의 행동 뿐
같은 타입 = 동일한 행동
→ 동일한 행동 = 동일한 책임
→ 동일한 책임 = 동일한 메시지의 수신
→ 같은 타입인 객체는, 내부의 데이터 표현 방식이 다르더라도, 동일한 메시지를 수신해 이를 처리할 수 있음
→ But, 메시지의 처리 방식은 다를 수 있음
→ 다형성
객체가 할 수 있는 행동만을 외부에 공개하고, 내부의 데이터는 행동 뒤로 감춰야 함
→ 캡슐화
객체를 원활히 분류하기 위해서는 내부의 데이터가 아니라 외부의 행동을 먼저 고려해야 함
1) 객체가 외부에 제공해야 하는 책임을 결정
2) 책임을 수행하는 데 적합한 데이터를 결정
3) 책임을 수행하는 데 필요한 외부 인터페이스 뒤로 데이터를 캡슐화
→ 책임-주도 설계
정원사, 병사, 신하, 왕자, 공주 등은 정말 ‘트럼프’ 일까 ?
→ 카드게임을 할 때 트럼프와 외형은 동일하지만, 행동은 동일하지 않음
→ ‘트럼프’가 아니라 ‘트럼프 인간’이 더 정확
→ ‘트럼프 인간’ 타입은 ‘트럼프’ 타입의 객체가 할 수 있는 행동 + 걸어다니는 행동 할 수 있음
→ ‘트럼프 인간’은 ‘트럼프’보다 조금 더 특화된 행동을 함
외연의 관점에서 ‘트럼프’와 ‘트럼프 카드’를 살펴보자
→ ‘트럼프 인간’의 외연은 ‘트럼프’ 외연의 부분집합
→ ‘트럼프 인간’과 ‘트럼프’ 사이의 관계를 일반화/특수화 관계라고 함
일반화와 특수화는 동시에 이뤄짐
→ ‘트럼프 인간’은 ‘트럼프’를 좀 더 구체적으로 표현한 것
→ 어떤 객체가 다른 객체보다 더 구체적인 상태를 표현한다고 일반화 / 특수화 관계가 성립하는 것은 아님
→ 한 타입이 다른 타입보다 더 구체적인 행동을 해야 함
→ 일반화 / 특수화 관계를 결정하는 것도 행동
내연, 외연 관점에서의 일반화 / 특수화 관계
→ 일반적인 타입의 외연은 특수한 타입의 외연보다 크다
→ 일반적인 타입의 내연의 가짓수는 특수한 타입의 내연의 가짓수보다 작다
일반화 / 특수화 관계
→ 슈퍼타입 / 서브타입 관계
→ 슈퍼타입: 일반적인 타입
→ 서브타입: 특수한 타입
슈퍼타입과 서브타입의 관계는 두 타입의 행동에 의해 결정됨
→ 한 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성을 만족해야 함
→ 어떤 타입을 다른 타입의 서브타입이라고 말할 수 있으려면 다른 타입을 대체할 수 있어야 함
→ Liskov Substitution Principle ( LSP )
일반화 / 특수화 관계를 표기하는 방법
→ 슈퍼타입을 상단에, 서브타입을 하단에
→ 속이 빈 삼각형 화살표가 서브타입에서 슈퍼타입을 향하도록 연결
추상화의 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거해 단순화하는 것
→ 앨리스가 ‘트럼프 인간’이 아니라 ‘트럼프’라고 한 이유도 이와 유사
→ ‘트럼프 인간’이 할 수 있는 구체적인 행동은 불필요해서 단순화 한 ‘트럼프’라고 생각
앨리스는 추상화의 두 가지 기법을 모두 사용함
→ 등장인물들 사이의 차이점은 배제하고 공통점만으로 ‘트럼프 인간’으로 분류함
→ ‘트럼프 인간’을 더 단순한 관점에서 바라보고 불필요한 세부 사항은 무시함으로서 ‘트럼프’로 일반화
왜 타입을 사용하는가 ?
→ 인간의 인지 능력으로는 동적으로 변화하는 객체의 복잡성을 따라가기 어렵기 때문
→ 앨리스의 키가 아무리 변해도 앨리스는 앨리스
타입은 동적으로 변화하는 객체의 상태에 무관하게 정적인 모습으로 다룰 수 있게 해줌
결국 타입도 추상화타입은 시간에 따른 객체의 상태 변경이라는 복잡성을 단순화할 수 있는 효과적인 방법
스냅샷: 하나의 객체가 특정 시점에 구체적으로 어떤 상태를 갖는지
→ UML에서 객체 다이어그램이라고도 불림
→ 동적 모델: 스냅샷처럼 객체의 변화를 포착하는 것
타입 모델: 객체가 가질 수 있는 모든 상태와 행동을 시간에 독립적으로 표현한 것
→ 정적 모델 이라고도 함
객체지향 애플리케이션을 잘 활용하기 위해서는 동적 모델, 정적 모델을 적절히 잘 사용해야 함
→ 클래스를 작성하는 시점에는 변화하지 않기 때문에 정적 모델
→ 디버깅 등 객체의 변화를 따라가는 시점에는 동적 모델
객체지향에서 정적인 모델의 ‘타입’은 주로 클래스를 통해 구현됨
→ 하지만, 클래스는 타입의 다양한 구현 방법 중 하나
→ 따라서, 클래스와 타입은 다른 개념
→ 클래스는 타입의 구현 외에도 코드의 재사용의 용도로도 사용됨
객체를 분류하는 기준은 타입 / 타입을 나누는 기준은 객체가 수행하는 행동