Trivia
9강.구조체(3) 본문
9.1 공용체(Union)
▶메모리 영역을 여러 개의 변수들이 공유할 수 있게 하는 기능: 메모리 절약의 효과
▶선언하는 방법은 구조체와 매우 유사 (태그를 붙여 사용)
▶동시에 모든 멤버 변수들을 저장할 수 없으며 어떤 순간에는 하나의 멤버만 존재
▶가장 큰 멤버의 크기만큼의 메모리가 할당
union example {
char c; //같은 공간 공유
int i; //같은 공간 공유
};
- union: 키워드, example: 공용체 태그 이름
- 변수 c와 i: 공용체 멤버 변수
ex) 예제 프로그램
#include <stdio.h>
#include <stdlib.h>
union example {
int mem1;
int mem2;
double mem3;
};
int main()
{
union example ex;
ex.mem1=1230;
printf("%d\n",ex.mem2);
ex.mem3=3.09;
printf("%d\n",ex.mem1);
printf("%d\n",ex.mem2);
printf("%lf\n",ex.mem3);
return 0;
}
1230
-343597384
-343597384
3.090000
9.2 열거형(enumeration)
▶변수가 가질 수 있는 값들을 나열해 놓은 자료형
①변수가 가질 수 있는 값들을 나타내는 상수들을 모아놓은 자료형
②열거형으로 선언된 변수는 열거형에 정의된 상수들만을 소유
▶열거형의 정의
①enum이라는 키워드 사용
enum days {SUN, MON, TUE, WED, THU, FRI, SAT};
└태그 이름 └값들을 나열
enum days today; ─ 열거형 변수 선언
today = SUN; //ok!
②열거형의 예
enum colors {white, red, blue, green, black};
enum boolean {false, true};
enum levels {low, medium, high};
enum car_types {sedan, suv, sports_car, van, pickup, convertible};
▶열거형의 초기화
enum days {SUN, MON, TUE, WED, THU, FRI, SAT}; //SUN=0, MON=1, ...
enum days {SUN=1, MON, TUE, WED, THU, FRI, SAT}; //SUN=1, MON=2, ...
enum days {SUN=7, MON=1, TUE, WED, THU, FRI, SAT=6}; //SUN=7, MON=1, ...
①0에서 시작하여 1씩 증가하는 정수값으로 자동 설정
②값들의 배정은 사용자가 변경 가능, 식별자 뒤에 =1과 같이 붙임
③필요한 경우 모든 식별자들의 값을 지정 가능
ex) 예제 프로그램
#include <stdio.h>
#include <stdlib.h>
enum days {SUN, MON, TUE, WED, THU, FRI, SAT};
char *days_name[] = {"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"};
int main()
{
enum days d;
d=WED;
printf("%d번째 요일은 %s입니다.\n", d, days_name[d]);
return 0;
}
3번째 요일은 wednesday입니다.
▶다른 방법과의 상대적 비교
정수 사용 |
기호 상수 |
열거형 |
switch(code) { case 1: printf("LCD TV\n"); break; case 2: printf("PDP TV\n"); break; } |
#define LCD 1 #define PDP 2
switch(code) { case LCD: printf("LCD TV\n:); break; case PDP: printf("PDP TV\n:-"); break; } |
enum tvtype { LCD, PDP }; enum tytpe code; switch (code) { case LCD: printf("LCD TV\n"); break; case PDP: printf("PDP TV\n"); break; } |
컴퓨는 알기 쉬우나 사람은 기억하기 어려움. |
기호 상수를 작성할 때 오류를 일으킬 수 있음 |
컴파일러가 중복이 일어나지 않도록 체크함 |
▶열거형이 필요한 이유
①오류를 줄이고 프로그램의 가독성 상승
int today;
today = 0; //일요일
today = 1; //월요일
②0보다는 SUN이라는 기호 상수가 바람직
③today에 9와 같은 의미없는 값의 대입 차단
9.3 typedef
▶새로운 자료형(type)을 정의(definition)하는 것
- C의 기본 자료형을 확장시키는 역할
- 사용자가 새로운 자료형의 추가 가능
┌새로운 자료형 정의 ┌새로운 자료형
typedef unsigned char BYTE;
└기존의 자료형
- 사용 예
typedef unsigned char BYTE;
BYTE index //unsigned char index; 와 동일
typedef int INT32;
typedef unsigned int UNIT32;
INT32 i; //int i;와 동일
UINT32 k; //unsigned int k;와 동일
▶구조체로 새로운 자료형 만들기
struct point {
int x;
int y;
};
typedef struct point POINT;
POINT a, b;
- struct point를 새로운 타입인 POINT로 정의
- POINT라는 새로운 자료형 생성, 앞에 struct 불필요
ex) 예제 프로그램
#include <stdio.h>
typedef struct point {
int x;
int y;
} POINT;
POINT translate (POINT p, POINT delta);
int main()
{
POINT p = { 2, 3 };
POINT delta = { 10, 10 };
POINT result;
result = translate(p, delta);
printf("새로운 점의 좌표는 (%d, %d)입니다.\n", result.x, result.y);
return 0;
}
새로운 점의 좌표는 (12, 13)입니다.
▶typedef의 장점
①이식성 상승: 컴퓨터 하드웨어에 독립적으로 구축 가능
②#define보다 융통성 보장: typedef는 컴파일러가 직접 처리
③문서화의 역할: 주석을 붙이는 효과
ex) 예제 프로그램
//가장 학점이 높은 학생의 이름, 학번, 평점 출력
#include <stdio.h>
struct student {
int number;
char name[10];
double grade;
}
struct student list[] = {
{201812301, "홍길동", 4.0},
{201812302, "김태형", 3.5},
{201812303, "최민호", 3.9}
};
int main()
{
struct student best_s;
int i, size;
size = sizeof(list)/sizeof(list[0]);
best_s = list[0];
for(i=1; i < size; i++)
{
if(list[i].grade > best_s.grade)
best_s = list[i];
}
printf("학점이 가장 높은 학생은 [이름:%s, 학번:%d, 학점:%f]입니다.\n", best_s.name, best_s.number, best_s.grade);
return 0;
}
학점이 가장 높은 학생은 [이름: 홍길동, 학번: 201812301, 학점: 4.000000]입니다.
[응용예제 9.1] 공용체에 할당되는 메모리의 크기는 어떻게 결정되는가?
[답] 가장 큰 자료형에 맞춰서 결정
[응용예제 9.2] 열거형에서 특별히 값을 지정하지 않으면 자동으로 정수 상수값이 할당되는가?
[답] 0부터 시작되는 정수값이 할당
[응용예제 9.3] 사원을 나타내는 구조체를 정의하고 typedef를 이용하여 employee라는 새로운
타입으로 정의하시오.
[답] typedef struct
{
char name[20]; //이름
int age; //나이
int gender; //성별
int salary; //월급
} employee;
[응용예제 9.4] 다음 문장이 참인지 거짓인지 판단하시오.
typedef는 변수를 선언하는 키워드이다.
[답] 거짓, typedef는 자료형을 정의하는 키워드
[응용예제 9.5] 다음 열거형의 정의를 보고 각 식별자의 정수값을 예측하시오
enum colors {white, red=3, blue, green, black=9} |
|||||
식별자 |
white |
red |
blue |
green |
black |
값 |
|
|
|
|
|
[답]
enum colors {white, red=3, blue, green, black=9} |
|||||
식별자 |
white |
red |
blue |
green |
black |
값 |
0 |
3 |
4 |
5 |
9 |
[응용예제 9.6] 다음 코드에서 오류를 지적하시오.
union id {
char name[4];
long number;
} var = {"Min", 1};
[답] 공용체에서 모든 변수를 동시에 초기화 할 수 없음
strcpy(var.name, "Min");
var.number=1;
[응용예제 9.7] 다음 코드에서 오류를 지적하시오.
typedef enum {red, green, blue} color;
color.red = 1;
[답] color.red = 1; (x)
color c;
c = red;
[응용예제 9.8] 열거형과 #define을 사용하는 방법의 차이점은 무엇인가?
[답] 차이점 없음 (어떤 것을 사용해도 상관없음)