티스토리 뷰

1. 구조체란?

- 하나 이상의 서로 다른 종류의 변수들을 묶어서 새로운 자료형을 정의하는 것이다.

 

 

구조체를 사용하는 이유

- 연관된 변수들을 하나로 묶어서 관리함으로써 데이터 관리에 유용하다.

- 데이터의 양이 많아지면 구조체가 유리하다.

- 예를 들어 학생정보 관리 변수를 생성할때 이름, 나이, 성별 등의 정보들은 모두 변수로 선언하여 각각의 변수를 별도로 관리하면 연관성을 알 수가 없다. 

 

 

구조체 정의 방법

#include 
struct student
{
	char name[10];
	int age;
	int height;
};	// 구조체 정의

int main(void)
{
	struct student st1;	// 구조체 선언
	struct student st2;
}

 

- struct 키워드는 구조체라는 자료형을 의미

- student 는 만든 구조체의 이름

- name, age, height는 구조체 멤버 변수

- 구조체는 사용자가 정의한 새로운 자로형이다.

 

 

구조체 멤버 접근 방법

- 구조체 변수를 통해 구조체 멤버의 값을 참조해야 한다.

- 멤버에 접근시 . 콤마를 사용하는데, 이를 직접 접근이라 한다.

 

[구조체 변수명].[구조체 멤버]

ex) st1.name

ex) st1.age

ex) st1.height

 

 

 

2. 공용체란?

- 공용체도 사용자가 정의한 자료형이다

- 구조체와의 차이점은 메모리 공간을 공유한다는 점이다.

 

struct stTemp
{
	char a;
	int b;
	double c;
}st;

 

위와 같은 구조체가 있을때 메모리가 차지하는 용량은

a = 1byte, b = 4byte, c = 8byte 로 총 13byte가 메모리에 적재된다.

union unTemp
{
	char a;
	int b;
	double c;
}un;

 

위의 공용체와 같은 경우는 구조체와는 전혀 다른 메모리 적재방식이 적용된다.

제일 큰 멤버변수 double형 c가 8byte가 메모리에 적재되어 각각의 변수가 1회용으로 8byte 메모리안에 적재된다.

구조체는 멤버변수가 각각의 메모리 공간을 할당받고 있지만 공용체는 같은 메모리공간을 모든 변수가 공유하는 형태이다.

 

#include 

union unTemp
{
	char a;
	int b;
	double c;
}un;

int main(void)
{
	printf("문자형 a의 주소와 크기 : %x, %d\n", &un.a, sizeof(un.a));
	printf("정수형 b의 주소와 크기 : %x, %d\n", &un.a, sizeof(un.b));
	printf("실수형 c의 주소와 크기 : %x, %d\n", &un.a, sizeof(un.c));

	un.a = 'A';
	printf("문자형 a의 값 : %c\n", un.a);
	un.b = 100;
	printf("정수형 b의 값 : %d\n", un.b);
	un.c = 3.14;
	printf("실수형 c의 값 : %.2f\n", un.c);
	printf("문자형 a의 값 : %c\n", un.a);
	return 0;
}

 

 

- 시작 주소는 세 변수가 모두 같다.

- 예제의 마지막줄 a값을 다시 출력 시 쓰레기값이 출력된다. 

- 그 이유는 double형 8byte에 저장된 값은 3.14인데 그중 1byte의 값만 읽어와 출력 하는것이니 쓰레기 값이 출력된다.

 

공용체를 사용하는 이유

- 메모리 절약을 위해서

- 구조체는 각 가정의 화정실, 공용체는 공원의 공중 화장실이라 생각하면 된다. 

 

공용체 사용 시 유의 사항

- 공용체 멤버는 동시에 사용하게 되면 데이터가 변질될 우려가 있으므로 따로 따로 사용해야한다.