이 포스팅은 윤성우님의 열혈 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()
{ ... }
단, 함수를 인라인으로 설정하고자 할 때에는 헤더파일에 함수의 정의를 넣어주어야 한다.
'Programming > C++' 카테고리의 다른 글
[C++] 복사생성자 / 깊은복사와 얕은복사 (0) | 2020.02.29 |
---|---|
[C++] 5. 클래스의 완성 (정보은닉/캡슐화/생성자와 소멸자/클래스와 배열/This 포인터) (0) | 2020.02.27 |
[C++] 3. 메모리관리 / 동적 할당 new & delete (malloc/free in C) (0) | 2020.02.26 |
[C++] 2. const / 메모리 공간 / Reference 참조자 / 함수에서의 참조(Reference in function) (0) | 2020.02.26 |
[C++] 1. 이름공간(Namespace), 인라인 함수(Inline function) (0) | 2020.02.26 |