9. 객체와 클래스(2) - 추상화와 클래스

WanJu Kim·2022년 12월 9일
0

C++

목록 보기
39/81

클래스는 다음과 같이 이루어져 있다.

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;
  • 클래스 멤버 함수 구현
    클래스 선언할 때 원형으로 만든 함수를 구현해주어야 한다. 함수를 만들 때랑 거의 비슷한데 조금 다른 점이 있다면, 어떤 클래스에 속하는지 알려주기 위해 범위 연산자(::)를 쓴다. 예를 들어 위의 SetName() 함수의 머리는 다음과 같을 것이다.
void Student::SetName(char name[])

리턴형 클래스이름::함수이름() 이런 식이다. 이 함수 안에서 Student 클래스 내의 함수들은 범위 연산자를 사용하지 않아도 된다. 같은 클래스에 있기 때문이다.
또한 메서드에서는 같은 클래스 내의 public은 당연하고, private 멤버에도 접근 가능하다.

  • 인라인 메서드
    클래스 선언 안에 정의를 가지고 있는 함수는 자동으로 인라인 함수가 된다. 보통 클래스 선언은 짧은 멤버 함수들은 인라인 함수로 사용하는 경우가 많다. 원한다면 클래스 외부에 선언해도 된다.
inline void SetName(char name[])
{
	...
}
profile
Question, Think, Select

0개의 댓글