목차
- 01. Intro
- 02. Class vs Struct
- 기본 접근 지정자
- Class와 Struct 차이점 확인
- 생성자
- 상속
- 함수 선언 및 정의
- 03. 마무리
- 04. 연관 내용
01. Intro
이번에는 C++에서 클래스와 구조체의 차이점에 대해서 살펴보겠습니다.
또한, 차이점을 알아보면서 그와 연관된 개념들을 한 번 알아보겠습니다.
02. Class vs Struct
C++에서 클래스와 구조체의 차이점은 [기본 접근 지정자가 다르다] 하나뿐입니다.
클래스는 기본 접근 지정자가 private입니다.
구조체는 기본 접근 지정자가 public입니다.
그렇다면, 접근 지정자가 무엇인지 먼저 알아보겠습니다.
접근 지정자
우리가 어떤 클래스의 함수나 변수를 호출할 때, 접근하다고 말합니다.
하지만, 해당 변수와 함수의 접근 지정자에 따라 우리가 접근할 수 있는 상황이 다릅니다.
그래서, C++에서의 접근 지정자 따라 언제 접근할 수 있는지 확인해 보겠습니다.
C++에서는 접근 지정자로 3가지의 종류가 있습니다.
1. public : 외부에서 접근할 수 있습니다. 접근 지정자 중에 가장 접근이 원활합니다.
2. protected : 외부에서는 접근할 수 없지만, 상속받았을 때는 접근이 가능합니다. public 보다는 접근이 제한됩니다.
3. private : 가장 폐쇄적인 접근 지정자입니다. 외부 및 상속 대상에서는 접근이 불가능합니다.
이에 대한 예시를 사진과 함께 살펴보겠습니다.
public

public 영역에 선언된 _variable 변수에 대해 외부 영역인 main 함수에서 접근할 수 있음
protected

protected 영역에 선언된 _variable 변수는 외부 영역인 main 함수에서 접근할 수 없음을 확인

A클래스를 상속받은 B클래스에서는 _variable 변수에 대해서 접근할 수 있음
private

private 영역에 선언된 _variable 변수는 상속된 클래스라도 접근할 수 없음을 확인
Class와 Struct 차이점 확인
위에서 알아본 접근 지정자를 바탕으로 Class와 Struct의 차이점을 예시 코드를 통해 확인해 보겠습니다.
예시
- 예시 코드

클래스 A와 구조체 B를 선언했습니다.
- 외부에서 접근

구조체에서 선언된 멤버 변수는 접근할 수 있지만,
클래스에서 선언된 멤버 변수는 접근할 수 없는 모습을 확인
- 상속받은 클래스 예시

상속받은 클래스에서도 부모 클래스의 멤버 변수에 접근할 수 없는 모습을 확인
결론
예시를 통해서 확인하니
클래스의 기본 접근 지정자는 private이고 구조체의 기본 접근 지정자는 public입니다.
클래스의 멤버 변수를 외부에서 접근하기 위해서는 반드시 public: 레이아웃을 선언한 밑의 영역에서 변수를 선언해야 합니다.
생성자
그렇다면, 클래스와 구조체에서 다른 기능은 사용할 수 있는지 한 번 알아보겠습니다.
먼저 생성자입니다.

클래스 A와 구조체 B에 대해서 생성자를 명시적으로 작성하고
main 함수에서 각 객체를 생성했습니다.

클래스와 구조체 둘 다 생성자가 정삭적으로 작동하는 것을 확인했습니다.
상속
생성자도 가능한 것을 확인했으니, 상속도 가능한지 확인해 보겠습니다.

클래스 A를 상속 받은 클래스 C와 구조체 B를 상속 받은 구조체 D에 대해서
각각 객체를 생성한 뒤, 멤버 변수를 출력해 보겠습니다.

컴파일 시, 문제없이 출력되는 것을 보아하니 상속도 정상적으로 작동하는 것을 확인했습니다.
함수 선언 및 정의
그렇다면, 마지막으로 구조체에서도 함수 선언 및 정의가 가능한지 확인해 보겠습니다.

구조체와 클래스에 대해서 위 사진처럼 선언 및 정의를 했습니다.

main 함수에서는 위 사진처럼 객체를 생성하고 각 함수를 호출한 뒤, 멤버 변수에 대해서 출력했습니다.

실행 결과, 정상적으로 더해진 뒤, 출력되는 것을 확인했습니다.
이뿐만 아니라 함수 오버라이딩, 가상 함수, 순수 가상 함수 등도 가능한 것을 확인했으나 추후에 자세히 다루겠습니다.
03. 마무리
'C++에서 구조체와 클래스의 차이점이 왜 기본 접근 지정자만 없을까?'라는 생각을 해봤습니다.
자료를 찾아본 결과, C++는 C의 구조체와 호환성을 유지하면서, C++의 객체지향 기능을 제공하기 위해 확장했기 때문입니다.
즉, C++의 구조체는 객체지향 기능이 확장된 C의 구조체이므로 이와 같은 결과가 나온 것입니다.
04. 연관 내용
읽어주셔서 감사합니다.
틀린 내용 지적은 언제나 환영입니다!
'게임 개발 > C++' 카테고리의 다른 글
| [C++] 오버라이딩 - 2. 가상 함수 테이블 & 포인터 (0) | 2025.02.25 |
|---|---|
| [C++] 오버라이딩 - 1. 정적 & 동적 (0) | 2025.02.24 |
| [C++] 컴파일 과정 - 번외. 심볼과 심볼 테이블 (2) | 2025.02.22 |
| [C++] 컴파일 과정 - 3. 링크 단계 (0) | 2025.02.21 |
| [C++] 컴파일 과정 - 2. 컴파일 단계 (0) | 2025.02.20 |