ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C 언어 기초 정리 08] 구조체(Struct), union, enum
    개발 이야기/C 2023. 9. 29. 22:35

    class의 확장 전 버전이라고 생각하면 된다. Class와 차이는 Class는 변수 뿐만 아니라 함수까지도 포함 가능하지만, Struct는 변수만 포함 가능하다. 

    구조체를 구성하는 변수는 동일하게 member라고 한다. 

    구조체 정의와 선언

    C언어에서 구조체는 struct 키워드를 사용하여 다음과 같이 정의한다. 

    struct book
    {
     char title[30];
     char author[20];
     int price;
    };
    
    sturct book book1;
    
    book1 = {.tilte="C언어", .author="Adam", .price=2000}

    이우 선언과 초기화는 아래와 같이 이루어진다. 멤버변수 접근은 구조체이름.멤버변수이름으로 접근한다.

    추가적으로 포인터 또한 이용가은한데 이때 구조체는 배열과 다르게 &연산자로 반드시 주소를 할당해줘야한다. 

    주의해야할 점은 구조체 선언 이후 중괄호에 세미클론(;)을 붙여줘야한다는 것이다.

     

    typedef

    typedef를 이용하면 구조체를 아예 새로운 type인거 처럼 사용가능하다. 즉, struct 구조체 이름 변수명으로 정의하지 않아도 되는 것이다. 예시는 아래와 같다. 

    #include <stdio.h>  
    
    typedef struct
    
    {
        char title[30];
        char author[30];
        int price;
    }  TEXTBOOK;  
    
    
    int main(void)
    {
        TEXTBOOK my_book = {"HTML과 CSS", "홍길동", 28000};
        printf("첫 번째 책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n",
            my_book.title, my_book.author, my_book.price);
    
        return 0;
    }

     

    union(모든 멤버변수가 동일, 메모리 효율성)

    union 키워드를 사용하여 선언하하는 공용체(union)은 한 가지를 제외한 모든 면에서 구조체와 같은데, 

    바로 모든 멤버 변수가 하나의 메모리 공간을 공유한다는 점이다. 

    즉, 가장 큰 멤버변수의 크기를 공유한다. 

    모든 멤버 변수가 같은 메모리를 공유하므로, 공용체는 한 번에 하나의 멤버 변수밖에 사용할 수 없다

    즉. 모두 같은 값을 나타낸다.

    공용체는 순서가 규칙적이지 않고, 미리 알 수 없는 다양한 타입의 데이터를 저장할 수 있도록 설계된 타입이기에 공용체는 크기가 가장 큰 멤버 변수의 크기로 메모리를 할당받는다. 

    typedef union
    {
        char a;
        short b;
        int c;
    
    } SHAREDATA;
    
    
    int main(void)
    {
        SHAREDATA var;
        var.c = 0x12345678;  
        printf("%x\n", var.a);//78
        printf("%x\n", var.b);//5678
        printf("%x\n", var.c);//12345678
        //즉, 모든 값은 동일하고 변수 type에 따라 표현되는 부분이 다르다
        return 0;
    }

    공용체를 사용하는 이유는 일단 메모리 공간을 효율적으로 사용 가능하고, 해당하는 값 중 하나만 필요한 경우 타입에 따라 이를 적절히 변형해 사용가능하기 때문이다(or 느낌..?)

    (https://suho413.tistory.com/entry/Union-%EC%82%AC%EC%9A%A9-%EC%9D%B4%EC%9C%A0)

     

    enum(열거체)

    새로운 type을 선언하면서 해당 타입이 가질 수 있는 정수형을 함께 선언한다. 이를 통해 type의 범위를 조절할 수 있다. 

    #include <stdio.h>
    typedef enum Days {MON, TUE, WED, THU, FRI, SAT, SUN} Days;
    int main(void)
    {
       enum Days today = 7;  
        //today = 5도 가능
        //today = 7을 하면 배열의 값이 넘어가짐(-2) -> switch 작동안함
    	
        switch(today){
        	case MON:
            	printf("월요일 좋아~\n");
                break;
            case TUE:
            	printf("화요일 좋아~\n");
                break;
            case WED:
            	printf("수요일 좋아~\n");
                break;
            case THU:
            	printf("목요일 좋아~\n");
                break;
            case FRI:
            	printf("금요일 좋아~\n");
                break;
            case SAT:
            	printf("토요일 좋아~\n");
                break;
            case SUN:
            	printf("일요일 좋아~\n");
                break;
        }
    
    
        puts("각각의 열거체에 해당하는 정수값은 다음과 같습니다.");
        printf("%d %d %d %d %d %d %d\n", MON, TUE, WED, THU, FRI, SAT, SUN);
    
        return 0;
    	
    }

    즉 위의 코드에서 7을 입력하면 해당하는 열거체가 범위에 없기에 switch문이 작동하지 않는다. 

     

Designed by Tistory.