1. 구조체란?
- 하나 이상의 서로 다른 종류의 변수들을 묶어서 새로운 자료형을 정의하는 것이다.
구조체를 사용하는 이유
- 연관된 변수들을 하나로 묶어서 관리함으로써 데이터 관리에 유용하다.
- 데이터의 양이 많아지면 궂체가 유리하다.
- 예를 들어 학생정보 관리 변수를 생성할때 이름, 나이, 성별 등의 정보들은 모두 변수로 선언하여 각각의 변수를 별도로 관리하면 연관성을 알 수가 없다.
구조체 정의 방법
#includestruct 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, st1.age, 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 메모리안에 적재된다.
구조체는 멤버변수가 각각의 메모리 공간을 할당받고 있지만 공용체는 같은 메모리공간을 모든 변수가 공유하는 형태이다.
#includeunion 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의 값만 읽어와 출력하는것이니 쓰레기값이 출력된다.
공용체를 사용하는 이유
- 메모리 절약을 위해서
- 구조체는 각 가정의 화정실, 공용체는 공원의 공중 화장실이라 생각하면 된다.
공용체 사용 시 유의 사항
- 공용체 멤버는 동시에 사용하게 되면 데이터가 별질될 우려가 있으므로 따로 따로 사용해야한다.
'C' 카테고리의 다른 글
[C언어] 메모리의 구조와 동적메모리 할당 (malloc, free, calloc, realloc, memset, memcpy, emecmp) (0) | 2018.08.24 |
---|---|
[C언어] 열거형 enum (0) | 2018.08.24 |
c언어 배열 (0) | 2018.07.22 |
C언어 산술, 관계, 논리연산자 (0) | 2018.07.22 |
C언어 포인터의 크기와 데이터 타입 (1) | 2018.07.14 |