본문 바로가기
C C++/C언어 기초

C++ # - 클래스를 위한 C++에서의 구조체

by Go! Jake 2023. 5. 10.

 

 

 

 

 

구조체 등장 배경

C에서 배운 구조체는 연관있는 데이터를 묶어 관리하기 편리하게 만드는 문법적 장치였다. 예를 들어 학생에 대한 정보를 관리할 때 하나의 구조체 변수에 키, 나이, 성별, 이름 등등을 관리할 수 있다.

 

C에서 모두 배웠기 때문에 자세한 설명은 넘어가도록 한다.

 

구조체 안에 함수 삽입하기

C++과 C언어 구조체의 차이점 중 하나는 C++에서는 구조체 안에 함수를 넣을 수 있다.

#include <iostream>
using namespace std;

struct person{
	void test()
	{
	cout<<"hi";
	}
};

int main()
{
	person p;
	p.test();
	return 0;
}

person이라는 구조체 안에 test() 함수가 입력되어있고, hi라고 출력하도록 되어있다.

이와 같이 구조체 안에 함수를 삽입할 수 있다.

 

이를 활용한 예시를 보도록 하자. 구조체 안에 변수가 있다면 이 변수의 값을 구조체 안의 함수가 그대로 활용할 수 있다.

#include <iostream>
using namespace std;

struct person{
	int a;
	test(){
	cout<<a*10;
	}
};

int main()
{
	person p;
	p.a=100;
	p.test();
	
	return 0;
}

- person이라는 구조체 안에는 a라는 변수와 test() 함수가 있다. 테스트 함수는 a 값에 10을 곱한 후 출력한다.

- 실행 해 보면 test() 함수가 a 값을 그대로 사용하는 것을 알 수 있다.

 

C++ 구조체 선언

C에서는 다음과 같이 구조체를 선언하였다.

struct Person{
	int age;
};

int main(){
	struct Person p;
}

struct Person p;로 선언한다.

 

이 때 Person p;로 간단히 선언하고 싶다면, typedef를 선언해왔다. 바로 아래처럼이다.

아래 typedef struct p에서 p는 있어도 되고, 없어도 된다. 맨 마지막에 붙는 Person으로 선언할 수 있다.

typedef struct p{
	int age;
}Person;

int main(){
	Person p;
}

 C++에서는 이러한 typedef 없이 선언이 가능하다.

struct Person{
	int age;
};

int main(){
	Person p;
}

 

구조체 안에 함수 삽입

구조체에 함수를 삽입하고 함수를 이용하는 방법을 알아보자.

struct Person{
	int age;
	int height;
	void ShowInfo()
	{
		std::cout<<age<<std::endl;
		std::cout<<height<<std::endl;
	}
};

int main(){
	Person p={1,2};
	p.ShowInfo();
	
	Person c={3,4};
	c.ShowInfo();
}

struct Person 구조체 안에 void ShowInfo(); 함수가 정의되었다.

이 때 age와 height를 출력하고 있다. 이 때! 다른 것 없이 그대로 age와 height 변수를 참조할 수 있다.

구조체 내에서 직접 접근할 수 있는 것이다.

 

아래를 살펴보자.

int main(){
	Person p={1,2};
	p.ShowInfo();
	
	Person c={3,4};
	c.ShowInfo();
}

Person p와 Person c를 각각 1,2 / 3,4로 초기화하였고, 이를 Person 구조체 내의 함수인 ShowInfo(); 를 통해 출력할 수 있다.

 

출력값은 아래와 같다.

1
2
3
4

 

구조체 안에 enum 삽입

아래 내용에서 CUSTOMER_MAX는 4로 define되어있고 이를 구조체 내에 date의 크기를 정의하는 데 쓰이고 있다.

#include <iostream>

#define CUSTOMER_MAX 4

struct Person{
	int age;
	int height;
	int date[CUSTOMER_MAX];
};

하지만 여기서 CUSTOMER_MAX는 Person이라는 구조체 내에서만 필요한 매크로이므로, enum으로 정의하여 사용한다.

 

아래와 같이 enum으로 구조체 내에서 정의한다면 구조체 내에서만 유효한 상수가 된다.

#include <iostream>

struct Person{
	enum{
		CUSTOMER_MAX = 4
	};
	int age;
	int height;
	int date[CUSTOMER_MAX];
};

main을 아래와 같이 정의한다면,

int main(){
	Person p;
	std::cout<<CUSTOMER_MAX;
	std::cout<<p.CUSTOMER_MAX;
}

첫 째줄의 std::cout<<CUSTOMER_MAX;는 오류가 발생하고,

두번째줄의 std::cout<<p.CUSTOMER_MAX;는 정상적으로 4 값을 표출한다.

 

외부로 함수 빼기

구조체 내에 함수를 정의할 때, 선언만 하고 정의는 이후에 할 수 있다. 이렇게 하는 이유는 구조체를 봤을 때 복잡한 함수 내용 하나하나를 보는 것이 아니라 구성만 빠르게 판단할 수 있기 때문이다.

 

아래 구조체를 보자.

struct Person{
	int age;
	int height;
	void print_age();
	void print_height();
};

print_age함수와 print_height 함수가 있다. 이 둘은 age와 height를 출력하는 함수로 보인다. 구조체가 간단하다. 그리고 함수 정의는 그 뒤에 해 줄 수 있다. 함수 이름 앞에 Person::을 붙이는 것을 확인하자.

struct Person{
	int age;
	int height;
	void print_age();
	void print_height();
};

void Person::print_age(void){
	cout<<age<<endl;
}

void Person::print_height(void){
	cout<<height<<endl;
}

전체 코드는 아래와 같다.

#include <iostream>
using namespace std;

struct Person{
	int age;
	int height;
	void print_age();
	void print_height();
};

void Person::print_age(void){
	cout<<age<<endl;
}

void Person::print_height(void){
	cout<<height<<endl;
}

int main(){
	Person p;
	p.age=1;
	p.height=2;
	
	p.print_age();
	p.print_height();
}

 

p.print_age();와 p.print_height();의 출력 결과는 아래와 같다.

1
2

 

함수를 구조체 내에 직접 정의하면 inline처리가 되는 데, 밖으로 빼면 inline처리가 되지는 않는다. 따라서 구조체 내에 직접 정의하고 싶은 효과도 같이 내고 싶다면, 아래처럼 정의하자.

inline void Person::print_age(void){
	cout<<age<<endl;
}

inline void Person::print_height(void){
	cout<<height<<endl;
}

 

 

 

댓글