티스토리 뷰
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의 값만 읽어와 출력 하는것이니 쓰레기 값이 출력된다.
공용체를 사용하는 이유
- 메모리 절약을 위해서
- 구조체는 각 가정의 화정실, 공용체는 공원의 공중 화장실이라 생각하면 된다.
공용체 사용 시 유의 사항
- 공용체 멤버는 동시에 사용하게 되면 데이터가 변질될 우려가 있으므로 따로 따로 사용해야한다.
'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 |
- Total
- Today
- Yesterday
- JNI 시그니처
- 대항해시대
- EACCES: permission denied
- 대항해시대 런처
- Linux
- React.js
- 위대한 쇼맨 ost
- 위대한 쇼맨
- lxd
- 데스큐어
- 정보처리기사 2018 2회
- HTTPie
- JNI SIGNITURE
- 빈파일
- vite.js
- 다클 빈
- JNI INVOKE
- 위대한 쇼맨 후기
- 정보처리기사 실기 후기
- JNI
- 대항해시대 다클
- 구글 클라우드 플랫폼
- 정처기 실기
- 폴더선택다이얼로그
- OSI 7Layer
- 대항해시대 다음 런처
- 다클 코드
- 대항해시대 넷마블 런처
- 대항해시대 로그인
- 합격 후기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |