구조체(struct)와 클래스(class)는 C++에서 데이터 집합을 정의하고 저장하기 위한 목적으로 사용됩니다.
struct Man
{
char name[100];
int age;
}
class Woman
{
char name[100];
int age;
}
둘의 역할은 비슷하면서도 차이점이 존재하는데 이어지는 섹션에서 하나씩 살펴보도록 하겠습니다.
디폴트 접근 제한자의 차이
디폴트 접근 제한자는 접근 제한자를 명시하지 않은 멤버 변수, 멤버 함수에 대해서 컴파일러가 생성하는 기본적인 접근 제한자입니다.
C++에서는 자바와 마찬가지로 디폴트 접근 제한자가 존재합니다.
struct Man
{
char name[100]; // public
int age; // public
}
우선 struct에서 디폴트 접근 제한자는 public입니다. 이는 자바의 interface가 갖는 디폴트 접근 제한자와 동일합니다.
class Woman
{
char name[100]; // private
int age; // private
}
class에서의 디폴트 접근 제한자는 private입니다. 마찬가지로 자바의 class가 갖는 디폴트 접근 제한자와 동일합니다.
struct에서의 함수 선언
C++의 struct는 함수 선언이 가능합니다. 사실 C의 struct에서도 함수 선언이 가능하지만, 함수 포인터를 사용해야하는 문제로 일반적인 용법은 아닙니다.
반면 C++에서는 일반적인 class의 멤버 함수와 동일한 문법으로 선언 할 수 있습니다.
struct Human
{
char name[100];
int age;
void printInfo()
{
std::cout << name << ", " << age;
}
}
디폴트 접근 제한자 외에 차이점은 없다
그 외 C++의 struct는 class와의 차이점이 없습니다.
필드와 메소드가 동일한 struct와 class를 정의하고 컴파일 결과를 디버깅하면 어셈블리 코드가 완전히 동일한 것을 확인 할 수 있습니다.
물론 디폴트 접근 제한자의 차이도 접근 제한자를 명시적으로 사용하게 되면 문제되지 않습니다.
결론적으로 문법 상의 사소한 차이-디폴트 접근 제한자가 존재하지만 그 외에는 완전히 동일합니다.
그럼에도 불구하고 C++의 struct는 단순한 데이터 집합을 표현하기 위한 컨테이너의 목적으로 사용됩니다.
이는 C의 struct에서 이어지는 관습적인 구분이라고 볼 수 있으나, 일반적인 용법에 벗어나는 방식으로 struct와 class를 혼용 할 필요는 없어보입니다.
정리 및 복습
struct의디폴트 접근 제한자는 public입니다. 이는 자바의 interface와 같습니다.class의디폴트 접근 제한자는 private입니다. 이는 자바의 class와 동일합니다.- struct에서도 함수 선언이 가능하며
그 외 struct와 class가 갖는 차이점은 없습니다. - 하지만 관습적인 구분에 따라서 여전히
struct를 데이터 집합 표현의 목적으로 사용하는 것이 좋습니다.
'C++ > C, C++, STL' 카테고리의 다른 글
스마트 포인터(Smart pointer)와 종류 (0) | 2024.02.08 |
---|---|
클래스 소멸자(Destructor) (0) | 2024.02.08 |
자기 자신을 나타내는 this 포인터 (0) | 2024.02.04 |
얕은 복사(Shallow copy)와 깊은 복사(Deep copy) (0) | 2024.02.04 |
이중 포인터와 동적 다차원 배열에 대한 이해 (0) | 2024.02.04 |