Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Trivia

9강.구조체(3) 본문

C언어/C프로그래밍 기초(2학기)

9강.구조체(3)

Vloom 2018. 12. 9. 15:24

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


[응용예제 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을 사용하는 방법의 차이점은 무엇인가?


[답] 차이점 없음 (어떤 것을 사용해도 상관없음)


'C언어 > C프로그래밍 기초(2학기)' 카테고리의 다른 글

8강.구조체(2)  (0) 2018.12.03
7강.구조체(1)  (0) 2018.11.21
2강.포인터(2)  (0) 2018.09.23
1강.포인터(1)  (0) 2018.09.12