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

열거형

 

지금까지 학습한 int형과 double형 등의 형은 C++에 이미 준비되어 있는 형(기본형)으로 하였다. 이것에 대해 코드를 작성하는 사람에 따라 새로운 형을 작성할 수 있다. 이와 같은 형을 사용자 정의형(user defined type)이라고 한다. 새로운 형을 작성하려면 우선, 그 형이 어떤 값을 나타내는 것인가를 결정해야 한다. 열거형의 경우는 열거형의 선언에 의해 나타내는 값을 결정한다. 열거형을 선언하려면 enum이라는 키워드를 사용한다.

 

[구문 : 열거형의 선언]

enum 열거형명 {식별자1, 식별자2, 식별자3, ...};

 

열거형은 식별명을 값으로서 저장할 수 있는 형을 말한다. 예를 들면, 다음과 같은 것이 열거형이다.

 

enum week{SUN, MON, TUE, WED, THU, FRI, SAT};

이 열거형 week는 SUN, MON,...이라는 식별자의 값을 저장할 수 있는 형으로 된다.

 

열거형의 변수 선언

 

열거형을 선언하면 이것을 새로운 형으로 코드 내에 사용할 수 있게 된다. 예를 들면 week형의 변수라는 것을 코드 내에 선언할 수 있게 되는 것이다. week형의 변수도 통상의 변수와 똑같이 선언한다.

 

[구문 : 열거형 변수의 선언]

열거형명 열거변수명;

 

다음과 같이 선언한 변수 w는 week형의 값을 저장하는 변수로 된다.

week w;

 

그러면 실제로 열거형을 선언하여 이용해 보도록 한다. 다음의 코드를 살펴보도록 한다.

 

예제) 열거형 변수

요일을 나타내는 열거형 변수를 선언하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

//열거형 week형의 선언
enum week{SUN, MON, TUE, WED, THU, FRI, SAT};

int main()
{
	week w; //week형의 변수 w를 선언한다.
	w = SUN; //값 SUN을 대입한다.

	switch (w) {
	case SUN:cout << "일요일 입니다.\n"; break;
	case MON:cout << "월요일 입니다.\n"; break;
	case TUE:cout << "화요일 입니다.\n"; break;
	case WED:cout << "수요일 입니다.\n"; break;
	case THU:cout << "목요일 입니다.\n"; break;
	case FRI:cout << "금요일 입니다.\n"; break;
	case SAT:cout << "토요일 입니다.\n"; break;
	default:cout << "무슨 요일인지 모릅니다.\n"; break;
	}

	return 0;
}

 

구조체

 

구조체(structure data type)란 서로 다른 데이터형을 갖는 데이터들을 하나의 단위로 참조할 수 있도록 그룹처럼 만드는 것이다.

구조체형도 열거형과 똑같이 우리가 작성 가능한 사용자 정의형의 하나이다. 구조체형은 다른 형의 값을 종합하기 위한 형으로 되어 이다. 예를 들면, 집의 주소(char형), 평수(int형), 전화번호(char형) 등 다른 형의 값을 종합해서 집을 나타내는 형으로 만들 수 있다.

그러면 실제로 구조체를 결정하는 방법을 설명한다. 구조체의 모양을 만드는 것을 구조체형의 선언이라고 한다. 구조체는 struct라는 키워드를 사용하여 다음과 같이 선언한다.

 

[구문 : 구조체형의 선언]

struct 구조체형명 {
	형명 식별자;
	형명 식별자;
	...
};

 

구조체형은 블록 내에 변수 등을 종합해서 기술한 것이다. 예를 들면, 집의 주소, 평수와 전화번호를 관리하기 위한 구조체형 House의 선언은 다음과 같다.

여기서는 char형의 변수 address와 int형의 변수 space, char형의 변수 telephone을 선언하였다. address는 집의 주소를, space는 평수, telephone은 전화번호를 나타내기 위한 것이다.

 

구조체 변수의 선언

 

구조체형도 새로운 형으로서 코드 내에 사용할 수 있다. 예를 들면, 'House형의 변수'라는 것을 코드 내에 선언할 수 있도록 되어 있다. House형의 변수도 통상의 변수와 똑같이 선언한다.

 

[구문 : 구조체 변수의 선언]

구조체형명 구조체변수명;

 

다음과 같이 선언한 변수 house1은 구조체인 House형의 값을 저장하는 변수로 된다.

House house1;

 

멤버에 접근

 

