LuvSea

구조체와 공용체 본문

sTudy

구조체와 공용체

사랑海 2009. 11. 16. 11:38
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

출처 : http://blog.naver.com/zeooss/30040261787 

1. 구조체의 개요

구조체는 서로 다른 자료형의 변수들을 합쳐서 하나의 논리적인 형으로 선언할 수 있는 방법이다.
이것은 형(type)이 같은 데이터를 하나의 묶음으로 처리하고자 할 때 사용하는 배열(array)와는 다르다는 점이다.
일반적으로 데이터를 구성하고 있는 가장 작은 단위를 필드(field)라고 하며 필드가 두 개 이상 모여서 레코드(record)를 구성한다.
C 언어에서는 레코드를 구조체라고 하고, 레코드를 구성하고 있는 필드들을 구조체의 멤버라고 한다.
구조체가 필요한 이유를 살펴보기로 한다.

우리가 대학에서 학생 정보 관리 프로그램을 C 언어로 만든다고 가정하자.
학생 한 사람당 “학과, 학년, 학번, 이름, 나이, 전화번호”의 항목들로 구성되고 학생 수가 100명이라고 할 때 데이터를 보다 빨리 처리할 수 있는
방법이 구조체라고 할 수 있다. 구조체는 데이터를 넣을 변수들을 하나로 묶어서 학생이라는 구조체를 만들어 사용할 수 있다는 점이다.

즉 구조체는 다음과 같이 요약될 수 있다.

• 몇 가지 서로 다른 데이터형을 조직화하여 하나의 묶여진 단위로 표현

• 복잡한 데이터를 통일적으로 처리하는 수단

• 사용자가 데이터 형을 정의

• 여러 데이터의 유형을 묶어서 새로운 데이터형을 사용하여 표현

따라서 구조체는 한 개의 자료가 여러 개의 데이터 형(data type)으로 구성되는 복합 데이터형이라고 할 수 있으며 그 형식은 아래와 같다.

struct 구조체명 {

       멤버1의 선언;

       멤버2의 선언;

         . . .
         . . . 

       멤버n의 선언;

};

이러한 구조체는 다음과 같은 성질을 갖고 있다.

 

- 구조체는 하나의 구조체명(태그)를 가질 수 있다.

- 구조체 내의 변수 선언은 멤버(member)라고 한다.

- 구조체 내의 멤버로 또 다른 구조체를 가질 수 있다.

- 구조체를 선언하면 구조체의 형식만 선언되고 실제로 자료는 할당되지 않으므로 구조체 형식 선언 후에 
  구조체 변수를 따로 잡아 값을 할당해야 한다.

 

위에서 설명한 학생정보를 활용하기 위한 구조체 구성 형태는 아래와 같다.

 

 

1
2
3
4
5
6
7
8
9
struct·student·{¬
·······char·*department;¬
·······int·grade;¬
·······int·number;¬
·······char·*name;¬
·······int·age;¬
·······char·*phone;¬
};¬
struct·student·P={"computer",·3,·2006,·,“”,·57,·3668-4652};
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

위의 내용을 아래와 같이 선언할 수도 있다.
1
2
3
4
5
6
7
8
9
10
struct·student·{¬
————char·*department;¬
————int·grade;¬
————int·number;¬
————char·*name;¬
————int·age;¬
————char·*phone;¬
}·¬
P={"computer",·3,·2006,·,“”,·57,·3668-4652};¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

한편, 앞의 구조체 student의 예에서 department, grade, number, name, age, phone를 구조체 멤버라고 하는데
이 멤버에 값을 입력하기 위해 멤버 연산자인 도트(.)를 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct·student·{¬
————char·*department;¬
————int·grade;¬
————int·number;¬
————char·*name;¬
————int·age;¬
————char·*phone;¬
};¬
¬
··¬
¬
struct·student·P;¬
P.department="computer";¬
P.grade=3;¬
P.number=2006;¬
P.name="“;¬
P.age=57;¬
P.phone=3668-4652;¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

구조체를 사용한 예를 살펴보기로 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include·¬
¬
¬
struct·employee·{¬
————char·*year_month_day·;¬
————char·*salary·;¬
————short·int·status·;¬
————long·int·salary_amount·;¬
};¬
¬
void·main()¬
{¬
¬
————struct·employee·P1,·P2;¬
————P1.year_month_day·=·"2005-11-22";¬
————P1.salary·=·"";¬
————P1.status·=·1;¬
————P1.salary_amount·=·3000000;¬
————P2.year_month_day·=·"2005-11-22";¬
————P2.salary·=·"";¬
————P2.status·=·2;¬
————P2.salary_amount·=·2000000;¬
¬
··¬
¬
————printf("%s·%s·%d·%ld",·P1.year_month_day,·P1.salary,·P1.status,·P1.salary_amount);·¬
————printf("%s·%s·%d·%ld",·P2.year_month_day,·P2.salary,·P2.status,·P2.salary_amount);·¬
¬
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX



2. 공용체의 개념

공용체(union)란 한개 이상의 변수가 기억장소를 공유하고 있는 구조라고 할 수 있다.
공용체는 구조체와 비슷하나 그 안의 모든 멤버 변수들이 기억장소를 공유하는 것으로 성격이나 용도는 완전히 다르다.
즉 모든 멤버 변수들의 주소가 같다는 것이다. 그러므로 어떤 멤버 변수의 내용이 바뀌면 다른 모든 멤버 변수의 내용도 바뀌게 된다.

예를 들면 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
union·test{¬
————int·i;¬
————char·ch[2];¬
}·confirm;¬
¬
//·····confirm···2000·.¬
¬
confirm.i·=·100;.·/*·2000·2··100··*/¬
¬
confirm.ch[0]·=·5;·/*·2000·1··5·.·*/¬
¬
confirm.ch[1]·=·9;·/*·2001·1··9·.·*/¬
¬
¬
//·····.¬
¬
union·int_or_float·{¬
————int·n;¬
————float·x;·¬
}·temp;¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

컴파일러는 지정된 구성자 중 가장 많은 메모리를 차지하는 경우에 맞추어 메모리를 할당하게 된다.
union의 구성자를 접근하는 방법은 struct의 구성자를 접근하는 방법과 같다.
다음의 프로그램은 union을 어떻게 사용하는지를 보이고 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include·¬
¬
union·int_or_float·{¬
————int·n;¬
————float·x;¬
};¬
¬
void·main()¬
¬
{¬
¬
————union·int_or_float·temp;¬
————¬
————temp.n=4444;¬
————printf("i:·%15.10d·f:·%15.10e\n",·temp.n,·temp.x);¬
¬
————temp.x=4444.0;¬
————printf("i:·%15.10d·f:·%15.10e\n",·temp.n,·temp.x);¬
}¬
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

앞의 간단한 실험에서 우리는 C컴파일러가 int와 float를 어떻게 중첩시키는가를 알 수 있다. 다음은 앞의 프로그램을 실행시킨 결과이다.


i: 0000004444 f: 4.3387349787e-29

i: -0536852854 f: 4.4440000000e+03

 

이 결과에서 볼 수 있듯이 C 컴파일러는 메모리의 동일 주소에 저장된 값도 어떤 형의 구성자가 선택되엇느냐에 따라 다르게 해석된다는 것을 알 수 있다.
따라서 프로그래머는 적절한 구성자가 선택되도록 주의해야만 한다.

공용체는 여러 가지 형의 구성자가 같은 기억장소를 사용하게 함으로써 메모리를 절약할 수 있다.