학습 정리/📖 C,C++

[C에서 C++로 넘어가기] - 2. class

무딘붓 2023. 1. 4. 11:26

앞선 게시글에서 이야기한 것처럼, C++이란 C언어에 Class가 추가된 언어입니다.

이번 게시글에서는 Class가 무엇인지 살펴보겠습니다.


class란?

 

클래스(class)의 정의는 " 특정한 용도를 수행하기 위한 변수와 함수를 모아 둔 틀 " 입니다.

 

언뜻 보면 클래스라는 게 C언어의 구조체(struct)와 비슷해 보입니다.

자세히 살펴보면, C언어의 구조체(struct) / C++의 구조체(struct) / C++의 클래스(class) 셋은 조금씩 다릅니다.

 

 

먼저 C++의 구조체가 C언어의 구조체와 다른 점은 다음과 같습니다.

  • 함수를 구조체 멤버로 사용할 수 있다.
  • typedef를 따로 선언하지 않아도, struct 키워드를 생략할 수 있다.
  • 접근 제어자, 상속, 생성자, 소멸자도 선언가능하다.

 

 

C++의 구조체가 C++의 클래스와 다른 점은 다음과 같습니다.

  • C++ 구조체는 기본 접근 제어자public 이다.
  • C++ 클래스는 기본 접근 제어자 private 이다.

 

이 점을 제외하면, C++의 구조체와 클래스는 동일합니다.

 

요약하면, C++의 클래스는 C언어의 구조체에서 몇 가지 기능( 함수를 멤버로 사용가능, 접근 제어자 등 )이 추가되었고, 기본 접근 제어자가 private인 것이라고 할 수 있습니다.

 

함수를 구조체 멤버로 사용 가능하다는 것은 이해하기 어려운 개념이 아니지만, 접근 제어자는 낯선 개념입니다.

한번 접근 제어자에 대해 살펴보겠습니다.


접근 제어자

 

접근 제어자는, 구조체의 멤버를 외부에서 접근할 수 있는지 여부를 결정합니다.  

 

일반적으로, C언어의 구조체 멤버는 외부에서 접근이 가능합니다. 예를 들면,

#include <stdio.h> 

struct book {
	char title[30];
	char author[30];
	int price;
};

int main() {
	struct book b1 = { "TITLE", "KIM", 10000 };
	printf("제목 : %s, 저자 : %s, 가격 : %d.\n", b1.title, b1.author, b1.price);
}

위와 같이 선언된 구조체의 멤버 title, author, price를 main함수에서 접근하여 사용할 수 있습니다.

 

 

C++에서는 구조체의 멤버를 외부에서 접근하지 못하게 할 수 있습니다. 이를 위해 사용하는 것이 바로 접근 제어자입니다.

 

C++에서 접근 제어자는 세 가지로 나뉩니다.  

  1. private ​: 외부 접근을 막는다. 오로지 구조체 내부의 멤버 함수에서만 접근이 가능하다. 
  2. protected  : 해당 클래스 메서드와 상속을 받을 파생 클래스에서만 접근이 가능하다. 
  3. public  : 외부 접근이 가능하다. 메인 함수, 다른 클래스 함수, 외부 함수 등에서 접근이 가능하다.

 

사용 예시를 한번 살펴보겠습니다.

#include <iostream>
using namespace std;

struct book {
private:
	char title[30];
	char author[30];
	int price;
public:
	void SetPrice(int num) {
		if (num >= 0) {
			price = num;
		}
	}
};

int main() {
	book b1;
	b1.SetPrice(1000);
	return 0;
}

C의 구조체와 달리, 위의 구조체 book의 멤버인 title, author, price는 외부에서 직접 접근할 수 없습니다.

따라서, main함수에서 b1.title = "boook"; 과 같은 코드를 작성하면 바로 오류가 나게 됩니다.

 

( + typedef를 따로 선언하지 않았지만 struct 키워드를 생략하여 book b1을 선언한 것이 보이시나요? )

 

 

이와 같이 접근을 제어해서 몇 가지 기능을 구현할 수 있습니다.

예를 들어, price에 이상한 값 (예를 들어 -2000) 이 입력되는 것을 막을 수 있습니다.

 

price가 외부에서 접근이 가능하면 b1.price=-2000; 으로 잘못된 값이 입력될 수 있지만,

위의 코드에서는 b1.SetPrice(-2000); 으로만 입력이 가능하고, SetPrice가 이상한 값은 한번 걸러주므로, 좀 더 안전하게 변수를 관리할 수 있습니다.

 

C++의 class는 여기서 기본 접근 제어자가 private라는 점만 다릅니다. 즉,

struct book {
private:
	char title[30];
	char author[30];
	int price;
public:
	void SetPrice(int num) {}
};

struct book2 {
	void SetPrice(int num) {}
private:
	char title[30];
	char author[30];
	int price;
};

class book3 {
	char title[30];
	char author[30];
	int price;
public:
	void SetPrice(int num) {}
};

위의 구조체 book1, book2 그리고 클래스 book3은 동일한 기능을 수행합니다.