구조체형 변수(구조체)를 선언하면 그중의 address, space와 telephone에 실제의 주소, 평수와 전화번호의 값을 저장할 수 있게 된다. 이 address, space와 telephone이란 변수를 멤버(member)라고 부른다. 구조체의 멤버를 이용하기 위해서는 도트 연산자(.)를 사용한다. 멤버를 이용하는 것을 멤버에 접근한다고 한다.

 

[구문 : 구조체의 멤버로의 접근]

구조체 변수명.멤버

 

예를 들면, 구조체형의 변수 house1의 경우에는 다음과 같이 대입을 해서 멤버에 값을 저장할 수 있다.

house1.address = "부산시"; //주소를 나타내는 멤버 address에 "부산시"를 대입한다.
house1.space = 45; //평수를 나타내는 멤버 space에 45를 대입한다.
house1.telephone = "629-3333"; //전화번호를 나타내는 멤버 telephone에 "629-3333"을 대입한다.

 

그러면 실제로 코드를 기술해 보도록 한다.

 

예제) 구조체 멤버의 접근

집의 주소, 평수, 전화번호로 구성된 구조체를 선언한 후 구조체 변수를 사용하여 멤버에 접근하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

struct House { //구조체형 House를 선언한다.
	char address[25];
	int space;
	char telephone[25];
};

int main()
{
	House house1; //House형의 구조체 변수 house1을 선언한다.

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

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

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

	cout << "집의 주소는 " << house1.address << " : 평수는 : " << house1.space
		<< " : 전화번호는 : " << house1.telephone << " 입니다.\n";

	return 0;
}

이 코드에서는 구조체형 House를 선언하고 있다. 다음에 House형의 변수인 house1을 선언한다. 또 변수 house1에 도트 연산자를 사용해서 각 멤버에 접근한다. 이와 같이 구조체 변수에 도트 연산자를 사용하면 구조체의 멤버에 접근하고 값을 저장할 수 있게 된다.

 

구조체의 초기화

 

이전에는 ①구조체를 선언한 후에 ②도트 연산자(.)를 사용해서 ③멤버에 값을 대입하는 방법을 사용하였다.

House house1; //구조체를 선언한다.
house1.address = "부산시"; //멤버에 접근한다.
house1.space = 45;
house1.telephone = "629-3333";

 

이번에는 이 3개의 작업을 동시에 종합해서 수행할 수도 있다. 이것을 구조체의 초기화라고 한다. 구조체의 초기화는 다음과 같이 수행한다.

House house1 = { "부산시", 45, "629-3333" };

변수를 초기화할 때에 { }로 둘러싸서 값을 기술하면 컴마로 구분한 순서대로 멤버에 값이 저장된다. 구조체에 나타내는 초기값을 부여할 때에는 편리한 기술이므로 기억해 두도록 한다.

 

[구문 : 구조체의 초기화]

구조체형명 구조체변수명 = {값, 값, ...};

 

구조체에 대입

 

지금까지는 각 멤버에 대해 대입 연산자로 값을 저장하는 코드를 소개하였다. 그러면 구조체 변수 그 자체에 대해 대입 연산자를 사용하면 어떻게 되는가?

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

 

예제) 구조체에서 대입 연산자의 사용

앞선 예제의 House 구조체에 대해 2개의 구조체 변수를 선언한 후, 구조체 변수끼리 대입하는 코드를 작성해 보도록 한다.

#include <iostream>
using namespace std;

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

int main()
{
	House house1 = { "부산시", 45, "629-3333" };
	House house2 = { "서울시", 27, "111-1000" }; //...①

	cout << "house1의 주소는 " << house1.address << " : 평수는 : " << house1.space
		<< " : 전화번호는 : " << house1.telephone << " 입니다.\n";
	cout << "house2의 주소는 " << house2.address << " : 평수는 : " << house2.space
		<< " : 전화번호는 : " << house2.telephone << " 입니다.\n";

	house2 = house1; //...②
	cout << "house1을 house2에 대입하였습니다.\n";

	cout << "house2의 주소는 " << house2.address << " : 평수는 : " << house2.space
		<< " : 전화번호는 : " << house2.telephone << " 입니다.\n";

	return 0;
}

① 여기서는 house1과 house2라는 2개의 구조체를 선언하였다.

② 이 대입은 house2의 멤버에 house1의 멤버를 1개씩 복사해서 값을 저장한다는 것을 의미하고 있다. 즉, 이와 같은 대입을 기술하면 house1의 멤버인 address, space와 telephone의 값이 house2의 멤버에 복사된다. 이 결과 house2의 주소, 평수와 전화번호는 house1과 똑같은 값이 된다. 구조체끼리 이와 같은 대입이 가능하므로 기억해 두어야 한다.

 

 

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

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

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