클래스(Class)와 구조체(Struct)의 차이

구조체에 대한 설명과 클래스와 구조체의 차이

 

 

 

연관있는 데이터를 하나로 묶는다는 기본 개념은 동일하다. 그러면 각각은 무엇이고 둘의 차이는? 

 

◎ 구조체

C++에서 구조체를 선언하는 방법

Struct My_S
{
	char name[MAX_LEN];
	int age;
	int number;
}

 

 

C++에서는 C에서 처럼 typedef를 추가할 필요 없이 사용이 가능하다.

int main()
{
	My_S info = {"hi", 90, 100}
	
	info.name = "hello";
	info.age = 100;
	info.number = 7;
}

 

 

구조체와 클래스를 비교하면서 구조체에는 함수를 추가하지 못한다는 이상한 내용도 가끔 보이는데 아니다.

C++에서는 구조체 안에도 함수 추가 가능하다

Struct My_S
{
	char name[MAX_LEN];
	int age;
	int number;
    
    void SetMyAge(int _age)
	{
		age = _age;
	}
}

 

여기서 내가 My_S 구조체의 변수를 여러 개 선언해서 메모리 공간에 구조체 변수가 할당이 될 때, 

함수는 모든 구조체 변수 내에 각각 별도로 존재하는 것이 아니다.

구조체 안의 함수는 한 번만 선언된 하나의 함수를 공유한다. 

 

 

그리고 물론 이 함수를 외부로 뺄 수도 있다.

Struct My_S
{
	char name[MAX_LEN];
	int age;
	int number;
    
    void SetMyAge(int _age);
}

void My_S::SetMyAge(int _age)
{
	age = _age;
}

 

함수 원형 선언은 구조체 안에 두고 정의를 밖으로 빼서 정의하는 것이다.

딱히 쓸 일이 없어 보이지만 구조체를 보는 순간 정의와 기능을 한 눈에 파악하기 쉽게 작성하는 데 도움이 되기도 한다. 

 

그런데 구조체 안에 함수가 정의 되어있을 때와 바깥에 있을 때 다른 점이 하나 존재한다.

바로 구조체 안에 있을 때는 함수가 inline으로 처리되고 있다는 점이다. 

인라인의 의미를 그대로 유지하고 싶다면 inline 키워드를 사용해서 명시적으로 지시하면 된다. 

 

 

 

 

 

◎ 클래스

구조체는 클래스의 일종이다.

struct를 사용하면 구조체, class를 사용하면 클래스가 되는 것이다.

Class My_S
{
	char name[MAX_LEN];
	int age;
	int number;
}

위의 구조체와 비교했을 때 기본 선언 시 사용하는 키워드만 다를 뿐이다.

 

 

그런데 이 키워드의 차이는 초기화의 방법의 차이를 발생시킨다.

int main()
{
	My_S info = {"hi", 90, 100};
}

struct는 이와같은 방법으로 초기화가 가능했지만 클래스에서는 불가능하다.

그 이유는 클래스 내에 선언된 함수가 아니고 다른 영역에서 초기화를 하려고 했기 때문이다. 

클래스는 기본적으로 별도의 선언이 없다면 클래스 내에 선언된 변수는 클래스 내에 선언된 함수에서만 접근이 가능하다. 

 

여기서 접근에 대한 구분이 존재한다. 그것을 접근제어 지시자라고 하는데

public 모두에게 공개; 아무나 접근 가능
protected 상속관계로 얽혀있는 클래스에서만 접근허용
private 클래스 안에서만 건들일 수 있다.

 

접근제어 지시자를 명시하지 않으면 class는 기본으로 private으로 설정한다. 

그래서 위의 class는 private으로 지정되어 있어 외부에서 접근이 불가능한 것이다. 

 

 

이 접근제어 지시자는 구조체에서도 선언이 가능하다.

단, 클래스에서는 따로 지정하지 않으면 private으로 설정이 되지만 구조체에서는 public으로 설정이 된다. 

 

 

 

 

 

 

 

 

 

참고 자료;

윤성우의 열혈 C++ 프로그래밍 ( 저; 윤성우, 출판사; 오렌지 미디어)

'Study > C++ , C#' 카테고리의 다른 글

[C#] 닷넷 API  (0) 2021.12.22
[C++] 전처리기 지시문  (0) 2020.01.19
[C++] QueryPerformanceCounter / 프로그램 실행 시간 측정  (0) 2020.01.15
[C++] 매크로 함수와 인라인 함수(Inline)  (0) 2020.01.10
[C++] new 와 delete  (0) 2020.01.10

+ Recent posts