3장. 타입과 추상화

일단 컴퓨터를 조작하는 것이 추상화를 구축하고, 조작하고, 추론하는 것에 대한 모든 것이라는 것을 깨닫고 나면 (훌륭한) 컴퓨터 프로그램을 작성하기 위한 중요한 전제 조건은 추상화를 정확하게 다루는 능력이라는 것이 명확해진다. - 키스 데블린

추상화란

현실에서 출발하되 불필요한 부분을 도려내가면서 사물의 놀라운 본질을 드러나게 하는 과정

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

즉, 추상화는 복잡한 현실을 단순화하기 위해 사용하는 인간의 가장 기본적인 인지 수단이다.

복잡성과 추상화

  • 구체적인 사물들 간의 공통점은 취하고 차이점은 버리는 일반화를 통해 "단순하게" 만드는 것

  • 중요한 부분을 강조하기 위해 불필요한 세부사항을 제거함으로써 "단순하게" 만드는 것

복잡성을 이해하기 쉬운 수준으로 "단순화" 하는 것이 추상화의 본질이다.

흔히 말하는 객체지향 패러다임은 "객체" 라는 추상화를 통해 현실의 복잡성을 극복하는 패러다임이다.

  • 여기서 말하는 "객체" 는 명확한 경계를 가지고 서로 구별할 수 있는 구체적인 사람이거나 사물을 말한다.

  • 경계가 의미하는 바는 공통점만을 취해 특정 개념으로 단순화하는 것, 이 것 또한 추상화의 일종이다.

[ 개념 ]

객체지향 패러다임의 중심에는 구체적이고 실제적인 객체가 존재하지만 수많은 객체들을 모두 하나의 객체로 인지하기엔 우리가 갖고 있는 기억력은 한계에 부딪힌다.

본능적으로 이런 문제를 극복하기 위해 우리는 객체들간의 특성을 공통화 하여 여러 그룹으로 묶어 기억해야 할 객체 수를 줄임으로써 소프트웨어를 단순하게 다루려고 노력한다.

  • 위에서 언급 된 내용 처럼 "특정 개념"을 이용 하면 여러 그룹으로 "분류" 할 수 있다.

    • 예를 들자면, 트럼프 카드 라는 그룹 내에 하트, 스페이드, 다이아몬드 등 다양한 객체가 있을 수 있는 것 처럼

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

매 순간 세상에 존재하는 무수한 사물들을 개념의 틀로 걸러가며 세상을 추상화한다.

우리는 추상화를 사용함으로써 극도록 복잡한 이 세상을 그나마 제어 가능한 수준으로 단순화할 수 있는 것이다.

만약 우리가 "컴퓨터" 라는 추상화 대상을 얘기할 때 "전산기(電算機), 셈틀)는 방대한 정보(데이터)를 저장하고 검색하고 처리하는, 프로그래밍이 가능한 정보 처리 시스템, 전자적 기계 장치 또는 자동으로 계산(연산)을 수행하고 기계장치" 라고 한다면?

대화할 때마다 굉장히 피곤할 것이다. 이런 것들이 우리 세상을 조금 더 단순하게 바라보게 만든다.

[ 객체와 타입 ]

객체는 행위에 따라 변할 수 있는 상태를 가지고 있다. 이 사실이 곧 모든 객체의 상태를 모으면 애플리케이션에서 관리해야 하는 전체 데이터를 표현할 수 있다는 말이된다.

그럼, 객체는 데이터인가?

객체에서 중요한 것은 상태가 아닌 "행동"이다. 상태는 행동의 "결과"를 쉽게 표현하기 위해 도입한 개념일 뿐이다.

그렇기 때문에, 객체를 창조할 때 가장 중요하게 고려해야 하는 것은 객체가 다른 객체와 협력하기 위해 어떤 행동을 해야할지를 결정하는 것이다.

이 행동이 바로 위에서 설명했던 특정 개념의 일반화로 단순하게 구성할 수 있게 되는 이유가 된다.

  • 엑셀을 밟는다, 브레이크를 밟는다, 핸들을 조작한다 -> 자동차로 일반화할 수 있다.

  • 반면에, 핸들, 엑셀, 브레이크, 속도과 같은 상태는 자동차로 일반화 하기 모호하다.

객체지향 설계를 위한 두 가지 조언

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

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

[ 타입의 목적 ]

타입을 사용하는 이유는 인간의 인지 능력으로 시스템 흐름에 따라 동적으로 변하는 객체의 복잡성을 극복하기 너무 어렵다.

객체가 하는 행동의 결과가 어떻게 나타날지 모두 예측 하면서 개발하는 것은 눈 감고 앞으로 가는 것과 다름 없다.

타입은 추상화이고, 타입을 이용하면 객체의 동적인 특성을 추상화할 수 있다.

즉, 타입은 시간에 따라 객체가 행동하는 결과에 따라 변하는 상태를 최대한 단순하게 표현할 수 있는 효과적인 방법이다.

결국 객체지향에서 중요한 것은 동적으로 변하는 객체의 "상태" 와 상태를 변경하는 "행위"다.

Last updated