본문 바로가기
C++ 독학/[C++ 독학] C++ 배우기

[C++ 독학] 클래스 <C++의 핵심> 07

by NpsCause 2022. 7. 22.

클래스

구조체의 형제, C++의 핵심 요소

 

우리는 앞전 시간에 구조체에 대해서 알아보았다. 클래스도 구조체와 같이 자료의 집합이다. 

클래스로 선언한 자료를 '객체'또는 '인스턴스'라고 부른다.

 

클래스(Class) : 변수나 메소드의 집합으로 객체를 생성하기 위한 틀이다

객체(Object) : 클래스로 생성된 구조적 대상

인스턴스(Instance) : 실질적인 메모리를 할당받는 실체

 

세 개념이 아직 명확하지 않기 때문에 클래스의 활용법을 보면서 정리해 본다.


클래스의 선언과 구성

클래스는 클래스 선언부클래스 구현부로 나뉜다.

클래스의 선언부와 구현부로 나누는 이유는 클래스의 재사용을 위해서이다. 클래스를 사용하는 다른 C++파일에서는 선언 부만 필요하기 때문이다.


클래스 선언부

클래스는 'class'키워드와 클래스 이름으로 선언한다.

클래스는 맴버변수멤버 변수와 멤버함수로 구성되는데 멤버 변수는 객체의 상태(state)를 멤버 함수는 객체의 행동(behavior)을 나타낸다. 

class Name{ // Name 이름의 클래스 선언
	int m_func();   // 맴버 함수
	int m_value;  // 맴버 변수
}; // 반드시 세미콜론(;)으로 종료

클래스 구현부

클래스 구현부에서는 클래스 선언부에 선언된 멤버함수의  코드를 구현한다. 

멤버함수의 구현은 클래스 밖에 이루어지는데 다음과 같은 형태로 사용한다.

맴버함수 구현


접근 지정자

클래스는 외부에서 맴버 변수나 맴버 함수에 접근하는 것을 제한함으로써 객체를 지킨다. 

이를 캡슐화라고 부르고 클래스의 접근 지정자를 이용해서 외부의 접근을 제한할 수 있게 된다.

 

C++의 접근 지정자

  • public : 모든 접근을 허용한다. public 아래 있는 멤버 변수, 멤버 함수는 외부에서 자유자재로 사용 가능하다
  • private : 외부에서 접근이 불가능하다. 클래스의 내부에서만 사용이 가능하다.
  • protected : 상속받은 클래스에서만 사용이 가능하다. 

접근 지정자 뒤에는 항상 콜론(:)을 붙인다.

class Human{ 
public:
    void walk();   // 접근가능
    void speak();  // 접근가능
private:
    int blood;   // 접근 불가능
    int bones;   // 접근 불가능
};

 

여기에서 클래스와 구조체의 차이점을 알 수 있는데 클래스는 아무것도 명시하지 않으면 private으로 보호되지만 구조체는 public으로 보호되지 않는다.


셋터와 겟터 (setter/ getter )

private으로 선언된 클래스의 멤버 변수에 접근하려면 셋터(setter)와 겟터(getter) 함수를 사용해야 된다.

 

위의 Human클래스를 예로 들어 보겠다.

셋터 함수는 멤버 변수에 값을 지정하는 역할을 한다.

void Human::set_blood(int blood_v){
	blood = blood_v;
}

겟터 함수는 멤버 변수의 값을 가져오는 역할을 한다.

int Human::get_blood(){
	return blood
}

클래스 객체 생성

Human 클래스의 객체를 생성하는 과정이다.

int main(){
    Human h1;
    Human h2;
}

Human 클래스의 h1, h2 객체가 생성되었다.

이와 같이 Human클래스는 한 개로 여러 개의 h1, h2와 같은 객체를 생성할 수 있다. 

 

만약 여기에 아래와 같이 메모리를 할당하게 된다면

int main(){
    Human h1; // h1은 Human의 객체
    Human h2; // h2는 Human의 객체
    
    h1 = new Human(); // h1은 Human의 인스턴스
    h2 = new Human(); // h2는 Human의 인스턴스
}

이와 같이 객체에 메모리를 할당한 것을 인스턴스라고 부를 수 있다.

사실상 같은 개념이다.

 

마치며

클래스는 C와 C++를 구분하는 가장 큰 기능적 차이이다. 그만큼 클래스가 중요한 개념이고 필수적으로 사용할 줄 알아야 한다.

 

 

댓글