프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체'라는 기본 단위로 나누고 이 객체 들의 상호 작용으로 서술하는 방식이다.
객체란 하나의 역할을 수행하는 메소드 와 변수(데이터)
의 묶음으로 봐야 한다.
객체 지향 프로그래밍
이라고 하는 말 속에도 포함되어 있는 것처럼 객체 지향 프로그래밍의 핵심 키워드는
객체(Object)
다
객체가 무엇인지 에 대해 이해하는 것이 어떻게 보면 객체 지향 프로그래밍의 출발점이라고 할 수 있다
객체 지향 프로그래밍에서 얘기하는 객체를 조금 추상적이고, 어렵게 얘기하면
프로그램을 구성하고 있는 로직을 서로 연관되어 있는 상태(state)
와 행위(behave)
로 그룹핑 해 논 것을
일종의 객체라고 할 수 있다
그리고 그 객체는 일종의 레고 블럭
처럼 객체와 객체를 조합해서 하나의 완제품
이라고 할 수 있는
소프트웨어를 만들어가는 그런 프로그래밍 기법이 객체 지향 프로그래밍이라고 할 수 있는 것이다
한 웹사이트가 있다고 가정해보자
이 사이트는 우리가 일반적으로 알고 있는 소프트웨어와는 다르지만
이런 웹 서비스 들도 우리가 웹 어플리케이션이라고 부르고, 분명히 소프트웨어 이다
이 사이트 같은 경우는 하나의 프로그램인데, 하나의 프로그램에는 글 목록을 출력 해주는 로직이 있을 것이고
글 본문을 출력 해주는 로직 이 있고, 또 댓글을 추가하고 출력하고 수정하고 삭제하는 로직 이 있을 것이다
하나의 프로그램은 하나의 취지를 가지고 있는 로직 으로 이루어진 것이 아니라
보다시피 여러 개의 목적성을 가진 로직 들의 집합이라고 할 수 있다
처음에 서비스를 만들고, 처음에 어플리케이션 을 만들 때 는 코드가 많지 않다
그렇기 때문에 우리가 전부터 배웠던 절차 지향 프로그래밍에서 배웠던 조건문, 반복문 을 이용해서
프로그램을 짜서 이런 사이트를 충분히 구축할 수 있다
하지만, 사이트의 규모가 커지고 그 사이트를 구축하는데 동원되는 인원들이 많아지고
오랜 시간 동안 프로젝트가 진행되는 과정에서 어려움을 겪게 된다
그러면 어떤 생각을 하게 되냐 면 이 사이트에 들어가 있는 로직 들을 기능별로 그룹핑 하고 싶어하는
생각을 누구나 자연스럽게 하게 된다
그렇다면 어떤 방법을 사용할 수 있을까?
이 사이트를 구성하고 있는 글 목록, 본문, 댓글 과 같은 기능적으로 이 로직 들을 구분해서
글 목록과 관련된 로직 이라고 하면, 변수 이름 앞에는 list_0000
또 본문과 관련된 변수 라면 article_0000 또는 메소드라면 article_0000 이런 방식으로 한다던지
그리고 글 목록과 관련된 변수나 메소드, 또는 본문과 관련된 변수나 메소드를
각각의 기능별로 쪼개서 코드 상으로 서로 연관되어 있는 코드들과 모아둔다던지
이런 여러가지 조치를 취하게 된다
그런것들이 일종의 그루핑, 또는 분류화 영어로는 Categorizing
이라고 할 수 있다
이런 소프트웨어가 커지면서 발생하는 여러가지 문제들로 인해 사람들이 불편함을 겪다 보면
자연스럽게 그것들을 해소할 수 있는 방법을 찾게 된다
그 방법 중 하나가 객체 지향이라고 할 수 있다
예시
클래스에 속성과 메소드를 정의하고, 인스턴스에서 사용한다
위와 같이 객체 지향 프로그래밍은, 현실 세계를 기반으로 프로그래밍 모델을 만들때에 유용하다
캡슐화는 객체의 데이터를 외부에서 직접 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업이다.
추상화는 객체들이 가진 공통의 특성들을 파악하고 불필요한 특성들을 제거하는 과정을 말한다. 객체들이 가진 동작들을 기준으로 이용자들이 동작만 쉽게 구동할 수 있도록 한다.
이러한 추상화 과정을 통해 이용자들은 프로그래머가 만든 객체를 더 쉽게 사용할 수 있게 된다.
추상화를 할 때 주의할 점은 속성 위주가 아닌 동작 위주로 정의하는 작업을 하는 것이다. 객체의 동작에 연관이 되지 않는 속성들은 결국은 불필요하다. 따라서 불필요한 속성들을 걸러내기 위해 동작을 먼저 정의하고 동작에 필요한 속성들을 정리하는 것이 좋다.
OOP의 가장 큰 특성 중 하나가 바로 코드의 재사용성과 상속의 개념이다. 같은 객체를 여러 개 만들어야 하는 경우, 한 번 작성된 코드를 활용하여 동일한 객체를 만들 수 있다.
위 그림을 예시로 들면
본문에 관련된 변수, 메소드 가 객체라고 하는 단위로 응집되어 있고
댓글에 관련된 변수, 메소드 가 객체라고 하는 단위로 응집되어 있다
서로 연관성이 없는, 다른 성격을 가지고 있는 로직들 과는 객체를 껍데기로 해서 분리되어 있는 것이다
객체를 분류해서 소프트웨어를 좀 더 명확하게 이해하고 좀 더 쉽게 관리할 수 있도록 기능별로
로직 들을 구획화 시키고 분류하고 카테고라이징을 하다 보면 자연스럽게 객체 라고 하는 문법 적인 기능이
나타나게 되는 것이고 이 기능은 이 사이트에서 만이 아니라 다른 사이트에서도 사용할 수 있다 라는 생각을
할 수 있고 그것이 가능해진다
이게 바로 프로그래밍에서 가장 중요한 개념이라고 할 수 있는 재활용성 에 객체가 기여하는 바라고 할 수 있다
이렇게 재활용성이 높아지면서 이미 사용하고 있는 로직을 다른 곳에 사용하게 되고
다른 곳에 사용 하려다 보면 또 여러가지 문제를 발생시킨다
그러한 문제를 완화시키기 위해서 여러가지 로직을 제한하고, 컨트롤하는 여러가지 기능들이 추가되게 된다
그게 바로 우리가 마주하고 있는 객체 지향의 여러가지 기능들이 그런 맥락에서 나타난 것이라고 할 수 있다
상속(inheritance) 개념은 다음 포스팅에서 이어가도록 하겠다.