IMG_7728.jpg

opentutorials.org라는 사이트를 예를 들어 보자.

이 프로그램 안에는 글목록을 출력해주는 logic, 글 본문을 출력해주는, 댓글을 출력, 추가, 수정하는 logic(변수, 메서드)이 있을 것이다.

즉, 하나의 프로그램은 단일 logic으로 구성되는 것이 아닌 여러 개의 목적성을 지닌 logic들의 집합이라고 할 수 있다.

초기 서비스 및 애플리케이션 구축할 때에는 코드가 많지 않기 때문에 이전 절차지향프로그래밍 중 조건문, 반복문 등을 통해 opentutorials 사이트를 충분히 구축할 수가 있다. 사이트의 규모가 커지면서 작업 인원이 증가하고 오랜 기간 프로젝트가 진행되는 과정에서 여러 가지 어려움(막장?)을 겪게 된다.

이러한 어려움을 극복하기 위해 사이트 속 logice들을 기능별로 그룹핑하는 일을 하는 것이 객체 지향 프로그래밍이다.

변수와 메서드를 서로 연관돼 있는 기능별로 그룹핑하는 기능을 프로그래밍, 언어차원에서 제공하는 것이다. 이렇게 그룹핑한 하나하나 단위를 객체라고 한다.

글목록, 본문, 댓글이라는 각 객체 안에는 각 객체와 관련된 변수와 메서드로 응집돼 있다. 동시에 서로 연관성이 없는, 다른 성격을 갖고 있는 객체는 서로 분리, 구분돼 있다는 기능을 갖고 있다.

연관성에 의해 객체를 구분한 뒤 각 객체의 기능을 보았을 때 하나의 객체 기능이 꼭 현재 사이트에서만 사용하는 것이 아닌 다른 사이트, 앱에서도 사용이 가능하다는 것이다.

이 프로그램에서 가장 중요한 개념 중 하나인 재활용성의 가능성이다.

객체 지향 프로그래밍이란 객체를 만드는 것이고, 그 객체는 추상적 대상이 아닌 구체적, 문법적 기능이 언어차원에서 제공되는 기능이다. 하나의 객체 안에는 객체가 추구하는 취지, 기능(글목록, 본문, 댓글 기능)에 따라서 그와 연관돼 있는 변수와 메서드를 객체라는 단단한 껍데기 안에 가둬 둔 것이고, 서로 연관성이 없는 다른 logic과 구분해주는 역할을 하는 것이 객체라고 한다.

추상화

지하철 노선도가 디자인의 추상화라고 한다면 프로그램을 만든다는 것은 소프트웨어의 추상화라고 할 수 있다. 객체 지향 프로그래밍은 좀 더 현실을 잘 반영하기 위한 노력의 산물이다. 이것은 단순히 객체 지향의 문법을 이용해서 객체를 만든다고 달성되는 것이 아니다. 고도의 추상화 능력이 필요하다. 좋은 설계는 문법을 배우는 것보다 훨씬 어려운 일이다. 심지어 이것은 지식을 넘어서 지혜의 영역이다. 좋은 설계를 위한 조언들은 많지만 이러한 조언들은 조언자의 입을 떠나는 순간 생명력을 잃어버린다. 지식은 전수되지만 지혜는 전수되지 않기 때문이다. 스스로 경험하고 깨우쳐서 자기화시켜야 한다. 필자도 그 긴 여정을 따라가고 있는 견습생에 불과하다.

부품화

IMG_7729.jpg

객체를 다른 곳에서 사용한다는 것은 일종의 부품으로써의 역할을 한다는 것이다. 좋은 객체를 만든다는 것은 객체를 재활용하여 부품화하는 것이다.

은닉화, 캡슐화

그런데 부품화라고 하는 목표는 단순히 동일한 기능을 하는 메소드와 변수를 그룹핑한다고 달성되는 것은 아니다. 제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다.