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)라고 한다.

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

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

 

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

 

 

struct student {
       char *department;
       int grade;
       int number;
       char *name;
       int age;
       char *phone;
};
struct student P={"computer", 3, 2006, ,“김철수”, 57, 3668-4652};

위의 내용을 아래와 같이 선언할 수도 있다.
struct student {
	char *department;
	int grade;
	int number;
	char *name;
	int age;
	char *phone;
} 
P={"computer", 3, 2006, ,“김철수”, 57, 3668-4652};

한편, 앞의 구조체 student의 예에서 department, grade, number, name, age, phone를 구조체 멤버라고 하는데
이 멤버에 값을 입력하기 위해 멤버 연산자인 도트(.)를 사용할 수 있다.
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;

구조체를 사용한 예를 살펴보기로 한다.
#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); 

}



2. 공용체의 개념

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

예를 들면 다음과 같다.


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;

컴파일러는 지정된 구성자 중 가장 많은 메모리를 차지하는 경우에 맞추어 메모리를 할당하게 된다.
union의 구성자를 접근하는 방법은 struct의 구성자를 접근하는 방법과 같다.
다음의 프로그램은 union을 어떻게 사용하는지를 보이고 있다.
#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);
}

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


i: 0000004444 f: 4.3387349787e-29

i: -0536852854 f: 4.4440000000e+03

 

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

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

Comments