클래스는 다음과 같이 이루어져 있다.
class Student // 클래스 선언.
{
public: // 데이터 공개
void SetName(char name[]);
private: // 데이터 은닉.
char name[20];
int age;
}; // ; 주의.
생긴 거는 구조체와 비슷하다. 하지만 몇 가지 점에서 다르다. 일단 public과 private를 사용하는데, 클래스의 주요 기능 중 하나인 '데이터 은닉'을 위해서다. 예를 들어 스타크래프트의 마린 공격력이 갑자기 500으로 훌쩍 뛰면 어떻게 될까? 그런 일은 있으면 안될 것이다. 이런 일을 방지하기 위해 데이터에 함부로 접근 못 하게 만들었다. 그게 private가 하는 역할이고, 디폴트가 private이기 때문에 딱히 안 써도 된다. 그러니까
class Student
{
void SetName(char name[]); // private 취급.
public: // 이 밑으로 public 취급.
void SetHeight();
private: // 이 밑으로 다시 private 취급.
char name[20];
float height;
이렇게 쓰면 SetName()은 자동으로 private 취급이 된다는 것이다. private 밑에 쓰인 멤버 변수 및 함수들은, public 부분에 선언된 함수(클래스 내의 함수는 '메서드'라고도 부른다.)를 통해서, 또는 나중에 배올 프렌드 함수를 통해서만 접근할 수 있다.
이런식으로 클래스를 구현하는 것을 '추상화'라고 한다. 나는 무슨 미술 추상화 생각하고 오랫동안 이해를 못하고 있었는데 찾아보니 다른 뜻이 있더라.
이 블로그에 설명이 잘 돼 있다.
그리고 세부적인 구현들을 따로 결합하여 추상화와 분리 하는 것을 '캡슐화'라고 한다. 데이터 은닉은 캡슐화의 한 예이다. 캡슐화의 또 다른 예는 클래스 함수들의 정의를 클래스 선언과 독립된 파일에 넣는 것이다. 이건 나중에 나온다.
클래스는 구조체와 마찬가지로 객체를 만들 수 있고, 그 public 멤버에 접근할 수 있다.
Student chulsoo;
chulsoo.SetName(chulsoo);
Student yuri;
void Student::SetName(char name[])
리턴형 클래스이름::함수이름() 이런 식이다. 이 함수 안에서 Student 클래스 내의 함수들은 범위 연산자를 사용하지 않아도 된다. 같은 클래스에 있기 때문이다.
또한 메서드에서는 같은 클래스 내의 public은 당연하고, private 멤버에도 접근 가능하다.
inline void SetName(char name[])
{
...
}