티스토리 뷰

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언어 코딩 도장 / 위키백과

댓글
«   2024/12   »
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
최근에 올라온 글
글 보관함
Total
Today
Yesterday