목록CS 지식/객체지향 (22)
Taking baby-developer steps
타입의 목적 왜 타입을 사용해야 할까? 객체가 시간에 따라 동적으로 변화할 때 요긴하게 쓰인다. 타입을 사용하면 동적으로 변하는 객체의 상태를 시간과 무관한 정적인 모습으로 다룰 수 있게 한다. 타입은 결국 추상화다 타입은 추상화로 볼 수 있다. 객체에서 불필요한 특정 시간, 상태 변화를 제거하고 정적인 관점에서 객체를 표현할 수 있게 된다. 예를 들어 객체 작가는 "글을 쓴다, 글을 퇴고한다, 글을 삭제한다, 밥을 먹는다"의 행동을 할 수 있다. 작가는 "허기짐"의 상태를 가진다. 앞에서 서술한 작가의 행동 및 상태만으로 객체를 표현할 수 있었다. 이는 시간에 따른 상태변경이 배제된 단순화된 효과적 방법이다. 동적 모델, 정적 모델 스냅샷(snapshot) -> 어떤 객체가 특정 시점에 구체적으로 어떤..
타입의 계층 강아지는 꼬리를 흔들고 물을 마시고 산책을 한다. 골든 리트리버는 강아지의 행동에 더해 물을 보면 돌진해 들어가고, 사람이라면 모두 반기고, 입에 무언가 물고 다닌다. (객체를 결정하는 것은 행동이므로 행동 위주로 썼다) 골든 리트리버는 강아지이기도 하다. 골든 리트리버 타입의 외연(집합)은 강아지의 외연의 부분집합인 셈이다. 골든 리트리버는 강아지 보다 좀 더 특화된 행동을 하는 특수한 개념이다. 일반화/특수화 관계(generalization / specialization) 일반화와 특수화는 동시에 일어난다. 이 때 중요한 것은 일반화/특수화 관계 역시 객체의 "행동"에 의해 결정 된다. 일반화/특수화 관계가 성립하려면 한 타입이 다른 타입보다 더 특수하게/일반적으로 행동해야한다. 일반적인..
타입은 개념이다 어떤 객체에 타입을 적용할 수 있을 때 그 객체를 타입의 인스턴스라고 한다. 개념과 마찬가지로 심볼, 내연, 외연을 이용해 표현할 수 있다. 근본적으로는 개념과 동일 하지만 이를 컴퓨터로 옮기면서 다음과 같은 형태로 나타낸다. 데이터 타입 컴퓨터는 0, 1만으로 데이터를 저장한다. 이에 의미를 부여하기 위해 우리는 "타입 시스템(type system)"을 만들었다. 타입 시스템은 0과 1만으로 이루어진 데이터를 목적에 따라 분류하기 위해 만들었다. 이를 통해 메모리 안에 저장된 0과 1에 대해 '수행가능한 작업'과 '불가능한 작업'을 구분해 데이터가 잘못 사용되는 것을 방지한다. 데이터 타입은 "종류를 분류"하는데 사용하는 메타데이터이다. 데이터에 대한 분류는 어떤 종류의 연산을 수행 할..
분류는 객체지향의 가장 중요한 개념 중 하나다. 어떤 객체를 어떤 개념으로 분류할지가 객체지향의 품질을 결정한다. 분류를 적절한 개념에 따라 분류하지 못한 애플리 케이션은 유지보수가 어렵고 변화에 쉽게 대처하지 못한다. 적절한 분류체계는 애플리케이션을 다루는 개발자의 머릿속에 객체를 쉽게 찾고 조작할 수 있는 지도를 제공하는 셈이다. 최대한 직관적으로 분류하는 것이 중요하다. 분류는 추상화를 위한 도구 추상화가 2가지 차원에서 이뤄진다고 했다. 분류 또한 추상화의 2가지 차원을 모두 사용한다.
세상에는 수 많은 객체들이 있다. 우리는 이 모든 것을 각자 고유한 개별적 단위로 매번 취급하기에는 인지능력이 턱 없이 부족하다. 이때 공통적인 특성을 기준으로 객체를 여러 그룹으로 묶어 동시에 다뤄야하는 가짓수를 줄임으로써 상황을 단순화 할 수 있다. 예를 들어 "사과, 강아지, 해달, 귤, 토끼, 판다, 딸기"가 있을 때 이들을 "과일, 동물"로 묶어서 단순화 할 수 있다. 개념(Concept), 인스턴스(Instance) 객체들을 공통점으로 묶기위한 관념을 말한다. 개념을 이용하면 객체를 여러 그룹으로 분류(Classification)할 수 있다. 사과, 귤, 딸기는 "과일"이라는 개념으로 분류할 수 있고, 강아지,해달,판다 는 "동물"이라는 개념으로 분류할 수 있다. 개념은 객체를 분류할 수 있는..
추상화가 왜 중요할까? 현대의 지하철 노선도를 생각해보자. 실제 지형, 축적은 무시하고 역 사이 연결성에만 집중해있다. 승객들은 지하철을 갈아탈 때 지형, 축적은 관심이 없다. 중요한 것은 역의 순서와 갈아타는 역이다. "승객"이 꼭 "알아야 하는 사실"만 정확하게 표현하고 몰라도 되는 정보는 무시함으로서 이해하기 쉽고 단순하며 목적에 부합한다. 복잡성을 극복하는 추상화 추상화란 불필요한 부분을 가지치기해 사물의 본질을 드러나게 하는 과정이다. 현실에 존재하는 복잡성을 극복할 수 있다. 가장 좋은 추상화는 "목적에 부합"하는 것이다. 이 책에서는 추상화를 다음과 같이 정의한다. 추상화 : 양상, 세부사항, 구조를 좀 더 명확하게 이해하기 위해 특정 절차나 물체를 의도적으로 생략하거나 감춤으로써 복잡도를 ..
객체 지향에서 상태를 먼저 결정하고 행동을 나중에 결정하는 것은 다음과 3가지 이유로 설계에 나쁜 영향을 미친다. 1. 캡슐화 저해 상태에 초점을 맞출 경우, 상태가 객체 내부에 깔끔하게 캡슐화 되지 못하고 공용 인터페이스에 그대로 노출될 수 있는 위험이 높아 진다. 2. 협력성 저하(고립된 섬으로서의 객체) 객체는 협력자여야한다. 존재 이유 자체가 다른 객체와 협력하기 위함이다. 상태를 먼저 고려하게 되면 문맥에서 벗어난 객체가 될 위험이 커진다. 3. 재사용성 저하 재사용성은 협력할 수 있는 능력에 좌우된다. 상태에 초점을 맞춘 객체는 다양한 협력에 참여하기 어렵고 재사용성이 저하된다. 객체는 "협력"하기 위해 존재하며, "행동"이 협력에 참여하는 유일한 방법이다. 우리가 애플리케이션 안에서 어떤 행..
기계로서의 객체 객체 지향의 세계를 창조하는 개발자들은 "객체의 상태를 조회"하고 "객체의 상태를 변경"하는 것이 주 업무이다. 객체의 상태를 조회하는 작업 : 쿼리(query) 객체의 상태를 변경하는 작업 : 명령(command) 라고 일반적으로 부르며, 객체가 외부에 제공하는 행동의 대부분은 쿼리와 명령으로 구성된다. 객체는 일반적으로 기계와 같다. 우리가 기계를 분해해 보기 전까지는 그 내부를 들여다 볼수 없다. 그저 행동 버튼을 통해 결과를 얻는다. 행동 버튼에는 명령과 쿼리가 있다. 명령 버튼을 누른 직후에 그 행동이 기계의 상태를 어떻게 변경시킨지는 알 수 없다. 원하는 상태의 조회 버튼을 눌러야 명령에 의해 변화된 상태를 확인 할 수 있다. 버튼을 눌러 상태를 변경 혹은 조회하는 것을 요청하..
"객체가 식별 가능하다"는 "서로 구별할 수 있는 특정한 프로퍼티가 객체 안에 존재한다"라는 말이다. 모든 객체는 식별자를 가지며, 이를 이용해 객체를 구별할 수 있다. 식별자란 특정한 프로퍼티를 말한다. 값과 객체의 가장 큰 차이점 또한 값은 식별자가 없고 객체는 식별자를 가진다는 것이다. -> 이는 시스템을 설계 할 때 값과 객체의 차이를 명시적으로 표현하는데 매우 중요하다. 값이란, 변하지 않는 불변의 상태(immutable state)를 가진다. 값의 경우 두 인스턴스의 상태가 같다면 두 인스턴스를 같은 것으로 판단한다. "상태가 같으면" 값이 같다. 상태가 다르면 두 인스턴스는 다른 것으로 판단한다. 이처럼 상태를 이용해 두 값이 같은지 판단할 수 있는 성질을 동등성(equality)라고 한다...
- 상태와 행동 객체는 자율적이다. 그러나 객체의 상태가 저절로 변경되진 않는다. 객체의 상태는 자발적인 행동에 의해 변경된다. ("내"가 현관문을 통과하면 나의 위치(상태)가 '집 안'에서 '집 밖'으로 바뀐다) 객체가 취하는 행동은 자신의 상태를 변경 시키는 등의 부수 효과(side effect)를 발생 시킨다. 이상한 나라의 앨리스에서, 앨리스가 물을 마신 행동이 앨리스 자신의 키를 작게 만들(side effect)고 동시에 물병 안에 있는 물의 양도 감소(side effect)시켰다. 앨리스가 문을 통과하는 행동은 앨리스의 위치를 변화시킨(side effect)다. 그러나 당시의 행동은 이전에 일어난 과거 행동에 영향을 받는 것을 지난 포스팅을 통해 알았다. 따라서 행동은 상태에 영향을 받는다. ..