앞선 게시글에서 이야기한 것처럼, 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++에서 접근 제어자는 세 가지로 나뉩니다.
- private : 외부 접근을 막는다. 오로지 구조체 내부의 멤버 함수에서만 접근이 가능하다.
- protected : 해당 클래스 메서드와 상속을 받을 파생 클래스에서만 접근이 가능하다.
- 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은 동일한 기능을 수행합니다.
'학습 정리 > 📖 C,C++' 카테고리의 다른 글
[C에서 C++로 넘어가기] - 5. 정렬하기 : sort (0) | 2023.01.04 |
---|---|
[C에서 C++로 넘어가기] - 4. 문자열 입력받기 : String (0) | 2023.01.04 |
[C에서 C++로 넘어가기] - 3. cin, cout, endl (0) | 2023.01.04 |
[C에서 C++로 넘어가기] - 1. C와 C++의 차이, namespace (0) | 2023.01.03 |
[C] 유클리드 호제법을 이용해서 최대공약수와 최소공배수 구하기 (0) | 2022.07.06 |