구조체와 클래스의 차이

C 언어를 공부하다가 구조체라는 개념을 접하게 되고, C++ 언어를 공부하다가 클래스라는 개념을 접하게 됩니다. 절차 지향 언어에서 객체 지향 언어로 넘어가게 되면 클래스와 객체가 아주 중요한 개념이라는 것을 알게 되는데 사실 C 언어에서 배운 구조체와 큰 차이가 없습니다.

구조체와 클래스

#include <iostream>
using namespace std;

struct Point {
int xpos;
int ypos;
};

int main(void) {
Point point = {1, 2};

cout << point.xpos << "," << point.ypos << endl;

return 0;
}
#include <iostream>
using namespace std;

struct Point {
int xpos;
int ypos;
};

int main(void) {
Point point = {1, 2};

cout << point.xpos << "," << point.ypos << endl;

return 0;
}

간단한 구조체를 C++ 언어로 구현하였습니다. 사실 구조체와 클래스 모두 데이터를 묶을 수 있는 명령어입니다. 여기서 구조체를 클래스로 바꾸고 싶으면 struct를 지우고 class로 바꿔주면 됩니다. 그러나 바로 오류가 발생하는데 둘 다 기능도 같고, 선언도 동일한데 어디서 이런 오류가 발생했을까요?

접근 제어 지시자

C++ 언어의 접근 제어 지시자는 다음과 같이 세 가지가 있습니다.

접근 제어 지시자허용 범위
public어디서든 접근 허용
protected상속 관계에서 유도 클래스의 접근 허용
private클래스 내에서만 접근 허용

구조체의 경우 접근 제어 지시자를 따로 선언하지 않으면 모든 객체와 메서드는 public으로 선언됩니다. 클래스의 경우 접근 제어 지시자를 따로 선언하지 않으면 모든 객체와 메서드는 private으로 선언됩니다.

즉, 발생한 오류는 클래스의 접근 제어 지시자를 따로 명시해주지 않았기 때문에 접근이 불가능해서 생긴 오류입니다. 따라서 다음과 같이 코드를 수정해주면 오류가 해결됩니다.

#include <iostream>
using namespace std;

class Point {
public:
int xpos;
int ypos;
};

int main(void) {
Point point = {1, 2};

cout << point.xpos << "," << point.ypos << endl;

return 0;
}
#include <iostream>
using namespace std;

class Point {
public:
int xpos;
int ypos;
};

int main(void) {
Point point = {1, 2};

cout << point.xpos << "," << point.ypos << endl;

return 0;
}

기능면에서 구조체와 클래스의 차이는 없습니다. 둘 다 데이터를 묶는 동일한 역할을 합니다. 그러나 문법적으로 struct로 선언하느냐 class로 선언하느냐에 따라 접근 제어 지시자를 고려해주어야 합니다.