본문 바로가기

Programming/C++

[C++] 4. 클래스 맛보기 / 객체지향 프로그래밍 (class, OOP)

이 포스팅은 윤성우님의 열혈 C++ 프로그래밍 책을 기반으로 작성되었습니다.

클래스 도입의 핵심은 기존 C에서 struct 구조체에서 data들을 따로 모아 관리를 했다면 C++에서는 object를 중심으로 관련 있는 데이터와 함수들을 class라는 개념으로 묶는다는 것이다. 물론 여전히 C++에서도 C의 거의 모든 기능을 지원하기 때문에  struct를 이용할 수 있지만, 클래스 개념의 도입이 C에서 C++로의 확장의 핵심임을 누구도 부정할 수 없을 것이다.

우선 먼저 구조체 struct 사용법을 간단히 보고 class로 넘어가자. C++에서는 다음처럼 struct에서도 함수를 포함하는 것을 지원하고 있다.

 struct Student
 {
     int age;
     int grade;
     char name[];
     
     ...
     void education();
     void exercise();
     ...
 }
 
 void Student::education() //namespace와 비슷한 개념으로 호출한다고 생각하자.
 { ... }
 
 void Student::exercise()
 { ... }
 
 int main(void)
 {
     Student jiwan={"Jiwan Kim", 27, 4} // 클래스 데이터 초기화 방법
     Student daeseong={"Daeseong Jeon", 25, 1}
     return 0;
 }

 

접근제어 지시자

C++의 클래스와 구조체의 선언 이외의 유일한 차이점은 데이터에 접근할 수 있는 권한이라 할 수 있다.
C++에서는 private: protected: public: 이라는 세가지 종류의 접근제어 지시자를 통해서 클래스 외부에서 클래스 내의 데이터나 함수로의 접근을 차단하던지, 유도 관계(상속) 클래스에만 일부 허용하던지, 완전 허용할 수 있다.
이제부터 클래스 내에 선언된 데이터나 변수들을 멤버변수라하고 클래스 내에 선언된 함수들을 멤버함수라고 하겠다.
클래스 내의 멤버변수는 선언시 디폴트로 private으로 설정되며, 이는 외부에서 데이터에 접근하는 것을 효과적으로 보호해줌으로써 보안이나 실수를 막아준다.
단 외부에서 멤버변수로의 접근이 필요할 경우, 멤버변수를 볼 수 있는 get()과 같은 멤버함수나 설정할 수 있는 set()과 같은 멤버함수를 public으로 설정해줌으로써 이 문제를 해결할 수 있다. 이와 같이 보안과 관련된 은닉에 대한 것은 다음에 자세히 포스팅하겠다.
아래의 파일분할 예제코드에 사용된 private과 public을 통해 대충 이해하고 넘어가자.

파일분할

이제부터 이 클래스에 대한 내용을 앞으로 계속 포스팅하며 다룰테니 오늘은 간단히 주로 어떤식으로 C++에서 클래스를 활용하는 지 살펴보면서 예제로 마무리해보고자 한다. 사실 C++을 객체지향프로그래밍으로 객체 즉 Class를 잘 프로그래밍하는 것이 C++ 프로그래밍의 거의 전부라고 볼 수 있다. 프로그래머들은 C++의 클래스의 특성을 이용하여 파일을 header와 cpp파일로 주로 분할하여 저장을 하는데, 이는 다른 사람들로 하여금 header파일만 보고도 프로그램을 이해할 수 있는 효과를 가져올 수 있다. 

//Student.h
struct Student
 {
 private:
     int age;
     int grade;
     char name[];
 public:
     void initMembers(int age, int grade, char *name); //멤버변수로의 접근
     void education();
     void exercise();
 }
 
 //Student.cpp
 void Student::initMembers(int age, int grade, char *name)
 { ... }
 void Student::education() //namespace와 비슷한 개념으로 호출한다고 생각하자.
 { ... }
 void Student::exercise()
 { ... }
 

 

단, 함수를 인라인으로 설정하고자 할 때에는 헤더파일에 함수의 정의를 넣어주어야 한다.