정보공간_1

[2기 대구 최진원] C++ Class & Basic OOP 본문

IT 놀이터/Elite Member Tech & Talk

[2기 대구 최진원] C++ Class & Basic OOP

알 수 없는 사용자 2012. 9. 19. 23:57

  안녕하세요. 대구 멤버십 21-1기 최진원입니다.

  이번 포스트에서는 Classes와 Encapsulation에 대해서 작성하겠습니다. 몇가지로 나누어 보았는데요. 어렵지 않은 내용이니 차근차근 따라와 보시길 바랍니다. :D, C++에서 나오는 Class는 objects의 blueprint 라고 하는데요. 먼저 struct와 class에 대해서 알아보겠습니다.

 

1) Struct vs classt

 

"관련 있는 데이터를 하나로 묶으면 관리하기에도, 프로그래밍 하기에도 편리하다."

 실제로 프로그래밍을 하다 보면 데이터의 부류를 형성하게 되는데요. 이렇게 부류를 형성하는 데이터들을 하나의 자료형으로 정의해서, 관리 및 프로그램 구현에 도움을 주겠다는 의도로 등장한것이 Struct입니다. 사실 그 밖에도 공용체와 열거형이 있긴 하지만 Struct에 비해서 사용 빈도가 많이 낮은 편이죠. 하지만 잘 구성된 프로그램들은 데이터들만을 가지고 부류를 형성하는 것이 아니라, 데이터를 조작하는 루틴, 즉 함수와 더불어 정의를 하게 된다.

 

 C++에서 struct 정의는 위와 같이 하게 됩니다. 보통 struct는 함수 정의가 안된다고 착각하시는 분들도 많은데요. 위의 소스를 돌려보시면 결과를 아시게 되겠죠?

 

  C++에서 class 정의는 위와 같습니다. 큰 차이를 느끼기 힘드시죠? 기본적이지만 실수하시는 분들이 가끔 계신데, 항상 마지막에  ' ; ' 를 붙이는 것을 잊지 말아주세요. 그리고 눈에는 안보이지만 큰 차이점이 있습니다. 

 

 

Default access specifier of struct : public

 

                                          class : private

 

 

 

그리고 마찬가지로 눈에 보이지 않지만 compiler에 의해 생성되는 것들이 있습니다.

 

Default Constructor, Copy Constructor 그리고 Assignment Operator가 단적인 예입니다. 아무 의심없이 사용을 하던 방법들이 모두 compiler에 의한 것들이죠. 이래서 알면 알수록 재미있는 것 같습니다. :)

결론을 말하자만 기본적으로 struct도 생성자, 소멸자를 가질 수 있고, 동시에 class 처럼 상속도 가능하고 연산자 오버로딩이나 멤버 함수(virtual 포함)도 지원하며 거의 동일하다고 말할 수 있다. 하지만 여기서 구분해야 하고 지나가야 하는 것은 C와 C++에서의 Struct는 상당히 다르다는 것이다.

 

 

  Struct & Class를 사용하면서 우리는 변수라는 용어대신 객체라는 용어를 쓰게 된다. 그리고 그 객체를 생성하기 위해서 우리는 클래스를 디자인하게 된다. 이렇게 클래스를 디자인할 때 Encapsulation과 Information Hiding이라는 특성에 따라 좋은 클래스를 구분하게 된다. 그렇다면 Encapsulation과 Information Hiding에서 알아 보도록 하겠다.

 

2) Information Hiding

 

  Information Hiding에서 가장 기본이 되는 것은 Get 혹은 Set으로 시작되는 함수들로 대부분 멤버 변수의 접근을 위한 것들이다. 보통 Access Funcation 이라고한다. 단적인 예로,

 

 

위와 같이 Point Class의 멤버 변수인 x, y에 직접적으로 접근 할 수 있지만 이럴 경우 입력한 값이 point class의 멤버변수에 바로 입력이 되어버린다.

 

  하지만 위와 같이 멤버변수 x, y를 private로 선언을 하고 Get, Set 함수를 통하여 접근을 하면 x, y 값을 입력할 때 한번 필터링을 하여 입력이 가능하게 된다. 이렇게 정보를 직접 제공해 주지 않고 숨기는 것을 Information Hiding이라고 하며 객체지향 프로그래밍에서 수도 없이 쓰이게 되는 기본적이면서 중요한 특성이다.

 

