728x90
객체, 정보은닉, 캡슐화, 상속, 다형성


객체에 대해 생각해보자. OOP에서 객체는 '유형, 무형에 있어 인간이 인지하는 모든 것으로 속성과 행동으로 표현할 수 있다'라고 어려운 말로 표현되어 있다. 그리고 클레스는 빵틀로 비유되며 똑같은 모양의 붕어빵을 만들어내는 틀이라는 아는 사람만 아는 표현을 해놨다. 뭐 개념을 먼저 이해하고 보면 적절한 표현인데 처음 접하는 사람은 무슨 소린지 영 안드로메다다. 내 방식대로 말하자면 저런 표현은 오히려 머리만 아프게 한다.
그렇다면 내가 말하는 객체와 클레스는 무엇이냐?

구조적프로그래밍(C언어등)을 할때는 프로그램에서 필요한 기능이 무엇인지 생각하고 나누어 함수를 잘 만들어내는 것에 초점을 뒀다. 프로그램이 어떠한 순서에 무슨 일을 하느냐가 중심이 되었다.
OOP에서는 누구에게 일을 시킬까 하는 것이 중심이다. 뜬금없다고 생각하겠지만 객체란 자기가 자료랑 기능들을 가지고 있으면서 시키는 일을 충실히 하는 심부름꾼이다. 물론 다른 객체로부터 필요한 정보를 주고받을 수(message passing)도 있다.
프로그램을 하나의 회사로 생각해보자. 그럼 생산, 인사, 회계등 여러 부서가 있고 책임자들이 다 있다. 사장은 자기가 직접 그 일들을 하는 것도 아니고 관련 자료들을 직접 관리하지도 않는다. 책임자들을 잘 부리기만 하면 된다. 책임자들을 그 밑에 있는 직원들을 잘 부리면 된다. 실제적으로 일을 어떤 식으로 하건 결과가 잘 나오면 책임을 묻지 않는다. 이런 방식이 바로 OOP의 개념이다.

말이 길어졌는데 객체의 개념을 한마디로 정의하자면 '심부름꾼' 혹은 '부하직원'정도 되겠다. 일을 시키면 자료를 찾고, 일을 한다. 그리고 그에 대한 책임도 자기가 진다.

그렇다면 클레스(class)란 무엇인가? 객체지향 언어를 클래스의 모음(set of classes)라고도 한다. OOP는 클레스를 잘 설계하는 과정이라고 볼 수 있다. 클레스와 객체의 개념을 많이 헷갈려 하지만 그건 모두 책에서 어렵게 설명하기 때문이지 개념 자체는 무지 쉽다. 앞에서 말한 회사를 다시 가져오면 객체는 회사에서 일을 하는 사람이라고 했다.

하지만 우리는 프로그래머기 때문에 그들을 고용하는게 아니라 만들어낸다. 인간 대신 로봇으로 대체할 필요가 있다. 객체가 일을 하는 각기 다른 로봇들이라면 class는 로봇을 만드는 회로도가 되겠다. 회로도에 따라서 로봇은 다른 생각을 하고 다른 행동을 한다. 그리고 같은 회로도로 똑같은 로봇을 몇개라도 만들어낼 수 있다.

====================================================================
#include <iostream>
using namespace std;

class Hello
{
private:
 int value;
public:
 Hello()     {value = 0;}   //생성자
 Hello(int n)  { value = n;} //둘다 하나의 class에 대한 생성자지만 다른 역할을 한다.
 void printHello();
 void printvalue();
 void addValue(int n) { value = value + n; }
 void subValue(int n)
 {
  value -= n;
 } //inner class method라고 해서 짧은 메쏘드 구현일 경우 클래스 내부에 직접 적어줘도 된다(장단점 있다)
};


void Hello::printvalue()
{
 cout << "value :" << value << endl;
}

void Hello::printHello()
{
 cout << "\nHello~" << endl; //\n과 endl은 비슷 endl은 end line을 의미
}

int main()
{
 int n;
 cout << "수 입력: ";
 cin >> n;

 Hello ho1;
 Hello ho2(n);

 cout << "ho1 value : ";
 ho1.printvalue();
 cout << "ho1 value : ";
 ho2.printvalue();

 ho1.addValue(50);
 ho2.subValue(10);

 cout << "ho1 value : ";
 ho1.printvalue();
 cout << "ho1 value : ";
 ho2.printvalue();
 
 return 0;
}
=================================================================

728x90

'Programming > C++은객체지향언어다' 카테고리의 다른 글

error C2220: warning treated as error - no object file generated  (0) 2011.07.29
g++ for windows  (0) 2008.11.07
집합(차집합, 교집합, 합집합) - cpp  (0) 2008.04.02
ADT array 구현  (0) 2008.03.04
C++ (OOP개념들)  (0) 2008.02.26
C++ (OOP개념)  (0) 2008.02.26
C++ (개요)  (0) 2008.02.26

+ Recent posts