티스토리 뷰
728x90
추상화를 통한 복잡성 극복
- 복잡성의 총체인 현실을 그대로 수용하기에 인간의 인지 능력과 저장 공간이 제한적임
- 본능적으로 이해하기 쉽고 예측 가능한 수준으로 분해하고 단순화하는 전략을 따름
추상화란?
- 불필요한 부분을 도려내면서 사물의 본질을 드러나게 하는 과정
- 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성 제거를 목적으로함
추상화의 두가지 차원
- 구체적인 사물들간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순하게 만듦
- 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거하여 단순하게 만듦
객체지향과 추상화
앨리스 이야기
🏰 앨리스 두번째 이야기 요약
아름다운 정원에 들어선 앨리스는 정원사들과 마주쳤다. 정원사들은 트럼프처럼 생겼고 스페이드 무늬가 그려져 있었다 ….
하트 여왕의 행렬이 정원에 들어섰다. ….
행렬의 맨앞에서 클로버를 든 병사들이 행진해 들어왔다. 그뒤로 다이아몬드로 치장한 신하들이 열을 지어 들어왔다.
…. 그속에는 하얀 토끼도 섞여있었다.
…. 앨리스는 여왕을 쳐다보며 마음속으로 이렇게 속삭였다. ’기껏해야 트럼프에 불과해. 무서워할 필요 없어’
위 이야기에서 수많은 객체들(정원사, 병사, 여왕…)이 등장하나 앨리스는 각 객체의 차이점은 무시한채 공통점만 취해 트럼프라는 하나의 개념으로 단순화 함 (추상화)
그룹 나누어 단순화 하기
- 객체지향에서는 명확한 경계를 가지고 구별할수 있는 사람이나 사물을 객체라고 함
- 이야기에서 앨리스는 전체 객체를 ‘트럼프’와 ‘토끼’ 두 개념으로 나누어 단순화 시킴
개념
- 인간은 본능적으로 공통적인 특성을 기준으로 그룹으로 묶어 단순화하려고 노력함
- 공통점을 기반으로 객체들을 묶기위한 그릇을 개념이라고 함
- 개념을 이용한면 객체를 여러 그룹으로 분류할 수 있음
- 객체에 어떤 개념을 적용해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스라고 함.
개념의 세가지 관점
- 심볼: 개념을 가리키는 간략한 이름이나 명칭 (ex. 트럼프)
- 내연: 개념의 완전한 정의를 나타내며 객체가 개념에 속하는지 여부 확인 가능 (ex. 몸이 납작하고 두손과 두발은 네모 귀퉁이에 달려있는 등장인물)
- 외연: 개념에 속하는 모든 객체의 집합 (ex. 정원사, 병사, 신하, 여왕..)
객체를 분류하기 위한 틀
- 분류란 특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 시키지 않는 작업을 의미
- 객체를 적절한 개념에 분류한 애플리케이션은 유지보수가 용이하고 변경에 유연함
- 적절한 분류체계는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 지도를 제공함
타입
- 타입의 정의는 개념의 정의와 동일함
- 타입은 공통점을 기반으로 객체들을 묶기 위한 틀임
객체와 타입
- 어떤 객체가 어떤 타입에 속하는지 결정하는것은 객체가 수행하는 행동임
- 객체의 내부적인 표현은 외부로부터 철저하게 감춰야함
행동이 우선이다
- 동일한 책임(행동)을 수행하는 일련의 객체는 동일한 타입에 속함
- 객체의 타입을 결정하는것은 객체의 행동일 뿐 데이터(상태)는 아무런 영향도 미치지 않는다
- 동일한 타입에 속한 객체는 내부 표현 방식이 다르더라도 동일한 메시지를 수신하고 처리 할 수있음 (다형성)
- 다만, 처리하는 방식은 서로 다를 수밖에 없음
- 행동만이 고려 대상이며 데이터는 감춰야함 (캡슐화)
- 객체를 행동에 따라 분류하기 위해 지켜야 하는 기본 원칙임
타입의 계층
일반화와 특수화
- 일반화/특수화 관계를 결정하는 것은 객체의 행동
- 일반적인 타입이란 특수한 타입이 가진 모든 행동들 중 일부 행동만 가지는 타입
- 특수한 타입이란 일반적인 타입이 가진 모든 행동과 자신만의 행동을 추가한 타입
슈퍼타입과 서브타입
- 일반적입 타입 = 슈퍼타입, 특수한 타입 = 서브타입
- 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 행위적 호환성이 만족되야함
- 서브타입은 슈퍼타입의 행위와 호환되기 때문에 서브타입은 슈퍼타입을 대체 가능해야함
// 슈퍼타입: 동물을 나타내는 추상 클래스
abstract class Animal {
abstract void makeSound();
}
// 서브타입 1: 강아지 클래스, 동물을 확장하여 특화된 행위를 추가
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("멍멍!");
}
void wagTail() {
System.out.println("꼬리를 흔들다.");
}
}
// 서브타입 2: 고양이 클래스, 동물을 확장하여 특화된 행위를 추가
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("야옹!");
}
void scratch() {
System.out.println("할퀴다.");
}
}
public class Main {
public static void main(String[] args) {
// 슈퍼타입 참조 변수로 서브타입 객체를 다루기
// 서브타입이 슈퍼타입을 대체
Animal myDog = new Dog();
Animal myCat = new Cat();
// 슈퍼타입의 메서드 호출 (다형성)
myDog.makeSound(); // "멍멍!"
myCat.makeSound(); // "야옹!"
// 서브타입 고유의 메서드 호출
((Dog) myDog).wagTail(); // 꼬리를 흔들다.
((Cat) myCat).scratch(); // 할퀴다.
}
}
UML 표기 방법
타입의 목적
- 타입을 사용하는 이유는 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기 어렵기 때문
- 객체가 가질수 있는 모든 경우를 나열하는 대신 임의의 값을 가질 수 있다는 사실만 고려함으로써 단순화 시킴
결국 타입은 추상화다
- 타입을 이용하면 객체의 동적인 특성을 추상화 할 수 있음
- 타입을 이용하면 시간에 따른 객체의 상태변경이라는 복잡성을 단순화할 수 있음
클래스
- 타입을 구현하는 가장 보편적인 방법은 클래스를 이용하는 것임
- 클래스는 타입 구현 이외에도 코드 재사용 용도로 사용됨
- 객체를 분류하는 기준은 타입이며 타입을 나누는 기준은 객체가 수행하는 행동(책임)임
- 객체를 분류하기 위해 타입을 결정한 후 언어를 통해 타입을 구현하는 한가지 방법이 클래스
객체지향에서 중요한 것은 동적으로 변하는 객체의 ‘상태’와 상태를 변경하는 ‘행위’임.
클래스는 타입을 구현하기 위해 언어에서 제공하는 구현 메커니즘일 뿐!
728x90
'독서 > 객체지향의 사실과 오해' 카테고리의 다른 글
chapter6. 객체지도 (1) | 2023.12.22 |
---|---|
chapter5. 책임과 메시지 (1) | 2023.12.22 |
chapter4. 역할, 책임, 협력 (1) | 2023.12.22 |
chapter2. 이상한 나라의 객체 (0) | 2023.12.22 |
chapter1. 협력하는 객체들의 공동체 (0) | 2023.12.22 |
댓글