관리자 글쓰기
C++ 열거형, 구조체, 공용체2
2022. 5. 4. 21:09 - pingu-s

구조체의 응용

 

인수로 구조체를 사용

 

구조체는 여러 가지 코드 내에 사용할 수 있다. 여기에서는 구조체를 응용하는 코드를 작성하는 것으로 한다. 우선 최초에 구조체를 함수 내에 이용하는 방법을 살펴보도록 한다. 구조체는 함수의 인수로 이용할 수 있다. 다음의 코드를 살펴보도록 한다.

 

예제) 구조체를 함수의 인수로 사용

이전 예제의 House 구조체를 show() 함수의 인수로 전달하고, show() 함수에서 구조체의 멤버를 출력하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//구조체형 House의 선언
struct House {
	char address[20];
	int space;
	char telephone[20];
};

//함수의 선언
void show(House h);

int main()
{
	House house1 = { "", 0, "" };

	cout << "주소를 입력하세요=> ";
	cin >> house1.address;

	cout << "평수를 입력하세요=> ";
	cin >> house1.space;

	cout << "전화번호를 입력하세요=> ";
	cin >> house1.telephone;

	show(house1);

	return 0;
}

void show(House h)
{
	cout << "집의 주소는 " <<  h.address << " : 평수는 : " <<  h.space
		<< " : 전화번호는 : " <<  h.telephone << " 입니다.\n";
}

포인터 파트에서 학습한 것처럼 인수는 원칙적으로 값 전달(pass by value)로 함수 내에 전달되는 것으로 하였다. 구조체를 인수로 한 경우에도 이 전달된다. 이것은 실인수의 구조체의 멤버의 값이 각각 복사되어 함수의 본체에 전달된다는 것을 의미하고 있다. 즉, 여기서는 구조체의 멤버인 address, space와 telephone의 값이 복사되어 함수에 전달되도록 되어 있다.

 

구조체의 포인터를 인수로 사용

 

구조체를 인수로 사용하면 각 멤버의 값이 복사되어 함수 내에 전달된다. 단, 멤버가 많이 있는 구조체를 인수로 사용하는 경우에는 주의가 필요하다. 함수를 호출할 때마다 많은 멤버가 복사되기 때문에 함수의 호출에 시간이 걸리는 경우가 있다. 이 때문에 큰 구조체를 함수의 인수로 취급할 경우에는 구조체로의 포인터를 인수로 사용할 수 있다. 즉, 구조체형의 변수의 주소를 사용하도록 하는 것이다.

구조체로의 포인터를 함수의 인수로 해 두면 주소를 전달하는 것만으로 함수가 호출된다. 그렇게 하면 큰 구조체의 경우에는 처리 속도가 향상하는 경우가 있다. 또한 이 경우는 인수를 실질적으로 참조 전달(pass by reference)하는 것이 되므로 전달한 구조체의 멤버의 값을 함수 내에 변경할 수 있다.

 

단, 이와 같은 함수 내에서는 구조체로의 포인터를 사용해서 각 멤버에 접근하는 처리를 기술해야 한다. 포인터로부터 멤버에 접근하는 경우에는 화살표 연산자(->)를 이용한다.

 

[구문 : 구조체형의 포인터로부터 멤버에 접근]

구조체형의 포인터 -> 구조체 멤버

다음의 코드를 입력해 보도록 한다. 이번에는 인수로서 구조체로의 포인터를 전달하는 함수를 사용한 것이다.

 

예제) 구조체로의 포인터로부터 멤버에 접근

앞선 예제에서 사용한 House 구조체를 show() 함수의 인수로서 포인터형을 전달하고, show() 함수에서 구조체의 멤버를 출력하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//구조체형 House의 선언
struct House {
	char address[20];
	int space;
	char telephone[20];
};

//함수의 선언
void show(House *pH); //구조체로의 포인터를 인수로 가지는 함수이다.

int main()
{
	House house1 = { "", 0, "" };

	cout << "주소를 입력하세요=> ";
	cin >> house1.address;

	cout << "평수를 입력하세요=> ";
	cin >> house1.space;

	cout << "전화번호를 입력하세요=> ";
	cin >> house1.telephone;

	show(&house1); //구조체 house1(의 주소)을 전달한다. 

	return 0;
}

//이 함수 내에서는 포인터가 전달되므로 멤버에 접근할 경우에는 도트 연산자(.)가 아니고 
//화살표 연산자(->)를 사용한다.
void show(House *pH)
{
	cout << "집의 주소는 " << pH->address << " : 평수는 : " << pH->space
		<< " : 전화번호는 : " << pH->telephone << " 입니다.\n";
}

이 코드와 같은 작은 구조체에서는 인수가 포인터가 아니라도 호출의 속도는 거의 바뀌지 않는다. 그러나 멤버를 많이 가지는 큰 구조체를 사용할 경우에는 이 점을 무시할 수 없는 경우도 있기 때문에 기억해 두는 것이 좋다.

 

구조체로의 참조를 인수로 사용

 

