프로그래밍 언어 활용 part 1 - 공용체와 열거체
공용체와 열거체
[학습내용] | [학습목표] |
▪ 공용체 ▪ 열거체 |
▪ 공용체의 개념을 알고 구현할 수 있다. ▪ 열거체의 용도를 알고 코드에 적용할 수 있다. |
공용체
1. 공용체 활용
동일한 저장 장소에 여러 데이터 타입을 저장하는 자료구조
▪ 멤버들이 메모리를 공유해서 사용하는 기법
▪ 공용체의 크기는 공용체의 멤버 중 가장 크기가 큰 멤버에 의해 결정
▪ 공용체 변수를 초기화할 때는 첫 번째 멤버의 초기값만 지정
union sungjuk {
char grade;
int score;
}
union sungjuk std = { ‘B’ };
▪ 공용체의 멤버에 접근할 때도 ‘.’와 ‘->’ 연산자를 사용함
union sungjuk std;
std.grade = ‘B’;
std.score = 97 ;
union sungjuk std;
union sungjuk *pu = &std;
pu→grade = ‘B’;
pu→score = 97 ;
#include <stdio.h>
union sungjuk {
char grade;
int score;
};
int main()
{
union sungjuk std ;
std.grade = 'B';
printf("%c %d \n", std.grade, std.score);
std.score = 97;
printf("%c %d \n", std.grade, std.score);
printf("size %d", sizeof(std));
return 0;
}
▪ 구조체와 공용체 비교
구조체 | 공용체 |
![]() |
![]() |
2. 비트필드
▪ 구조체가 가진 멤버를 비트 단위로 사용
▪ 비트필드 정의
멤버 이름 ➕ : ➕ 비트 수 기술
struct Date {
int day;
int month;
int year
};
struct Date {
int day:5; // 1~31
int month:4; // 1~12
int year:13; // 1~4096
};
▪ 메모리에 할당할 때, 첫 번째 멤버를 최하위 비트에서부터 할당
▪ 비트필드의 멤버에 표현 가능한 범위 밖의 값을 저장하면 오버플로우가 발생
#include <stdio.h>
struct Date {
int day:5; // 1~31
int month:4; // 1~12
int year:13; // 1~4096
};
int main()
{
struct Date ent;
ent.month = 17;
printf("%d \n", ent.month);
printf("size %d", sizeof(ent));
return 0;
}
▪ 비트필드를 정의할 때는 중간에 일부 비트를 비워두고 멤버를 특정 비트에 할당할 수 있음
struct product
unsigned int code : 6; //상품코드 6비트
unsigned int : 10; //10비트는사용하지않음
unsigned int color : 5; //색상 5비트
unsigned int : 5; //5비트는 사용하지 않음
unsigned int size : 3; //크기 3비트
};
리틀 엔디안과 빅 엔디안
리틀 엔디안 | 빅 엔디안 |
최하위 바이트부터 메모리에 저장하는 방식 ⬇ 인텔 계열의 CPU |
최상위 바이트부터 메모리에 저장하는 방식 ⬇ 모토로라 계열의 CPU |
열거체
1. 열거체 활용
▪ 나열된 정수 값 중 하나를 갖는 정수형의 일종
enum week { sun, mon, tue, wed, thu, fri, sat }; //sun은 0으로, mon은 1로,∙∙∙ sat은 6으로 정의됨
enum color { red = 10, green = 20, blue = 30 }; //red는 10, green은 20, blue는 30으로 정의됨
▪ 일종의 사용자 정의형
▪ 열거체 변수에는 열거체 정의에 나열된 열거 상수 중 하나를 저장하고 사용
enum week weekday; //열거체형 변수를 선언함
weekday = mon; mon //열거상수는 한 눈에 월요일이라는 것을 알 수 있음
▪ 열거 상수만 정수형 상수로 정의할 수도 있음
enum {red = 10, green = 20, blue = 30};
프로그램의 가독성(Readability)을 향상시키기 위해 사용
#include <stdio.h>
enum weekday {sun, mon, tue, wed, thu, fri, sat};
int main()
{
enum weekday w_day;
printf("Input 0~6 : ");
scanf("%d", &w_day); printf("\n");
switch(w_day){
case sun : printf("Sunday"); break;
case mon : printf("Monday"); break;
case tue : printf("Tuesday"); break;
case wed : printf("Wednesday"); break;
case thu : printf("Thursday"); break;
case fri : printf("Friday"); break;
case sat : printf("Saturday"); break;
default : printf(" Input Correct Number ");
}
return 0;
}
2. typedef
재정의
▪ 데이터 타입의 이름을 새로운 이름으로 재정의
▪ 코딩의 편리성 증대
▪ 프로그램의 시스템 간 호환성 향상
편리성
▪ 구조체에서의 typedef
struct telephone {
char *name;
int num;
};
typedef struct telephone TEL;
or
typedef struct telephone {
char *name;
int num;
}TEL;
호환성
struct salary {
int pay;
int time;
}
typedef int SIZE;
struct salary {
SIZE pay;
SIZE time;
}
학습정리
1. 공용체
▪ 공용체는 멤버들이 메모리를 공유해서 사용하는 자료구조임
▪ 비트필드는 구조체 멤버를 비트 단위로 할당하여 사용함
2. 열거체
▪ 열거체는 정수형의 일종으로 변수가 가질 수 있는 값을 열거 상수로 나열하는 것임
▪ typedef은 기존의 데이터형에 새로운 이름을 만드는 기능임
▪ typedef는 호환성과 가독성을 향상시키는 목적으로 사용함