객체지향의 사실과 오해 스터디

[객체지향의 사실과 오해] Chapter 3

changha. 2023. 11. 12. 23:10

타입과 추상화

초창기 지하철 노선도는 최대한 사실적으로 지형을 묘사하려 했지만 중요한 것은 그게 아니다.

지하철을 이용하는 승객의 목적은 하나의 역에서 다른 역으로 이동하는 것이다. 따라서 어떤 역에서 출발,환승을 해야 하는지,

어떤 역을 거쳐야 가장 쉽고 빠르게 목적지에 도착할 수 있는지가 중요하다.

그래서 지형의 정확성보다는 필요한 목적에 집중한 결과가 현재까지도 적용되고 있는 지하철 노선도이다. 

여기서 저자는 지하철 노선의 추상화에 대해 소개 해 주고 싶었던 것 같다. 

 


추상화를 통한 복잡성 극복 

추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것이다. 

 

지하철 노선도 예시를 통해서 알 수 있듯이 지형 정보를 제거하고 역 사이의 연결성을 강조함으로써 승객들의 목적에 맞게 단순화 시켰다. 

해리 백이 고안한 지하철 노선도도 정확한 위치와 실제 거리를 알고자 하는 경우에는 적절하지 않다.

따라서 어떤 추상화도 의도된 목적이 아닌 다른 목적으로 사용되면 오도 될 수 있다.

 

객체지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다. 

객제치향과 추상화

 

모두 트럼프일 뿐

이상한 나라의 엘리스의 한 스토리를 소개해 준다. 간략히 얘기하자면 트럼프로 생긴 정원사들과 뒤이어 등장하는 하트 왕과 하트 여왕, 왕자, 공주, 그리고 하얀 토끼 등등. 이런 인간들을 엘리스는 '기껏해야 트럼프에 불과해. 무서워할 필요 없어'라고 마음 속으로 속삭인다.

 

여기서 엘리스는 정원사, 하트 왕, 하트 여왕, 왕자, 공주 등등 각각의 객체들을 '트럼프'라는 하나의 개념을 단순화 시켰다.

여기서 다양한 인물들의 특징들을 무시한 채 '트럼프'라는 유사성을 기반으로 추상화해서 바라보고 있는 것이다.

 

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

여기서 등장하는 정원사, 병사, 신하, 왕자와 공주, 하객으로 참석한 왕과 왕비들, 하트 잭, 하트 왕과 하트 여왕의 모습들은 각자 다를 것이며 서로 쉽게 구분할 수 있다. 이러한 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서는 객체라고 한다. 

엘리스는 이러한 객체들을 어떻게 '트럼프'라는 한 단어로 줄여 지칭할 수 있었을까?

다들 알다시피, '트럼프'라고 했을 때 떠오르는 일반적인 외형과 행동 방식을 지니고 있기 때문이다. 하지만 하얀 토끼는 '트럼프'그룹에 속하지 않는다.

따라서 정원에 있는 인물들을 두 개의 그룹으로 나눌 수 있다. 하나는 트럼프의 그룹, 또 하나는 토끼의 그룹이다. 

이런 그룹화를 통해 정원에 내재된 복잡성을 효과적으로 감소시킨다. 

 

개념 

객체지향의 패러다임의 중심에는 구체적이고 실제적인 객체가 존재하지만 모든 객체를 개별적인 단위로 취급하기에는 인간의 인지능력이 턱 없이 부족하다. 따라서 여러 그룹으로 묶어 가짓수를 줄임으로써 단순화하려고 한다.

이처럼 공통점을 기반을 객체들을 묶기 위한 그릇을 개념(concept)이라고 한다.

 

모니터도 종류에 따른 다양한 모니터가 있을 테지만 '모니터'라는 개념으로 묶음으로써 단순화 시켰다.

앨리스는 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있는 객체만을 트럼프라는 개념으로 추상화했다.

 

개념을 분류하면 여러 그룹으로 분류(classification) 할 수 있다.

 

ex) 하트 여왕은 '트럼프'라는 개념 그룹의 일원이고 하얀 토끼는 '토끼'라는 개념 그룹의 일원이다. 

 

객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스(instance)라고 한다.

 

