[CM202] 02. 객체지향 프로그래밍 (Object-Oriented Programming)
추상적 데이터 타입 (Abstract Data type, ADT)
본격적으로 데이터 구조들에 대해 알아보기 전에, 꼭 짚고 넘어갔으면 하는 개념이 있습니다. 데이터 구조를 표현하기 위해 우리가 기본적으로 정의해야 하는 데이터의 타입에 대해서입니다.
데이터 타입은 값과 기능 두 가지 요소의 묶음으로 생각할 수 있습니다. 그리고 이를 논리적으로 추상화한 개념이 추상적 데이터 타입(Abstract Data Type, 이하 ADT)입니다. 데이터에 대해 “어떤 값을 가져야 하고, 어떤 기능을 수행해야 하는가?”를 나타낸 것이라고 생각할 수 있습니다.
대표적인 예로 앞으로 다룰 스택(Stack)구조가 있습니다. 스택은 맨 위에 값을 삽입하거나 제거할 수 있으며, 그 크기를 반환하고 비어있는지도 확인할 수 있습니다. 이러한 기능들은 별도로 구현하지 않아도 말로서 정의할 수 있으니, 추상적이라고 할 수 있습니다.
ADT를 정하면, 적절한 데이터 구조를 선택해 구현할 수 있습니다. ADT가 무엇을 해야 하는가라면, 데이터 구조는 그것을 어떻게 구현하는가라고 볼 수 있죠.
객체지향 프로그래밍
추상적 데이터 타입은 말 그대로 추상적으로 정의된 상태입니다. 아무래도 실제로 사용하기 위해서는 코드로 작성할 수 있어야겠죠. 실제 코드로 구현하기 위해서 우리는 그에 맞는 프로그래밍 철학을 사용해야 합니다.
객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 하나의 큰 절차로 보지 않고, 여러 개의 ‘객체(Object)’들이 서로 상호작용하는 구조로 바라보는 프로그래밍 패러다임입니다. 데이터와 그 데이터를 다루는 함수를 하나의 단위로 묶어 관리하는 방식이죠.
객체지향 프로그래밍이 탄생하기 전에는 절차지향 프로그래밍(Procedural Programming)이 있었습니다. c언어의 구조를 생각하면 편할거에요. 이는 명령이 순차적으로 실행되는 방식이기 때문에, 프로그램이 커질수록 유지보수와 재사용이 어려워진다는 문제점이 있었습니다. 해서 이에 대한 해결책으로 등장한 것이 객체지향 프로그래밍이었죠.
객제지향 프로그래밍의 요건
객체지향 프로그래밍이 구제척으로 어떤 특징을 통해 객체를 다루는지, 자세한 예를 통해 설명하겠습니다. 객체지향 프로그래밍은 최소한 다음 네 가지의 특징을 가지고 있습니다.
1. 추상화 (Abstraction)
추상화란, 특정 대상에서 대표적인 속성만을 추려내어 단순화하는 것을 말합니다. 불필요한 정보는 숨기고, 중요한 정보는 부각함으로써 객체를 간단히 만드는 것이죠. 우리가 종이접기로 만드는 동물들은 실제 동물을 똑 닮지는 않았습니다. 하지만 대표적인 특징은 나타나 있어 다른 사람이 보아도 그 동물이 떠오르기 마련입니다. 여러분은 최소한의 재료와 작업을 통해 조물주가 될 수 있습니다.
2. 상속 (Inheritance)
상속은 기존 개념을 확장하여 새로운 개념을 정의하는 것을 말합니다. 대부분의 프로그래밍 언어에서 이는 클래스(class)라는 개념을 통해 구현할 수 있습니다. 상속하는 클래스를 부모 클래스, 상속 받아 새로 정의된 클래스를 자식 클래스하고 부르는 식으로요. 상속을 사용하면 프로그램의 용도에 따라 클래스를 수정할 수 있고, 클래스 사이의 종속 관계를 만듦으로써 객체를 조직화할 수 있습니다.
3. 다형성 (Polymorphism)
다형성은 어떤 한 요소가 상황에 따라 여러 개념을 나타낼 수 있는 것입니다. 여러가지 객체들을 정의하다보면 서로 비슷하면서도 특정 요소가 차이가는 경우가 생기기 마련입니다. 이런 때를 위해 두 객체가 같은 형식을 공유하되, 서로 차이나는 기능이나 요소에 대해서는 객체마다 서로 다른 값을 가지게 할 수 있어야 합니다. 강아지와 고양이 모두 포유류에 네 발 동물이라는 공통점이 있지만 울음소리 등이 다른 부분도 있죠. 그래서 같은 클래스로 정의하면서도 울음소리 등만 서로 다르게 작동하도록 정의할 수 있습니다.
4. 캡슐화 (Encapsulation)
캡슐화는 이름이 조금 생소하죠. 데이터와 기능을 객체 내부에 감추고, 외부에서는 인터페이스를 통해서만 접근하게 하는 특징을 말합니다. 간단히 말해서 포장을 잘 해야 한다는 거에요. 사람들이 객체를 다루기 위해 접근할 때는 사용하기 쉽게 입력값과 출력값을 단순 명확하게 한다는 것이 요지입니다. 우리 모두 컴퓨터의 구조와 작동 원리는 잘 모르더라도, 쇼핑이나 게임을 위해 전원을 켜고 타자를 두들기는 것 정도는 쉽게 할 수 있잖아요.
데이터 구조 또한 값과 그 값들의 관계를 한데 묶은 개념이니, 객체지향 프로그래밍을 사용하기에 더할 나위 없이 좋습니다. 앞으로 등장할 데이터 구조와 ADT들도 모두 클래스와 객체로 정의될테니, 객체지향 프로그래밍에 대한 개념을 공고히 해 두는 것이 좋겠습니다.






