티스토리 뷰
2021.03.06.토
공용체
✔ 공용체는 선언 방식이 구조체와 같지만, 공용체는 모든 멤버가 하나의 저장 공간을 같이 사용한다.
union student{
int num;
double grade;
};
✔ 공용체는 union 예약어를 사용해 선언하며, 구조체와 마찬가지로 공용체 변수를 선언해 사용할 수 있다.
✔ 공용체 역시 선언 후 세미콜론을 붙여 마무리해야한다.
✔ 이 때, 저장 공간이 할당되는 방식과 초기화하는 방식은 다음 규칙을 따른다.
//공용체 변수의 크기는 멤버 중 가장 큰 자료형의 크기로 설정
printf("st1의 크기 : %lu\n", sizeof(st1));
✔ 공용체 변수의 크기는 멤버 중 크기가 가장 큰 멤버로 결정된다.
✔ student 공용체의 경우 가장 큰 double형만큼의 크기인 8바이트의 저장 공간이 할당 된다
//union student st1 = { 315, 3.4 }; //Error!
//선언과 동시에 하는 초기화는 첫번째 멤버 변수만 가능
union student st1 = { 315 };
printf("st1.num = %d\n", st1.num);
printf("st1.grade = %.2lf\n\n", st1.grade);
//다른 멤버 변수를 초기화하면, 기존의 멤버 변수는 쓰레기값으로 채워짐.
st1.grade = 3.4;
printf("st1.num = %d\n", st1.num);
printf("st1.grade = %.2lf\n\n", st1.grade);
✔ 공용체 변수의 초기화는 중괄호를 사용하여 첫번째멤버만 초기화한다.
✔ 공용체는 한번에 하나의 멤버 변수만 사용할 수 있기 때문.
✔ 다른 멤버 변수를 초기화 하면 기존의 변수는 사용할 수 없으며, 쓰레기값으로 채워진다.
✔ 첫번째 멤버가 아닌 다른 멤버 변수를 초기화 할때에는 멤버 접근 연산자 . 을 사용하자.
열거형
const int NUM1 = 1;
const int NUM2 = 2;
const int NUM3 = 3;
✔ 정수형 상수를 위와 같이 여러개 필요하다면 한개한개 선언하고 초기화하기 힘들다.
✔ 그럴 때에 열거형을 사용해 정수형 상수에 이름을 붙여 코드를 이해하기 쉽게 도와줄 수 있다.
✔ 열거형은 선언 방식이 구조체와 같지만 열거형 멤버는 정수형 상수나 문자만 가능하다는 차이가 있다.
enum week { SUN, MON, TUE, WED, THU, FRI, SAT };
✔ 예약어 enum을 사용해서 선언하고 중괄호 안에 멤버를 콤마로 나열한다.
✔ 멤버를 초기화하지 않으면 컴파일러는 멤버를 0부터 차례로 하나씩 큰 정수로 바꾸어 준다. (0,1,2,3...)
enum week {
SUN = 1,
MON,
TUE,
WED,
THU,
FRI,
SAT
};
✔ 첫번째 멤버가 초기화 되어 있으면, 이후 멤버의 값은 +1 되어 초기화된다.
✔ MON은 2, TUE는 3, ... SAT은 7이 된다.
✔ 연속되지 않은 불규칙한 값을 사용하려면 멤버에 각각 정수값으로 초기화하면 된다.
#include <stdio.h>
enum week { SUN, MON, TUE, WED, THU, FRI, SAT };
int main(void){
enum week test; //열거형 변수 선언
test = TUE; //열거형 값 할당
printf("TUE = %d\n", test); //TUE = 2
return 0;
}
✔ 열거형 변수에는 미리 정의한 열거형 멤버의 값을 넣는다.
✔ 열거형 멤버 값 대신 정수를 할당해도 상관없지만 정의하지 않은 열거형 값은 넣을 수 없다.
✔ 그렇다면 열거형은 공용체처럼 모든 멤버가 하나의 저장공간을 공유하기 때문에, 열거형 하나만 사용할 수 있는걸까?
#include <stdio.h>
struct score{
int kor;
int eng;
int math;
};
union profile {
int age;
double height;
};
enum week { SUN, MON, TUE, WED, THU, FRI, SAT };
int main(void){
struct score scoreA = {10};
union profile profileA={10};
enum week weekA = TUE;
printf("구조체 변수의 크기 : %lu\n", sizeof(scoreA)); //12
printf("공용체 변수의 크기 : %lu\n", sizeof(profileA)); //8
printf("열거형 변수의 크기 : %lu\n", sizeof(weekA)); //4
return 0;
}
✔ 구조체 변수의 크기는 구조체 멤버 변수 크기의 합만큼 저장 공간을 할당 받는다.
✔ 공용체 변수는 한 번에 하나의 멤버만 사용할 수 있으므로, 가장 큰 자료형의 크기만큼 저장 공간을 할당받는다.
✔ 열거형 변수 또한 공용체 변수처럼 한번에 하나의 멤버만 사용하고
✔ 정수형 멤버만 가질 수 있으므로 int형 크기만큼 저장 공간을 할당 받았다.
#include <stdio.h>
enum subject { MATH, KOREAN, ENGLISH, SCIENCE, HISTORY };
int main(void){
enum subject favorite = HISTORY;
switch(favorite){
//case 0:
case MATH:
printf("좋아하는 과목 : MATH");
break;
//case 1:
case KOREAN:
printf("좋아하는 과목 : KOREAN");
break;
//case 2:
case ENGLISH:
printf("좋아하는 과목 : ENGLISH");
break;
//case 3:
case SCIENCE:
printf("좋아하는 과목 : SCIENCE");
break;
//case 4:
case HISTORY:
printf("좋아하는 과목 : HISTORY");
break;
default: break;
}
}
✔ 열거형은 swtich문을 사용할 때 유용하다.
✔ 멤버 상수의 이름을 직접적으로 case문의 조건으로 사용해도 되고, 초기화된 정수를 사용할 수도 있다.
typedef를 사용한 형 재정의
✔ 구조체, 공용체, 열거형을 선언하고 사용할 때에는 각각에 맞는 예약어를 함께 사용한다.
✔ 함수의 매개변수나 반환값의 형태에 사용하게되면 조금 복잡해진다.
✔ typedef 예약어는 자료형의 이름에서 struct와 같은 예약어를 생략할 수 있게 도와준다.
#include <stdio.h>
struct student{
int num;
double grade;
};
typedef struct student Student;
int main(void){
Student s1 = {315, 4.2};
printf("%d, %.2lf",s1.num, s1.grade);
return 0;
}
✔ 구조체 student를 만들고 typedef 예약어를 사용해 위와같이 구조체 별칭을 정해줄 수 있다.
✔ 별칭을 만들어두면 구조체 변수를 선언할 때에 struct student 라고 모두 입력하지 않아도 된다.
✔ 더 간편하게 별칭과 구조체변수명만을 사용해 구조체 변수를 선언할 수 있다.
✔ 구조체 선언과 별칭 선언을 따로 할 수 도 있지만, 한번에 아래와같이 선언할 수도 있다.
#include <stdio.h>
typedef struct student{
int num;
double grade;
}Student;
int main(void){
Student s1 = {315, 4.2};
printf("%d, %.2lf",s1.num, s1.grade);
return 0;
}
✔ 구조체 별칭으로 선언한 구조체 변수도 멤버 접근연산자를 사용하여 멤버변수의 값에 접근할 수 있다.
✔ 앞서 말했듯이 별칭을 만드는 typedef 예약어는 구조체뿐만 아니라 공용체, 열거형에도 사용할 수 있다.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[25일차] 숙제 - 코드업 1460 / 1511_포인터배열 (0) | 2021.03.09 |
---|---|
[24일차] 숙제 - 코드업 1402 / 1409_포인터변수 (0) | 2021.03.09 |
[23일차] 1. 구조체 배열/자기 참조 구조체 (0) | 2021.03.06 |
[22일차] 2. 구조체 변수 활용 (0) | 2021.03.05 |
[22일차] 1. 구조체와 멤버 (0) | 2021.03.05 |