개념은 세상의 객체들을 거르는 데 사용하는 정신적인 렌즈를 제공한다. 

 

개념의 세가지 관점

개념은 특정한 객체가 어떤 그룹에 속할 것인지를 정한다. 

 

개념의 세가지 관점

✅ 심볼(symbol) : 개념을 가리키는 간략한 이름이나 명칭

✅ 내연(intension) : 개념의 완전한 정의를 나타내며 내연의 의미를 이용해 객체가 개념에 속하는지 여부를 확인할 수 있다.

✅ 외연(extension) : 개념에 속하는 모든 객체의 집합(set)

 

ex) '트럼프'는 개념의 심볼이 된다.

내연은 개념의 의미를 뜻하므로 트럼프에 대한 설명이 내연과 일치한다.(몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있음)  

외연은 개념에 속하는 객체들, 정원사, 병사, 신하, 왕자와 공주, 하객 등등..

 

개념이 3가지로 구성돼있다는 사실보다는 개념을 이용해 객체를 분류할 수 있다는 사실이 더 중요하다. 

 

객체를 분류하기 위한 틀 

어떤 객체아 마주했을 때 객체에게 적용할 개념을 결정하는 것은 결국 해당 객체를 개념이 적용된 객체 집합의 일원으로 맞아들인다는 것을 의미한다.

 

객체에 어떤 개념을 적용할 것인지를 결정하는 것은 결국 객체들을 개념에 따라 분류하는 것과 동일하다.

따라서 분류란 특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 포함시키지 않는 것을 의미한다.

 

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

추상화 두가지 차원

1️⃣ 구체적인 사물 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순화하는 것 

2️⃣ 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거해 단순화 하는 것

 

ex) 1. 정원사, 병사, 신하, 왕자와 공주, 하객으로 참석한 왕과 왕비들.. 트럼프라는 개념으로 묶음 -> 객체 간의 차이점을 버리고 일반화 시킴 

2. 트럼프의 특징은 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있음 -> 이 외의 구체적인 부분은 제거하여 단순화 시킴 

 

개념은 객체들의 복잡성을 극복하기 위한 추상화 도구다.

 

타입 

타입은 개념이다

개념 == 타입(Type) 

완전히 동일하다. 

 

하지만 타입이라는 단어가 컴퓨터 내부로 들어오는 순간 좀 더 기계적인 의미로 윤색될 수 밖에 없음.

헷갈릴 수 있다. 

 

데이터 타입

컴퓨터가 어떤 작업을 수행하기 위해서는 작업에 필요한 데이터를 메모리 안으로 불러들여야 함 -> 

그 데이터는 0과 1의 나열로 되어있음 -> 메모리 세상에는 타입이라는 질서가 없음 -> ex) 메모리 안에 저장된 '10001001'이라는 값이 숫자인지 문자인지, 아니면 메모리상 주소인지 오해를 낳게 됨 -> 애플리케이션 죽음 

그래서 데이터용도와 행동에 따라 그것들을 분류하기 시작한다. == 데이터 타입 (숫자형, 문자형, 논리형 등등)

이런 타입시스템의 목적은 모든 데이터가 비트열로 보임으로써 야기되는 혼란을 방지하는 것이다.

 

타입에 관한 두가지 사실

1️⃣ 타입은 데이터가 어떻게 사용되느냐에 관한 것 

2️⃣ 타입에 속한 데이터를 메모리에 어떻게 표현하는지는 외부러부터 철저하게 감춰진다. 


객체와 타입

위의 타입을 장황하게 얘기한 이유가 객체도 결국 프로그램에서 사용할 데이터 타입을 선언하는 것과 같다. 

 

1️⃣ 어떤 객체가 어떤 타입에 속하는지를 결정하는 것은 객체가 수행하는 행동이다.

2️⃣ 객체의 내부적인 표현은 외부로부터 철저하게 감춰진다.

 

행동이 우선이다 

객체의 행동에 따라 객체의 타입이 결정된다.

 

그렇다면 어떤 객체를 다른 객체와 동일한 타입으로 분류하는 기준이 뭘까?

-> 두 개의 객체가 동일한 행동을 하기만 하면 된다. 

 

동일한 행동 == 동일한 책임 == 동일한 메시지 수신 