포인터 파트에서는 포인터 대신에 참조로 인수를 사용하는 방법을 학습하였다. 구조체 변수로의 참조를 인수로 사용해도 앞선 예제와 똑같은 효과를 얻는다. 그래서 여기에서도 참조를 사용한 경우의 코드를 나타내도록 한다.

 

예제) 참조를 함수의 인수로 사용

앞선 예제에서 사용한 House 구조체를 show() 함수의 인수로서 참조형을 전달하고, show() 함수에서 구조체의 멤버를 출력하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//구조체형 House의 선언
struct House {
	char address[20];
	int space;
	char telephone[20];
};

//함수의 선언
void show(House &pH); //구조체로의 참조를 인수로 가지는 함수이다.

int main()
{
	House house1 = { "", 0, "" };

	cout << "주소를 입력하세요=> ";
	cin >> house1.address;

	cout << "평수를 입력하세요=> ";
	cin >> house1.space;

	cout << "전화번호를 입력하세요=> ";
	cin >> house1.telephone;

	show(house1);

	return 0;
}

void show(House &pH)
{
	cout << "집의 주소는 " << pH.address << " : 평수는 : " << pH.space
		<< " : 전화번호는 : " << pH.telephone << " 입니다.\n";
}

이 코드의 실행 결과는 앞선 예제들과 똑같다. 단, 이 코드에서는 함수 내에 멤버에 접근할 때 화살표 연산자(->)가 아니고, 도트 연산자(.)를 사용하고 있다는 것에 주의해야 한다. 구조체형으로의 포인터로부터 접근할 때만 화살표 연산자를 사용한다.

 

공용체

 

공용체형(union data type)은 구조체형과 유사한 형식을 가지는 사용자 정의이다. 공용체형의 선언은 다음과 같다.

 

[구문 : 공용체형의 선언]

union 공용체형명 {
	형명 식별자;
	형명 식별자;
};

 

공용체형은 구조체형의 struct 키워드 대신에 union이라는 키워드를 사용한다. 공용체형도 공용체형의 변수를 준비함으로써 값을 저장할 수 있게 된다.

단, 공용체형의 각 멤버는 다른 값을 기억할 수 있는 것은 아니고, 전체 1개밖에 기억할 수 없다는 특징이 있다. 다음의 코드를 살펴보도록 한다.

 

예제) 공용체형의 사용

성별을 나타내는 공용체형을 선언하고, 공용체가 코드에서 동작하는 방법을 살펴보도록 한다.

#include <iostream>
using namespace std;

//공용체형 Gender(성별)의 선언
union Gender {
	char man;
	char woman;
};

int main()
{
	Gender my;

	cout << "man의 성별을 입력하세요(M/F) => ";
	cin >> my.man;

	cout << "man의 성별은 " << my.man << "입니다.\n";
	cout << "woman의 성별은 " << my.woman << "입니다.\n";

	cout << "woman의 성별을 입력하세요(M/F) => ";
	cin >> my.woman;

	cout << "woman의 성별은 " << my.woman << "입니다.\n";
	cout << "man의 성별은 " << my.man << "입니다.\n";

	return 0;
}

코드의 실행 결과를 주의 깊게 살펴보도록 한다. 공용체의 멤버 man과 woman은 다른 값을 기억할 수 없다는 것을 안다.

어떤 멤버의 값을 변경하면 다른 멤버의 값도 똑같은 것으로 변경된다. 공용체의 멤버는 모두 메모리의 똑같은 위치를 공유하고 값을 저장한다. 그 때문에 man에 값을 대입하면 woman의 값은 man과 똑같이 되어 버린다. 또한 woman에 값을 대입하면 역으로 man의 값이 woman과 똑같이 되어버린다.

이와 같이 공용체는 한정된 메모리를 절약하기 위해 사용되는 형으로 되어 있다.

 

typedef

 

typedef는 지금까지 학습한 int형과 double형 등의 형에 대해 새로운 이름을 붙이기 위한 키워드이다.

typedef는 다음과 같이 사용한다.

 

[구문 : typedef]

typedef 형명 식별자;

 

다음 코드를 살펴보도록 한다.

 

typedef unsigned long int abc;

이 코드는 unsigned long int형에 abc라는 짧은 이름을 붙인 것이다. 이와 같이 typedef를 사용하면 다음과 같이 abc형 변수 num을 사용할 수 있게 된다.

 

abc num = 1;

이 문은 실질적으로는 다음의 코드와 똑같은 의미로 된다.

 

unsigned long int num = 1;

 

즉, typedef는 이미 있는 형에 대해 다른 이름을 붙일 수 있다. typedef를 사용하면 긴 이름의 형에 다른 이름을 붙일 수 있기 때문에 코드를 읽기 쉽게 할 수 있다.

 

 

출처: 박흥복서정희. 2015. C++ 프로그래밍 (초보자를 위한). 문운당

'개발 > C++' 카테고리의 다른 글

C++ 클래스와 객체2  (0) 2022.05.11
C++ 클래스와 객체  (0) 2022.05.07
C++ 열거형, 구조체, 공용체  (0) 2022.05.04
C++의 고급 기능2  (0) 2022.04.11
C++의 고급 기능  (0) 2022.04.08