현실세계의 모든 것은 복잡하며 예측 불가능하다.
우리는 현실에 존재하는 모든 것과 상호작용하기 위해서 현실을 이해해야한다.
이런 복잡성을 전부 받아드리는 것은 불가능하기에
현실을 이해하기 쉽고 예측 가능하도록 분해하고 단순화 해야한다.
이러한 과정을 추상화라고 한다.
(ex 해리 벡의 지하철 노선도 : 현실의 복잡한 것들을 배제하고 효율적으로 짜여짐)
추상화에서 중요한 두 과정
이 두 과정을 거쳐 복잡한 것을 단순하게 만드는 것이 추상화이다.
아이러니 한 것은 이 단순화하게 만드는 과정이 오히려 한 물체의 복잡도를 극복하며
세부사항, 구조, 양상에 대한 이해도가 상승한다는 것이다. 신기하군

엘리스에 등장하는 정원사, 병사, 신하, 왕자와 공주, 하객과 왕비들, 하트 잭, 하트 왕과 하트 여왕은 모두 다른 존재인 것 같지만 '트럼프' 라는 개념의 모습을 지니고 있기에
'트럼프' 라는 하나의 그룹 (개념) 으로 묶을 수 있다.
이렇게 차이점을 무시하고 공통점을 취한 후 단순화한 개념으로 표현하는 것이 추상화이다.
즉 개념은 객체를 공통점으로 묶기 위한 그릇이라고 생각하면 된다.
개념 내에 있는 객체를 인스턴스라고 한다.
개념을 이용하여 인스턴스의 모임으로 분류 할 수 있게되는 것이다.
타입 = 개념이지만
컴퓨터 내부에서의 타입은 좀 더 기계적일 수 밖에 없다.
메모리 내부에 존재하는 데이터들도 각자의 개념 즉 타입이 존재한다
문자로 이루어진 데이터, 계산이 가능한 데이터 이런 식으로 해당 데이터가 수행 가능한 작업을
구분하는 개념들로 분리할 수 있게되는 것이다.
모든 메모리 내부의 데이터들은 0과 1로 구성된 복잡한 비트열로 보이겠지만
이것을 작업을 통해 타입으로 분류하게 되면서 우리는 단순하게 사용할 수 있다.
객체도 같다.
어떤 객체가 어떤 타입에 속하는지 결정하는 것은 객체가 수행하는 행동(책임,역할) 이다.
또한 객체의 내부적 표현은 외부로부터 철저하게 감춰진다.
행동을 효과적으로 수행할 수만 있다면 내부 상태는 어떤 방식으로 표현되든 무방하다.
즉 내부 표현 방식이 어떻든 동일한 행동을 한다면 그 객체들은 동일한 타입이라고 할 수 있다.
이것은 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력인 다형성을 의미한다.
실제 트럼프와 엘리스 이야기에 등장하는 트럼프 인간이 있다.
트럼프 인간은 트럼프가 할 수 있는 모든 행동 + 추가적인 행동을 할 수 있다.
이 두 개념 사이의 관계를 일반화/특수화 관계라고 한다.
트럼프가 일반적인 개념, 트럼프 인간은 트럼프를 좀 더 특수하게 표현한 개념이다.
일반화/특수화도 행동에 의해서 결정된다.
일반적인 타입이 할 수 있는 행동 + 부가적인 행동을 가져야 특수한 타입이 되는 것이다.
타입이 필요한 이유는 객체의 시시각각으로 변하는 복잡성 때문이다.
객체는 시간에 따라 동적으로 상태가 변하지만 이것을 시간과 무관하게 정적으로 표현할 수
있게 도와주면서 복잡성을 극복할 수 있다.
우리는 객체를 생각할 때 두 모델을 고려한다.
객체지향 애플리케이션을 설계/구현하려면 동적 모델과 정적 모델을 적절히 혼용해야한다.
정적인 모델은 클래스를 통해 구현된다.
따라서 타입을 구현하는 가장 보편적인 방법은 클래스이다.
하지만 클래스는 타입을 구현하는 매커니즘 중 하나일 뿐이다. (클래스는 타입이 아님)
클래스는 타입 구현 외에도 코드 재사용 용도로도 사용된다.
객체를 분류하는 기준이 타입이며 타입을 나누는 기준은 객체의 행동이라는 사실을 명심해라
객체지향 설계의 품질은 늘 말했듯이 객체들이 모여 이뤄낸 협력의 품질이다.
따라서 협력에 초점을 맞춰 애플리케이션을 설계하면 저절로 객체의 행동과 상태가 결정된다.
객체가 어떤 요청에 응답하여 적절한 행동을 할 의무가 있는 경우를 책임을 가진다 라고 한다.
협력에 참여하는 객체들은 목표를 달성하는데 필요한 책임을 수행한다.
책임은 객체가 무엇을 알고 있는가, 무엇을 할 수 있는가로 구성된다.
협력이 이루어지는 방식은 한 객체가 다른 객체로부터 요청받았을 때 책임을 수행하면서 이루어진다
요청하는 것을 메시지 전송 이라고한다.
어떤 객체가 수행하는 책임의 집합은 객체가 협력 안에서 수행하는 역할을 암시한다.
책임의 집합 = 곧 역할.
그러므로 역할을 재사용이 가능하고 유연한 객체지향 설계를 하는데 도움을 준다.
왜? 역할은 해당 역할을 수행하고 있는 객체를 다른 객체로 대체할 수 있음을 나타내기 때문이다.
대체가 가능한 객체는 동일한 메시지를 이해할 수 있는 객체이다.
동일한 역할을 수행한다는 것은 협력 내에서 동일한 책임의 집합을 수행할 수 있음을 의미하며
이는 동일한 메시지를 수신/이해할 수 있다는 의미이다.
이는 객체지향 설계의 단순성, 유연성, 재사용성을 뒷받침한다.
어쩄든 결국 객체는 협력이라는 문맥안에서 책임을 분배하고
그 책임에 맞는 상태와 행위를 고민해야한다.
역할, 책임, 협력이 제일 중요한 요소인것을 알게되었으니
이것을 도와주는 3가지 기법을 알아보자
책임 주도 설계는 역할, 책임, 협력을 고안하기 위한 방법과 절차를 제시한다.
핵심은 올바른 책임을 올바른 객체에 할당하는 것이다.
디자인패턴은 책임-주도 설계의 결과를 표현한다
과거의 설계경험, 반복적으로 발생하는 문제의 대한 해답들을 모아둔 것.
특정한 상황에서 이 설계가 왜 더 효과적인지 설명되어있다.
테스트 주도 개발은 다양한 설계 경험과 패턴에 대한 지식이 있어야함.
객체지향에 대한 깊이 있는 지식이 없다면 힘들다.
역할 책임 협력에 집중하고 객체지향 원칙을 적용하려는 노력이 있어야 사용할 수 있다.
추상화는 현실의 복잡성을 단순화하고 이해하기 쉽게 만드는 과정으로,
공통점을 취하고 불필요한 세부사항을 제거한다.
타입은 객체의 행동에 따라 구분되며,
객체의 내부 상태는 감춰져도 동일한 행동을 수행할 수 있는 다형성을 가진다.
객체지향 설계에서 동적 모델과 정적 모델을 혼용하며,
클래스는 타입 구현의 한 방법으로 코드 재사용에도 활용된다.
추상화란 복잡한 현실 세계를 이해하기 쉽고 예측 가능한 형태로 단순화하는 과정을 의미합니다.
이 과정에서 '일반화'는 다양한 사물 간의 공통점을 찾아내어 범주화하는 것을 말하며,
'단순화'는 불필요한 세부사항을 제거하여 핵심 요소만 남기는 것입니다.
예를 들어, '자동차'라는 개념을 생각해보면,
다양한 종류의 자동차(세단, SUV, 트럭 등)가 있지만,
이들 모두는 '자동차'라는 공통된 특성을 가지고 있습니다.
일반화를 통해 우리는 이들 차량을 '자동차'라는 하나의 그룹으로 묶을 수 있습니다.
단순화의 예로는 자동차의 기능을 '이동 수단'으로 축소해 이해할 수 있습니다.
즉, 복잡한 자동차의 다양한 기능(내비게이션, 오디오 시스템 등)을 배제하고
이동이라는 기본적인 목적에 집중하는 것입니다.
객체지향 설계에서 역할, 책임, 협력은 설계 품질을 결정짓는 핵심 요소입니다.
객체는 특정 역할을 수행하며, 각 객체는 자신의 책임을 가지고 다른 객체와 협력합니다.
이러한 협력은 객체들이 공동의 목표를 달성하기 위해 서로 메시지를 주고받으며 이루어집니다.
객체가 협력하는 방식은 설계 품질에 큰 영향을 미칩니다.
협력이 잘 이루어지면 객체 간의 결합도가 낮아져 유연성과 재사용성이 증가합니다.
반대로 협력이 원활하지 않으면 객체 간의 의존성이 높아져
유지보수가 어려워지고 코드의 복잡성이 증가할 수 있습니다.
따라서, 역할과 책임을 명확히 정의하고 협력을 통해 목표를 달성하는 방식이 중요합니다.
책임 주도 설계는 시스템의 책임을 객체의 책임으로 분할하여
적절한 객체에 할당하는 방법론입니다.
시스템의 책임을 정의하고 이를 객체의 책임으로 나눈다.
객체가 책임을 수행하는 과정에서 필요한 행동이 있다면 해당 책임을 다른 적절한 객체에 할당한다.
할당된 책임을 가지고 객체들이 협력하여 목표를 달성한다.
이러한 설계를 통해 얻을 수 있는 이점은
명확한 책임 분배:
각 객체가 맡은 역할과 책임이 명확해져서 코드의 가독성과 유지보수가 용이해집니다.
유연성:
객체 간의 협력을 통해 변경이 필요할 경우, 다른 객체로 쉽게 대체할 수 있습니다.
재사용성:
잘 정의된 책임과 역할 덕분에 객체를 재사용할 수 있는 기회가 늘어납니다.
이러한 점들은 객체지향 설계의 품질을 높이고,
시스템의 복잡성을 효과적으로 관리하는 데 기여합니다.