🤓 객체지향의 사실과 오해 를 통해서 공부중입니다.
추상화란 현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정이라고 할 수 있다. 즉, 추상화는 통해 어떤 양상, 세부 사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 극복하는 방법이다.
추상화의 목적은 불필요한 부분을 무시함으로써 현실에 존재하는 복잡성을 극복하는 것이다.
(이를 위해 단순화가 필요한데, 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화 하며, 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거한다. )
객체지향 패러다임은 객체라는 추상화를 통해 현실의 복잡성을 극복한다.
앨리스는 클로버 병사들, 신하들, 공주와 왕자, 왕과 왕비, 하트왕과 하트여왕을 트럼프라는 하나의 개념으로 단순화해서 바라본다. 다양한 인물들을 계급, 나이, 성격 등의 차이점은 무시한 채, 트럼프라는 유사성을 기반으로 추상화해서 바라본다.
명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이나 사물을 객체지향 패러다임에서는 객체라고 한다. 정원사, 병사, 신하, 공주와 왕자, 왕과 왕비
는 트럼프
라고 했을 때 떠오르는 일반적인 외형과 행동방식을 지니고 있기 때문에, 이들의 차이점을 무시하고 트럼프
라고 줄여 부를 수 있다. 앨리스는 자신이 알고 있는 트럼프
의 의미에 적합한 이물은 트럼프
그룹에 포함하고, 이에 적접하지 않은 인물은 트럼프
그룹에서 제외시켜, 트럼프
그룹과 토끼
그룹으로 나누었다. 다수의 개별적인 인물이 아니라 트럼프
와 토끼
라는 두 개의 렌즈를 통해 정원을 바라보는 것은 정원에 내재된 복합성을 감소시킨다.
앨리스가 인물들의 차이점을 무시하고 공통점만을 취해 트럼프라는 개념으로 단순화한 것 은 추상화의 일종이다. 이처럼 공통점을 기반으로 객체들을 묶기 위한 그릇을 개념이라고 한다. 개념을 이용하면 객체를 여러 그룹으로 분류할 수 있다.
하트 여왕은 트럼프
라는 개념 그룹의 일원이고, 하얀 토끼는 토끼
라는 개념 그룹의 일원이다. 이처럼 객체에 어떤 개념을 적용하는 것이 가능해서 개념 그룹의 일원이 될 때 객체를 그 개념의 인스턴스라고 한다.
어떤 객체에 어떤 개념이 적용됐다고 할 때는, 그 개념이 부가하는 의미를 만족시킴으로써 다른 객체와 함께 해당 개념의 일원이 됐다는 것을 의미한다.
객체의 분류 장치로서 개념을 이야기할 때, 다음의 세 가지 관점을 언급한다.
심볼
은 개념을 가리킨다. 앨리스 이야기에서 개념을 지칭하는 데 사용하는 트럼프
라는 이름은 개념의 심볼이 된다.
내연
은 개념의 의미를 나타낸다. 앨리스 이야기에서 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있다는 트럼프에 대한 설명이 내연이다. 내연은 개념을 객체에게 적용할 수 있는지 여부를 판단하기 위한 조건이다. 하얀 토끼는 트럼프의 내연을 만족시키지 못하기 때문에 트럼프가 될 수 없다.
외연
은 개념에 속하는 객체들, 개념의 인스턴스들이 모여 이뤄진 집합을 가리킨다. 앨리스 이야기에서 정원사, 병사, 신하, 왕자와 공주, 왕과 여왕 모두 트럼프의 외연을 구성하는 객체 집합에 속한다.
개념을 이용해 공통점을 가진 객체들을 분류하는 것은 객체지향 패러다임이 복잡성을 극복하는 데 사용하는 가장 기본적인 인지 수단이다.
외연의 관점에서 어떤 객체에 어떤 개념을 적용할 수 있다는 것은 동일한 개념으로 구성된 객체 집합에 해당 객체를 포함시킨다는 것을 의미한다. 객체에 어떤 개념을 적용할 것인지를 결정하는 것은 객체들을 개념에 따라 분류시키는 것과 동일하다. 따라서 분류란 특정한 객체를 특정한 개념의 객체 집합에 포함시키거나 포함시키지 않는 작업을 의미한다.
객체를 적절한 개념으로 분류한 애플리케이션은 유지보수가 용이하고 변경에 용이하게 대처할 수 있다. 반면에 객체를 적절한 개념으로 분류하지 못한 애플리케이션은 유지보수가 어렵고 변화에 쉽게 대처하지 못한다.
추상화는 두 가지 차원에서 이뤄진다. 첫 번째 차원은 구체적인 사물 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 단순화하는 것이다. 두 번째 차원은 중요한 부분을 강조하기 위해 불필요한 세부 사항을 제거해 단순화하는 것이다. 개념을 통해 객체를 분류하는 과정은 추상화의 두 가지 차원을 모두 사용한다.
앨리스의 이야기에서 정원사, 병사, 신하, 왕자와 공주, 왕과 여왕을 트럼프라는 개념으로 묶은 것은 개별 객체 간의 차이점은 무시하고 공통점을 취한 결과로, 추상화의 첫 번째 차원인 일반화를 적용한 것이다.
트럼프에 속하는 객체들의 공통점 중에서 중요하게 생각한 특징은 몸이 납작하고 두 손과 두 발이 네모난 몸 모서리에 달려 있다는 것 뿐이며, 그 외의 사항들은 무시하는 것은 추상화의 두 번째 차원에 따라 불필요한 세부사항을 제거한 것이다.
타입은 공통점을 기반으로 객체들을 묶기 위한 틀이다. 개념과 마찬가지로 심볼, 내연, 외연을 이용해 서술할 수 있으며, 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다.
데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터이다. 데이터에 대한 분류는 암시적으로 어떤 종류의 연산이 해당 데이터에 대해 수해될 수 있는지를 결정한다.
객체가 어떤 행동을 하느냐에 따라 객체의 타입이 결정되며, 객체의 타입은 객체의 내부 표현과는 아무런 상관이 없다. 따라서 객체의 내부 표현 방식이 달라도 객체들이 동일하게 행동한다면, 그 객체들은 동일한 타입에 속한다. 동일한 행동이란 동일한 책임을 의미며, 동일한 책임은 동일한 메시지 수신을 의미한다. 다만 내부의 표현 방식이 다르면 동일한 메시지를 처리하더라도 방식은 다를 수 있다. 이것은 다형성에 의미를 부여한다. 다형성은 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다.
외부에 행동만을 제공하고 데이터는 행동 뒤로 감춰야 하는 원칙을 캡슐화라고 한다. 공용 인터페이스 뒤로 데이터를 캡슐화하는 것은 객체를 행동에 따라 분류하기 위해 지켜야하는 기본적인 원칙이다.
일반화와 특수화는 동시에 일어난다. 더 특수하다는 것은 일반적인 개념보다 범위가 더 좁다는 것을 의미한다. 집합의 관점에서 특수한 개념을 표현하는 것은 좀 더 일반적인 개념을 표현하는 것의 부분 집합이 된다.
특수한 타입은 일반적인 타입이 할 수 있는 모든 행동을 동일하게 수행할 수 있으며, 일반적인 타입에 비해 더 많은 행동을 가진다. 따라서 일반적인 타입은 특수한 타입보다 더 적은 수의 행동을 가지지만 더 큰 크기의 외연 집합을 가진다.
일반화/특수화 관계에서 좀 더 일반적인 타입을 슈퍼타입이라고하고 좀 더 특수한 타입을 서브타입이라고 한다. 어떤 타입을 다른 타입의 서브타입이라고 하려면 다른 타입을 대체할 수 있어야 한다. 서브타입은 슈퍼타입의 행위에 추가적으로 특수한 자신의 행동을 추가하는 것이므로 슈퍼타입의 행동은 서브타입에게 자동으로 상속된다.
타입은 시간에 따라 동적으로 변하는 개체의 복잡성을 극복하기 위해서 사용한다. 앨리스 이야기에서 앨리스의 키는 앨리스가 어떤 음식을 먹을 때마다, 어떤 행동을 할 때마다 시시각각 변한다. 앨리스라고 하는 객체의 상태는 변하지만, 앨리스를 다른 객체와 구별할 수 있는 식별성은 유지된다. 따라서 앨리스가 가질 수 있는 모든 키의 경우의 값을 나열하는 대신, 앨리스의 키가 임의의 값을 가질 수 있다는 것만 생각함으로써 상황을 단순하게 만들 수 있다. 타입은 동적으로 변하는 앨리스의 상태를 정적인 관점에서 표현할 수 있게 해준다.
객체가 특정 시점에 구체적으로 어떤 상태를 가지는지를 객체의 스냅샷이라고 하며, 객체 다이어그램이라고도 한다. 스냅샷처럼 객체가 살아움직이는 동안 상태가 어떻게 변하고 어떻게 행동하는지를 포착하는 것을 동적 모델이라고 한다.
객체가 가질 수 있는 모든 상태와 모든 행동을 시간에 독립적으로 표현하는 모델을 타입 모델이라고 하며, 정적 모델이라고도 한다. 동적으로 변하는 객체의 상태가 아니라 객체가 속한 타입의 정적인 모습을 표현하기 때문이다.
객체지향을 위해서는 객체 관점은 동적모델과 객체를 추상화한 타입 관점의 정적 모델을 적절하게 혼용해야 한다.
객체지향에서 정적 모델은 클래스를 이용해 구현된다. 타입은 객체를 분류하기 위해 사용하는 개념인 반면, 클래스는 타입을 구현할 수 있는 여러 구현 매커니즘 중 하나이다.
객체를 분류하는 기준은 타입이며, 타입을 나누는 기준은 객체가 수행하는 행동이다. 객체를 분류하기 위해 타입을 결정한 후 프로그래밍 언어를 이용해 타입을 구현할 수 있는 방법 중 한 가지가 클래스인 것이다.