즉, 내부 표현 방식 다를 수 있음 => 다형성

 

행동에 따라 객체를 분류하기 위해서는 객체의 내부적인 데이터가 아닌 외부에 제공해야 하는 행동을 먼저 생각해야 한다.

 

ex) 정원의 사람들의 종이 같은 몸이 좌우로 펄럭이는 것, 종이처럼 납작 엎드릴 수 있는 것 등등, 트럼프와 유사한 행동 => 트럼프라는 타입으로 분류 


타입의 계층

 

트럼프 계층

정원의 사람들은 엄연히 따지면 트럼프 카드와 같지 않다.

-> 트럼프 카드는 걸어 다닐 수 없으니까 

 

트럼프 인간이라는 타입으로 분류할 수 있겠다.

이는 곧 트럼프보다 좀 더 특화된 행동을 하는 특수한 개념이다. 

이 두 사이 관계를 일반화/특수화(generalization/specialization)이라고 한다.

 

일반화/특수화 관계

트럼프와 트럼프 인간의 관계는 트럼프 집합 안에 트럼프 인간이 포함된다는 것이다. 

특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행 가능하다.

 

행동의 관점에서 더 일반적인 타입과 더 특수한 타입은 각각 무엇일까?

-> 일반적인 타입은 특수한 타입의 행동들 중에서 일부만 가지는 타입이다. 

 

그러니까 일반적인 타입은 더 적은 수의 행동을 가지지만 더 큰 크기의 외연 집합을 가진다. 

 

슈퍼타입/서브타입

일반적인 타입 == 슈퍼타입

특수한 타입 == 서브타입 

 

두 타입 간의 관계가 행동에 의해 결정된다.

ex) 트럼프 인간은 납작 엎드리거나 뒤집어지기만 하는 경우 트럼프를 대체할 수 있다. 

중복된 행위는 서브타입에서 생략 가능

 

일반화는 추상화를 위한 도구다

앨리스가 '기껏해야 트럼프에 불과해' 라고 했을 때 트럼프 인간을 트럼프로 일반화 함 

-> 객체지향 패러다임의 추상화 두번째 차원을 적용함, 불필요한 트럼프 인간의 특성을 제거해서 단순화 시킴 

 

+) 첫번째 차원도 적용함, 등장인물들의 공통점을 강조함으로써 공통의 타입인 트럼프 인간으로 분류 함 


정적 모델

 

타입의 목적 

 

타입을 왜 사용해야 할까?

-> 시간에 따라 동적으로 변하는 객체의 복잡성을 극복하기가 어렵기 때문에 

 

앨리스가 어떤 음식을 먹을 때마다 키가 커지거나 작아질 때 상태가 변하지만 앨리스의 식별성은 고유하다.

타입의 이점

-> 앨리스의 상태를 시간과 무관한 정적인 모습으로 다루게 해줌, 즉 여러 앨리스라는 객체들을 하나의 정적인 관점에서 표현 가능 

 

그래서 결국 타입은 추상화이다

왜 타입은 추상화일까?

-> 객체의 동적인 특성을 정적인 관점에서 표현가능하므로 추상화할 수 있다. 

ex) 키의 변화 값에 집중하는 것보다 키가 변할 수 있다는 가능성에 집중하는 것이 간단하다. 

 

동적모델과 정적 모델 

객체는 두 가지 모델로 생각 가능하다.

 

1️⃣ 객체가 특정 시점에 어떤 상태를 가지느냐다. 

-> 객체가 살아 움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 포착하는 것을 동적 모델이라고 한다.

 

2️⃣ 객체가 가질 수 있는 모든 상태와 행동을 독립적으로 표현함

-> 타입 모델, or 정적 모델(동적으로 변하는 상태가 아니라 정적인 모습을 표현하므로)

 

클래스

타입을 구현하는 보편적인 방법 == 클래스 

 

둘이 동일한 것이 아님 

-> '타입'은 객체를 분류하기 위해 사용하는 개념이다. 

-> '클래스'는 타입을 구현할 수 있는 여러 구현 메커니즘 중 하나 

 

클래스는 코드의 재사용하는 용도로도 사용하므로 타입과 동일시 할 수 없다.

 

정리하자면

객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다.