객체 지향 프로그래밍
객체 지향 프로그래밍(OOP, Objected Oriented Programming)은 객체 지향(Object Oriented)이라는 개념에서 부터 출발합니다.
객체 지향은 현실 세계를 객체들의 모임으로 보고, 모든 것을 속성(Attribute)과 행동(Behavior)의 객체로 표현합니다. 이러한 객체 지향은 클래스(Class), 객체(Object), 메서드(Method), 메시지(Message)로서 객체 지향 프로그래밍으로 녹아들게 됩니다.
클래스(Class)는 같은 집단에 속하는 속성 및 행동을 정의한 것입니다. 이것은 곧 사용자 정의 데이터 형이라고 말할 수 있습니다.
객체(Object)는 클래스가 인스턴스(Instance, 실제 메모리에 할당)화 된 것입니다. 따라서 객체는 자기 자신의 속성을 가지면서, 클래스에서 미리 정의한 행동들을 취할 수 있습니다. 행동은 객체내의 속성을 공유합니다.
메서드(Method)는 객체의 행동입니다. 객체는 이러한 메서드가 호출이 되면 정의된 행동을 하며 객체의 속성을 변경합니다. 이는 곧 서브루틴(Subroutine)이라 말할 수 있습니다.
메시지(Message)는 객체간의 통신을 위한 수단입니다. 흔히 메서드를 호출하는 행위를 메시지라고 합니다.
추상화 (abstraction)
클래스를 디자인 하기 위해서는 먼저 자료를 추상화 하는 방법을 익혀야 합니다. 자료의 추상화는 위에서 언급한 것 처럼, 클래스의 속성 및 행동을 정의하기 위한 작업을 의미합니다.
PC를 예제로 사용한다면, CPU, RAM, POWER 등의 부품을 가지고 있습니다. 이러한 부품들은 PC를 구성하는 재료이며, PC 라는 클래스가 포함하는 또 다른 클래스들입니다.
이렇게 하나의 클래스가 다른 클래스를 포함하는 상태를 상속(inheritance)이라고 합니다.
- PC는 CPU 와 RAM, POWER 의 기능을 이어 받았습니다.
PC는 "전원이 꺼짐", "부팅", "부팅됨" 같은 상태를 가지고 있으며 이는 PC 클래스의 속성을 의미합니다.
PC에 특정한 메시지(Message)를 전달하여 행동(Method)를 호출합니다. "전원 스위치를 누른다"와 같은 일이 됩니다.
PC를 켜기 위한 일련의 동작을 행동(Method)이라고 합니다. 전원을 켜기 위해 PC의 POWER 는 전류를 흘려보내고 메인보드에 의해 부팅이 시작됩니다.
추상화 과정 중 항상 주의해야 하는 것은, 문제 해결에 필요한 것들만 존재하면 된다는 점입니다.
현실 세계에서의 PC는 온도에 따라 쿨러를 기동하는 등 다양한 동작들을 가지고 있습니다. 그러나 이 일은 부팅 과정에서 핵심적인 위치를 차지하는 일은 아닙니다. 필요한 속성과 행동들만 간추리는 작업들까지 포함해서 "자료의 추상화" 라고 합니다.
캡슐화 (Encapsulation)
만일 PC를 만들기 위한 POWER 클래스를 만든다고 생각해봅시다. PC를 조립하려는 사람은 POWER 가 어떠한 방법으로 동적하는지 몰라도 상관 없어야 합니다.
PC 한 대를 조립하는데에 POWER 의 원리, CPU 의 원리, RAM 의 원리등을 모두 파악하기는 어렵습니다. POWER 를 구입하고 전원플러그를 꼽으면 POWER 의 행동이 실행된다는 사실만을 알고 있으면 충분합니다.
POWER 클래스는 현재 전압이나 전류의 정보같은 속성값을 가지고 있고, 전압을 바꾸는 동작이나 나누는 동작을 가지고 있습니다. 그러나 이러한 속성이나 동작을 숨기고, 대신 플러그만 제공해 줍니다.
실제 내부의 복잡함을 숨기고, "전원 플러그를 꼽으니 전원이 공급된다"라는 정도만 알아도 된다는 것이 "캡슐화"이며, 외부에 의존하지 않고 하나의 독립된 개체로서 설계되어야 한다는 이야기이기도 합니다.
이러한 캡슐화는 클래스의 사용을 편리하게 만듭니다.
상속 (Inheritance)
상속은 이미 만들어진 클래스의 속성과 동작을 물려받아 재 사용하는 것입니다. 보통 is a 와 has a 로 구분합니다.
is a 는 새롭게 만든 클래스가 이전의 클래스의 파생관계일때 주로 이용됩니다. "사람" 이라는 클래스가 있다면, "학생" 클래스는 사람임이 당연하므로 "학생 is a 사람"의 관계가 성립합니다. 그러나 반대로, "사람 is a 학생"은 성립하지 않습니다. 모든 사람이 학생은 아니기 때문입니다.
- "학생" 클래스는 "사람" 클래스의 직접적인 파생관계입니다.
has a는 이전의 클래스가 새롭게 만든 클래스의 일부일때 주로 이용합니다. PC의 부품들인 CPU, RAM, POWER 등이 이러한 has a 관계에 속합니다.
- 이 경우, 이전 클래스는 새로운 클래스의 멤버로써 편입됩니다.
다형성 (Polymorphism)
다형성(Polymorphism)은 상속받은 클래스의 일부 혹은 전체를 수정하여 확장할 수 있음을 의미합니다.
이러한 형태는 is a 상속에서 일어나는데, "사람"클래스가 "일을 하다"라는 메서드를 가지고 있을때 아래 둘은 서로 다른 의미를 가져야 합니다.
- "학생"클래스의 "일을 하다"
- "직장인"클래스의 "일을 하다"
위와 같은 재정의는 다형성을 필요로 하는 이유가 됩니다.
재사용성 (Reusability)
자료의 추상, 캡슐화, 상속, 다형성에 의해 잘 작성된 클래스는 재사용을 할 수 있습니다. CPU 하나를 잘 만들어 놓으면 양산을 통해 PC뿐 아니라, 의학장비, 인공위성등에 폭 넓게 사용할 수 있을 것입니다.
사회적으로 이렇게 잘 작성된 클래스가 늘어나면 늘어날 수록, 전체적인 프로그램 완성품의 개발 비용은 점점 감소하게 됩니다.
마치 PC를 조립할때 부품만 조립하면 나만의 PC를 갖출 수 있는것처럼 생산성이 크게 향상되게 됩니다.
- PC에 속한 모든 부품들을 직접 만들어야 한다면 괴로운 일이 될 것입니다.
"재 사용성"은 객체지향 프로그래밍이 널리 퍼지게 된 주요 이유입니다.