IT에 몸담은 이들을 위한 지적생산기술 - ChoDragon9/posts GitHub Wiki
1장 새로운 것을 배우려면
추상이란 무엇인가?
추상/abtract
추상이란 구체적인 대상으로부터 주목해야 할 중요한 부분만 추출하는 것이라는 의미가 있다.
추상의 상은 象라는 한자를 사용한다. 이 한자는 형태라는 의미로 사용된다. 예를 들어, 대상의 상도 같은 한자이고 구상, 인상, 상태, 심상 품경 등의 단어에도 사용된다. 추상의 추(抽)는 꺼내다, 빼내다라는 뜻이다. 추출이나 추천의 추다.
모델, 모형
모델이라는 용어는 특히 자연 과학 분야에서는 모형이라고 해석된다. 예를 들어, 소립자의 표준 모형(Standard Model)이 있다. 아이가 가지고 노는 자동차 모형은 현실의 차와 다르지만, 차를 달리게 해서 논다라는 목적을 달성할 수 있게 중요한 요소만 추출해서 만든 것이다.
모델은 현실 세계의 구조를 설명하기 위해 간략하게 표현한 것이다. 현실 세계에서 발생하는 현상은 복잡하므로 사람의 제한적인 인지 능력 내에서 처리할 수 있는 중요한 부분만 빼서 간단하게 만드는 것이다.
모듈
모델이라는 용어와 관련해서 프로그래밍 언어의 모듈(Module)에 대해 생각 보자. 모델과 모듈은 사실 양쪽 모두 라틴어 modulus가 어원이다.
건축 등의 물리적인 것을 만들 때 모듈이라는 용어를 사용하면 동일한 형태의 부품이 많이 존재한다는 뜻이다.
사람의 이해 능력에는 한계가 있다. 방대한 소스 코드 전체를 머릿속에서 기억하는 것은 불가능하므로 지금 하려는 작업 중에서 중요한 부분에만 주목하고 나머지는 무시하려는 경향이 있다. 하지만 특정 위치의 코드 변경이 다른 곳에도 영향을 주는 경우에는 나머지 부분을 무시할 수 없다.
상호 작용 제한하기
이런 코드 간의 상호 작용을 제한하기 위해 만들어진 것이 모듈 개념이다. 1975년경 프로그래밍 언어 파스칼의 창시자인 니클라우스 비르트(Niklaus Wirth)는 프로그래밍 언어 모듈러(Modular)를 설계했다. 이 언어는 파스칼을 기반으로 모듈 개념을 도입한 것이다.
Modular에서 모듈을 관련성이 강한 코드를 그룹으로 모은 것이었다. 그리고 모듈 안에 있는 구성 요소는 명시적으로 export하지 않으면 모듈 밖에서 참조할 수 없으며, 또한 모듈 밖의 구성 요소는 명시적으로 import하지 않으면 모듈 안을 참조할 수 없는 구조였다. 즉, 프로그래밍 언어의 모듈은 내용의 일부만 공개하고 나머지를 숨기는 구조인 것이다.
중요하지 않는 부분을 숨긴다 = 중요한 부분을 추출한다
지금까지는 추상화가 구제적인 대상으로부터 중요한 부분을 추출하는 것이라 배웠다. 그리고 모델이란 현실의 복잡한 시스템으로부터 중요한 일부만을 추출한 것이라 배웠다. 프로그래밍에서 모듈의 용도는 이 추상화(모델화)다.
Modula와 동일한 시기에 존재했던, 바버라 리스코프(Barbara Liskov)가 만든 프로그래밍 언어인 CLU에서는 모듈로 기능을 모으는 것이 아니라 형을 사용해서 모았다. 그리고 데이터 구조와 그것을 처리하는 순서를 모은 후 데이터 구조의 상세 부분을 감추고 처리 순서만을 공개한 것을 추상 데이터형이라고 불렀다.
이후에 보급된 자바에서는 이 데이터와 처리 순서를 모든 구조를 클래스라고 불렀다.
패턴의 발견
패턴의 발견이란, 구체적인 사례를 모아서 규칙성이나 공통적인 특징, 반복적인 것 등을 찾아낸다는 의미다. 예를 들어, 웹 페이지의 일별 접속 수를 꺾은선 그래프로 그리면 지그재그 형태를 보인다는 것을 알 수 있다. 사실을 가시화함으로써 주기적인 패턴을 발견하는 것이다.
디자인 패턴
패턴이라고 하면 디자인 패턴을 연상하는 사람이 많을 것이다. 디자인 패턴은 프로그램 설계 시에 반복해서 등장하는 구조에 이름을 붙인 것이다. 예를 들어, 서로 간에 바로 상호작용하지 않고 중재자를 통해 처리하는 구조에는 메디에이터(Mediator) 패턴이라는 이름을 붙였다. 사람을 예로 들면, 여러 명이 참가하는 이벤트를 개최할 때 참가자 전원이 일대일로 대화해서 일정을 조율하려고 하면 혼란해질 뿐이다. 따라서 한 명의 중재자를 정해서 정보를 집약하도록 설계하는 것이다.