C++에서 구조체와 클래스의 차이

Mr.뉴트리아·2021년 12월 18일
1

fundamental C++

목록 보기
2/2

이 글은 fundamental c++의 내용을 참고하여 작성되었습니다.

1.C의 구조체, C++의 구조체.

C를 공부하신 분들은 구조체에 대해 아실겁니다. 명확하게 정의를 하자면 "여러 타입의 자료형을 한 곳에 모아놓은 확장 자료형"이죠. 말 그대로 확장된 자료형이기에 함수를 추가한다거나 하는 행동은 C에서는 불가능합니다. 그럼 C++에서는 과연 어떨까요?

#include <stdio.h>

typedef struct myStruct
{
	int		a;
	int		b;
	void	printMyName()
	{
		printf("my name is 뉴트리아!\n");
	}
}			myStruct;

int	main()
{
	myStruct	myStruct;
	myStruct.printMyName();
	return 0;
}

아래 코드를 각각 c, c++환경에서 컴파일 해보겠습니다.

예상했던대로 c에서는 printMyName이란 멤버를 가질 수 없다고 나오죠.

c++에서 동일한 코드가 정상적으로 나오는 것을 볼 수 있습니다. 이는 C++ 컴파일러를 사용하면서 구조체의 기능이 클래스처럼 확장되었다고 보는것이 맞다고 할 수 있습니다.

이렇게 보면 구조체와 클래스는 차이점이 없다고 볼 수 있지만, 접근 지정자 부분에서 꽤나 큰 차이를 보입니다.

2. 클래스와 구조체의 기본 접근 지정자

둘의 차이 중 하나는 기본적으로 주어지는 접근 지정자가 다르다는 것입니다.

구조체의 기본 접근 지정자는 public, 클래스의 기본 접근 지정하는 private로 서로 다른 것을 알 수 있습니다.

typedef struct myStruct
{
	int		a;
	int		b;
	void	printMyName()
	{
		printf("구조체 : my name is 뉴트리아!\n");
	}
}myStruct;

class	myClass
{
	int		a;
	int		b;
	void	printMyName()
	{
		printf("클래스 : my name is 뉴트리아!\n");
	}
};

여기 동일한 기능을 하는 구조체와 클래스가 있습니다. 멤버 모두 동일하며 접근 지정자를 따로 선언하지도 않았습니다. 먼저 구조체부터 다시 실행시켜보겠습니다.

정상적으로 실행됩니다. 그러면 클래스도 동일하게 실행시켜보겠습니다.

호출하려는 해당 함수가 private라 접근이 불가능하다고 컴파일 단계에서 오류를 띄워줍니다. 당연하게도 접근 지정자를 pulbic으로 해주면 문제는 해결되지요. 그렇다면 왜 구조체와 클래스의 기본 접근 지정자가 다른 것일까요?

C언어에서는 예전부터 아~주 많은 프로그램에서 구조체가 사용되고 있었으며, 애초에 그 당시엔 구조체에 접근 지정자라는 개념 자체가 없었습니다. 만약 구조체의 기본 접근 지정자가 private라면, 그동안 만들어진 모든 소스코드들 모드 컴파일이 되지 않을 것입니다. 또한 접근 지정자는 객체지향 개념에서 클래스의 캡슐화(또는 정보은닉화)개념을 구현하기 위해 도입된 것이므로, 하위 호환성 고려는 물론 외부의 접근을 자유롭게 허용하는 구조체는 당연히 public으로 지정될 수 밖에 없는 것이지요.

하지만 클래스는 캡슐화를 기본으로 하면서 외부에 공개할 것을 특별히 public을 지정하도록 설계가 되어있기에 기본 접근 지정자가 private인 것입니다.

저는 코드를 작성할 때 작은 범위의 클래스가 필요할때는 구조체를 주로 사용하고, 나머지는 클래스로 작성하는 스타일을 가지고 있습니다. 예를 들어 RPG를 만든다면, 몬스터의 클래스 안에 몬스터의 좌표를 저장하는 pt라는 구조체를 사용하는 형태로 코드를 작성합니다.

요약.
1.구조체는 기본 접근 지정자가public인 이유는 호환성 때문.
2.클래스는 기본 접근 지정자가 private인 이유는 객체지향 설계 때문.
3.상황에 맞게 잘 쓰자.

profile
뉴트리아는 가시쥐과에 속하는 설치류의 일종이다. 오랫동안 뉴트리아과의 유일종으로 분류했지만, 현재는 가시쥐과에 포함시킨다. 늪너구리, 해리서 또는 코이푸라고도 한다. 뉴트리아는 스페인어로 수달을 의미하고, 출생지 남미에서는 이 종류를 코이푸라고 부른다.

0개의 댓글