[강좌 : 객체지향 - 2] 객체지향 프로그래밍이란?
2009.07.30 14:06
김성용(topmentor)
http://cafe.naver.com/gisdev/453
2. 객체지향 프로그래밍 이란?
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o /><?xml:namespace prefix = o />
객체지향 프로그래밍을 설명하기에 앞서 자주 사용되는 몇 가지 개념을 먼저 살펴보도록 하겠습니다. 객체지향에서 핵심은 객체입니다. 객체는 무엇일까요? 객체는 우리가 구현하려는 대상입니다. 현실세계를 객체지향으로 모델링 하면 고객의 문제를 해결하기 위해 특정한 역할을 수행할 객체들이 도출됩니다. (클래스를 만들어 낸다고도 하는 데 비슷한 것 같지만 미묘한 차이가 있습니다.) 비유하자면 은행의 입출금 서비스를 설계한다고 할 때 이 서비스에 어떤 역할이 필요한지 먼저 생각하게 될 것입니다. 고객을 맞이하여 입출금을 받는 출납계원, 금고를 관리하는 사람, 업무에 필요한 문서를 준비하고 출납계원에게 배부하는 사람, 고객에게 은행서비스를 안내해 줄 안내원, 은행이란 공간의 전체적으로 경비하는 경비원 등을 떠올리게 됩니다. 이들이 구현하려는 대상인 객체인 것입니다.
그렇다면 클래스(Class)는 무엇일까요? 객체로 다시 돌아가서… 객체라는 것을 프로그램 코드로 구현하려면 어떻게 해야 할 까요? 객체가 가지고 있는 속성데이터를 관리해야 하고 그 객체가 갖는 고유의 기능을 구현해야 합니다. 속성데이터는 변수나 배열 같은 것으로 구현하면 될 테고, 기능은 함수로 구현하면 되겠죠. 그런데 객체가 가진 속성과 기능을 각 객체마다 관리하려면 복잡해 집니다. 물론 헝가리언 코드와 같은 네이밍 규칙을 주면 어느 정도 관리해 볼 수 있겠지만 동적할당과 같은 방식으로 객체를 만들면 네이밍 할 수도 없고 짜증납니다. 따라서 같은 목적의 속성데이터와 기능을 한 단위로 묶어주어야 편리하게 관리 할 수 있습니다. 그래서 객체지향 언어에서는 기능과 속성을 한 단위로 묶어 하나의 Type으로 정의할 수 있게 해 놓았습니다. 그것이 바로 클래스입니다. 한마디로 클래스는 객체를 만드는 틀이라고 보시면 됩니다.
여기에서 한가지 질문을 날리 실 겁니다. 객체가 구현하려는 대상이라고 하는 데 클래스로 생성한 변수 (아래 코드 참조)
Car mycar;
도 객체라고 하지 않나요? 맞습니다. 이것도 객체라고 부르고 있습니다. 그런데 이 객체는 앞서 설명한 구현 대상으로써의 객체와 구분하기 위해 ‘인스턴스(Instance)’라는 말로 부르기도 합니다. 인스턴스는 클래스가 만들어져 있어야 생성할 수 있는 객체인 셈입니다.
이제 프로그래밍 입장에서의 객체지향을 이야기 해 보도록 하죠. 앞 시간에 객체지향 프로그램은 객체와 객체의 연결이라고 말씀 드렸습니다. 그런데 객체의 생성을 위해서는 클래스를 정의해야 합니다. 따라서 객체지향 프로그램의 시작은 클래스 정의부터 이루어집니다. 즉, 객체의 틀(type)로써 클래스를 만드는 데 객체의 속성정보를 저장하기 위한 데이터들과 기능구현을 위한 함수들을 한 단위 묶어정의 하는 것입니다. 따라서 객체지향 프로그래밍 방법은 아래의 순서로 이루어 집니다.
객체지향 프로그래밍 방법 (클래스정의 + 주로직 구성)
가) 문제영역으로부터 객체들을 도출해 낸다.
나) 도출 해 낸 각 객체들의 필요한 역할을 정의해 본다.
다) 유사한 객체들을 모아 형(Type)을 정의한다. : 클래스 생성.
- 속성정보는 변수나 배열로
- 기능은 함수로 정의 된다.
라) 클래스로부터 각 객체에 해당하는 인스턴스를 만들고 주요 흐름에 맞게 인스턴스들의
기능을 수행시킨다.
마) 각 객체간에도 호출이 필요하면 객체가 노출하는 인터페이스를 통해 서로 데이터를 주
고 받으며 통신한다.
위에서 설명하지 않은 부분은 바로 ‘주로직(main logic)’입니다. 주로직은 프로그램의 실질적인 실행흐름이 있는 곳입니다. 일반적인 애플리케이션에서는 main()함수가 주로직입니다. GUI 프로그램의 경우는 이벤트 핸들러 함수에 주요로직을 둡니다. C++이 객체지향 언어이긴 하지만 주로직에 해당하는 부분은 특정 클래스의 어느 함수가 아닌 entry point function으로 약속된 main함수입니다.
(사실 C++은 완전한 객체지향 언어를 표방하지 않습니다. 비얀 스트러스트럽도 C++을 절차지향과 객체지향의 장점을 모두 포괄하는 유연한 언어로 이야기 하고 있습니다. 객체지향 언어에 머물러 있기를 바라지 않는 듯합니다. )
주로직에서는 주요 실행로직이 들어가는 데 여기에서 인스턴스들이 생성되고 각 인스턴스의 멤버들을 이용하여 전체실행 로직이 만들어 집니다.
그럼 간단한 프로그램 예제를 통해 절차지향 코드와 객체지향 코드를 비교해 보겠습니다.
// 절차지향 코드
#include <iostream.h>
void startup(int *sp)
{
*sp = 0;
cout << "차량 출발" << endl;
}
void speedup(int *sp)
{
(*sp)++;
}
void stop(int *sp)
{
*sp = 0;
cout << "차량이 멈추었습니다" << endl;
}
int car2_speed ;
void startup2()
{
car2_speed = 0;
cout << "차량 출발" << endl;
}
int main()
{
int car1_speed ;
startup(&car1_speed);
speedup(&car1_speed);
cout << "현재 속도는 " << car1_speed;
stop(&car1_speed);
startup2();
speedup(&car2_speed);
cout << "현재 속도는 " << car2_speed;
stop(&car2_speed);
return 0;
}
절차지향 코드는 함수중심입니다. 함수를 정의하고 각 함수를 호출관계로 엮어가는 방식입니다. 2개의 자동차를 모델링하고 있는 데 어떤 자동차 인스턴스에 명령을 내리는 지 꼼꼼히 해석해 보지 않으면 잘 알 수 없습니다.
이번에는 객체지향 코드를 볼까요?
// 객체지향 코드
#include <iostream.h>
class Car
{
public :
int speed;
void startup()
{
speed = 0;
cout << "차량 출발" << endl;
}
void speedup()
{
speed++;
}
void stop()
{
speed = 0;
cout << "차량이 멈추었습니다" << endl;
}
};
int main()
{
Car car1;
car1.startup();
car1.speedup();
cout << "현재 속도는 " << car1.speed << endl;;
car1.stop();
Car car2;
car2.startup();
car2.speedup();
cout << "현재 속도는 " << car2.speed << endl;;
car2.stop();
return 0;
}
main함수를 보시면 car1, car2에 대한 인스턴스를 생성하고 각 인스턴스의 멤버를 접근하는 방식으로 코딩되어 있음을 확인할 수 있습니다. 마치 누구에게 명령을 내리는 것 같지 않습니까?
car1.speedUp();
코드는 car1에게 speedup()을 하라는 명령을 내리는 것 같이 보입니다. 아주 직관적인 코딩이죠. 확실한 대상을 먼저 지정하고 그 대상이 가진 속성이나 기능을 쓰게 한다. 바로 이것이 객체지향 코딩의 특징입니다.
이제 객체지향 프로그램의 코딩스타일이 이해되시나요? 아직 잘 모르겠다면 앞으로 계속 경험해 보세요. 슬슬 익숙해 질 겁니다.
다음 강좌에서는 객체지향의 4대 특징인 추상화를 알아보겠습니다.
'기반지식 > 객체지향 개념' 카테고리의 다른 글
[강좌 : 객체지향 - 5] 캡슐화 (0) | 2009.11.10 |
---|---|
[강좌 : 객체지향 - 4] 추상화 (0) | 2009.11.10 |
[강좌 : 객체지향 - 3] 객체지향 프로그래밍의 4대 특징 (0) | 2009.11.10 |
[강좌 : 객체지향 - 1] 객체지향에 대해 (0) | 2009.11.10 |
객체지향언어 - C# (0) | 2009.11.10 |