객체지향과 추상화
이전 글에서 객체에 대해 자세히 살펴보았다. 객체는 고정된 속성을 가지는데, 이러한 속성은 어디서 온 것일까? 예를 들어, 온라인 쇼핑몰의 판매자는 주민등록번호와 집 주소, 가족관계 등의 정보가 있을 것이다. 그런데 객체지향의 세계에서는 이러한 정보들이 사라지고, 사업자 번호와 계좌번호 등의 꼭 필요한 정보만 가지게 된다. 이렇게 실제 세계에서의 물체나 개념 등을 객체지향의 세계로 가져오는 것을 추상화라고 한다. 이번 글에서는 추상화를 하는 방법에 대해 자세히 살펴보도록 하자.
단순화
추상화를 위해서는 단순화가 필요하다. 위의 예시처럼 객체지향의 세계에서 해결하려는 문제와 관련된 것만 남기고 관련이 없는 특징들은 숨기는 것이다. 이렇게 단순화를 하기 위해서는 큰 범위에서 공통점을 찾아야 한다. 위 예시에서 온라인 쇼핑몰의 판매자들은 물건을 팔고 돈을 받는다. 이것은 '사람'이라는 큰 범위에서 '판매자'들만이 가지는 공통점을 찾은 것이다. 이렇게 찾은 공통점으로 객체를 단순화시킬 수 있다. '사람'이 가지는 수많은 특징 중 상품을 판매하고, 돈을 받는 것과 관련된 특징들만을 속성으로 정의하면 된다.
분류
객체들의 공통점을 찾았다면 이제 객체들을 분류할 수 있다. 세상에는 수 많은 사람들이 있지만, 그 중에서 물건을 팔고 돈을 받는다는 특징을 갖는 사람들만이 '판매자'로 분류된다. 이렇게 객체들을 구분하기 위한 틀을 개념(concept)이라고 한다. 여기서는 '판매자'라는 개념이 객체를 구분하는 기준이 되었다. 개념에 속하는 수많은 객체들을 인스턴스(instance)라고 부른다.
개념에는 3가지 관점이 존재한다. 심볼(symbol), 내연(intension), 외연(extension)이 그것이다. 심볼은 개념을 가리키는 명칭을 의미한다. 위 예시에서는 '판매자'라는 이름이 심볼에 해당한다. 내연은 개념의 구체적인 정의를 나타내며, 이것을 통해 어떤 객체가 개념에 속하는지 여부를 판단할 수 있다. '판매자'의 예시에서는 '물건을 팔고 돈을 받는 사람'이 내연에 해당한다. 외연은 실제 객체 중 내연의 정의를 만족하는 모든 객체를 의미한다. 예를 들어 어떤 사람이 네이버 스마트스토어에서 물건을 판매하고 있다면 '판매자'의 외연에 속할 것이다.
타입
단순화와 분류를 통해 개념을 정의했다면, 그것을 어떻게 소프트웨어 세계에서 구현할 것인가가 남았다. 개념을 소프트웨어 세계에서는 타입(type)이라고 부른다. 각 객체는 하나 이상의 타입으로 분류될 수 있다. 예를 들어, 어떤 사람은 판매자이면서 동시에 다른 쇼핑몰의 소비자가 될 수도 있다. 이렇게 객체의 타입을 결정하는 것은 객체의 행동이다. 어떤 사람이 쇼핑몰에서 물건을 판매중이라면 그 사람은 판매자 타입의 객체가 되고, 다른 쇼핑몰에서 물건을 산다면 소비자인 것이다.
만약 온라인 쇼핑몰이 아니라 네이버와 같은 종합 서비스라면, 판매자와 소비자를 모두 포함하는 회원 타입이 존재할 수 있다. 회원 타입은 은행 계좌 정보와 주소 등의 정보 뿐만 아니라 구독 중인 서비스 목록 등 쇼핑몰과 관련이 없는 정보들도 포함할 수 있고, 메일을 보내는 등의 행동을 할 수도 있다. 따라서 회원 타입은 비교적 일반화된 타입이고, 판매자 타입은 특수화된 타입이라고 볼 수 있다. 이렇게 일반화된 타입을 슈퍼타입(supertype)이라고 하고, 특수한 타입을 서브타입(subtype)이라고 한다.
서브타입의 객체는 슈퍼타입의 객체이기도 하기 때문에 슈퍼타입의 행동을 대체할 수 있어야 한다. 이것을 리스코프 치환 원칙이라고 한다. 이러한 관계를 생각하면 하나의 슈퍼타입의 객체들은 다양한 서브타입으로 분류될 수 있기 때문에 세부적인 행동이 다를 수 있다. 이것이 객체지향에서 말하는 다형성(polymorphism)의 개념이다.
정리
정리하자면, 우리는 어떤 문제를 해결하기 위해 복잡한 현실 세계의 개념들을 단순화하고 분류를 통해 간단한 개념으로 만들었다. 이렇게 만들어진 추상적인 개념들을 소프트웨어 세계에서 구현할 수 있도록 속성과 행동을 정의한 것이 타입이다. 하나의 객체는 여러 타입이 될 수 있으며, 이러한 타입을 구분하는 것은 객체의 행동이다. 추상화를 이용하면 다양한 객체들을 조합해서 동일한 행동으로 제어할 수 있기 때문에 확장과 변경이 편리해진다는 장점이 있다.
3줄 요약
- 단순화와 분류를 통해 복잡한 현실 세계의 사물과 관념 등을 간단한 개념으로 만들 수 있다
- 추상적인 개념을 소프트웨어 세계에서 구현할 수 있도록 속성과 행동을 정의한 것이 타입이다
- 객체의 타입을 구분하는 데 가장 중요한 것은 객체의 행동이다
'Programming > 객체지향의 사실과 오해' 카테고리의 다른 글
[Programming] 객체지향의 사실과 오해(6) - 기능과 구조 (0) | 2023.05.30 |
---|---|
[Programming] 객체지향의 사실과 오해(5) - 메소드와 인터페이스 (0) | 2023.05.25 |
[Programming] 객체지향의 사실과 오해(4) - 객체지향 설계 기법 (0) | 2023.05.21 |
[Programming] 객체지향의 사실과 오해(2) - 객체의 구성요소 (0) | 2023.05.11 |
[Programming] 객체지향의 사실과 오해(1) - 객체지향 (0) | 2023.05.07 |