3) Encapsulation

 

  사실 Encapsulation과 Informatio Hiding을 유사한 개념으로 생각하고 받아들이는 경우가 많은데, 두가지를 한번에 설명하기 때문에 그렇게 느끼는 것은 당연할 수 있다.

  Encapsulation은 기본적으로 Class를 사용할 떄 아무렇지 않게 사용하기 때문에 어쩌면 자기도 모르게 가장 흔하게 사용되는 특성이라고 할 수도 있다.  

 

  위의 소스는 Point Class를 인자로 받아 x와 y를 출력해주는 PointShow Class를 나타내고 있다. 이같은 경우 Call-by-Value로 Point p를 넘겨 주게 되고 그 값을 출력하게 된다. 하지만 ShowData(Point p) 함수가 PointShow Class가 아닌 Point Class안으로 들어가게 된다면 캡슐화되어 있다고 말할 수 있게 된다. 캡슐화의 특성이라하면 단어 그대로 캡슐을 보고 어떤 것인지 알 수 있다는 것이다. 우리가 알약을 먹을 때 알약안에 알갱의 숫자를 세어보고 복용하지 않고 캡슐을 보고 복용을 하는 것을 비유할 수 있겠다. 그리고 유지, 보수도 수월하게 하기 때문에 객체지향에서는 빠질 수 없는 중요한 특성이다.

 

그밖에 몇가지 특성들이 더 있죠. 간단하게 알아볼게요.

 

4) Abstraction

 

  앞에서 알약을 가지고 캡슐화에 대해서 설명을 했었는데요. 마찬가지로 알약을 예로 Abstraction (추상화)를 설명하자면 어떤 종류의 알약이 있으면 그 약에 대한 성분, 다양한 효능 보다는 그 약에 대한 목적, 예를 들어 감기약, 해열제 등, 빨간십자가가 그려져 있으면 약상자다. 라고 생각하고 믿는 것이 추상화라고 할 수 있습니다.

  다시 말해 단어에서도 나와있 듯이 추상이라는 것은 각각의 class의 공통점을 뽑아낸 것을 말할 수 있고 데이터 추상화, 코드 추상화의 2가지로 나눌수 있습니다.

 

5) Inheritance

 

  Inheritance, 상속이죠. 객체지향 언어를 시작하게 되고 하나하나씩 배우다 보면 Inheritance라는 특성이 나타납니다. 이 부분에 의외로 힘들어 하시는 분들도 많이 계시더라고요. 단어 그대로 받아 들이면 조금 쉽게 접근 할 수 있지 않나 생각합니다. 무언가를 물려 받는 다는 의미의 상속. 이때 부모를 Base, 자식을 Derived 라고 하죠. 소스로 조금더 알아보겠습니다. 

 

Base Class

Derived Class

 

  이럴 경우 'BBB Class가 AAA 클래스를 상속한다. ' 라고 말을 합니다. 이때 만약 BBB 클래스의 객체를 생성하게 되면, 다음과 같은 순서로 진행이 됩니다.

 

1. 메모리 공간 할당

2. Base 클래스의 생성자 호출

3. Derived 클래스의 생성자 호출

 

간혹 위와 같이 생각하시고 말을 하시는 분들이 계신데, 정확히 말하면 호출이 아닙니다. 호출과 실행은 엄연히 다른 단어죠. 다시 말씀드리면 2. Base 클래스의 생성자가 호출되기 전에 Derived 클래스의 생성자가 호출되고, Base 클래스의 생성자 실행, Derived 클래스의 생성자 실행의 순서로 진행이 됩니다. 다시 정리하면

 

1. 메모리 공간 할당

2. Derived 클래스 생성자 호출

3. Base 클래스의 생성자 실행

4. Derived 클래스의 생성자 실행

 

와 같이 이해 할 수 있습니다.

 

6) Reference

- Kang, Byung-Wook, Introduction to C++, YeungNam Univ. SE Lab, 2005

- 윤성우, C++ 프로그래밍, FREELEC, 2004

 

 

  저는 항상 기본이 중요하다고 생각을 합니다. 항상 쉽게 생각을 하지만 다시 보면 어려운 것들, 가볍게 보고 다시 한번 깊게 생각해볼 수 있었으면 합니다.