[C언어/C++] 구조체 사용법 & 예제 총정리

    구조체란?

    구조체란 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형입니다. 사용자가 C언어의 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 타입이며 기본 타입만으로는 나타낼 수 없는 복잡한 데이터를 표현할 수 있습니다. 구조체는 똑같은 변수를 여러번 사용해야 하는 경우에 효과적으로 사용할 수 있습니다. 예를 들어, C언어를 이용해서 콘솔로 간단한 성적 시스템을 만든다고 가정해봅시다. 이 주소록에는 학생의 국어, 수학, 영어 점수를 저장해야 합니다. 만약 구조체를 사용하지 않는다면 여러명의 학생의 성적을 구해야 할 경우 일일이 변수를 계속해서 선언해주어야 할 것입니다. 하지만 구조체를 사용하면 여러개의 변수를 하나로 묶어서 관리할 수 있게 됩니다. 그룹화할 때 같은 자료형을 가진 변수들을 묶어 그룹화할 수 있고, 서로 다른 자료형을 가진 변수들을 묶어 그룹화할 수도 있습니다. C언어에서 구조체를 응용해서 할 수 있는 분야가 굉장히 많습니다. 함수에 인자값으로 구조체를 만들어 전달할수도 있고 구조체 안에 구조체를 만들어 서로 참조하게 만들어 사용하게 할수도 있습니다.

     

     구조체 사용법 

    구조체 선언

    //문법
    struct 구조체이름{
        자료형 변수명;
        자료형 변수명;
        ...
    }구조체 별칭;
    
    //ex
    struct Score{
        char name[10]; //이름 
        int kor; //국어 성적
        int mat; //수학 성적
        int eng; //영어 성적
    }S;
    

    구조체를 선언할때의 struct라는 명령어를 사용해서 선언합니다. 구조체 이름을 선언하여 사용하여도 되고 별칭을 지정해서 사용하여도 됩니다. 구조체의 내부에서는 구조체의 멤버를 선언합니다. 멤버 선언은 일반 변수 선언과 기본적으로 비슷하지만 초기화되지는 않습니다. 구조체 별칭은 말 그대로 구조체의 별칭을 정의하는 것입니다. 정의한 구조체 별칭에 변수명을 선언함으로써 실제 메모리가 할당됩니다.

     

    구조체 초기화

    #include <stdio.h>
    struct Score {
        char name[20]; //이름
        int kor; //국어성적
        int mat; //수학성적
        int eng; //영어성적
    }S;
    
    int main()
    {
        //초기화 방법 (1) -> 선언시 바로 초기화
        struct Score s1 = { "홍길동",50,70,80 };
        
        //초기화 방법 (2) -> 선언후 .을 활용하여 초기화
        struct Score s2;
        strcpy(s2.name, "홍길동");
        s2.kor = 60;
        s2.mat = 70;
        s2.eng = 80;
    
        return 0;
    }
    

    구조체는 보통 전역으로 정의합니다. 특정 함수 안에 구조체를 정의하면 해당 함수 안에서만 구조체를 사용할 수 있기 때문입니다. 정의한 구조체를 사용하려면 구조체 변수를 선언해야 합니다. 이때는 구조체 이름 앞에 반드시 struct 키워드를 붙여줍니다. 초기화 방법에는 2가지 방법이 있는데 초기화하면서 {} 대괄호 안에 변수들을 차례로 입력해주는 방법과 먼저 선언해놓은 뒤 .을 활용하여 값을 넣어주는 방법이 있습니다.

     

    구조체 배열

    #include <stdio.h>
    struct Score {
        char name[20]; //이름
        int kor; //국어성적
        int mat; //수학성적
        int eng; //영어성적
    }S;
    
    int main()
    {
        struct Score s[10] = { 0 };
    
        for (int i = 0; i < 10; i++) {
            scanf_s("%s",s[i].name,20);
            scanf_s("%d",&s[i].kor);
            scanf_s("%d",&s[i].mat);
            scanf_s("%d",&s[i].eng);
        }
        
        return 0;
    }
    

    위의 예제와 같이 구조체를 배열로 만들어놓고 사용할수도 있습니다.

     

    typedef로 struct 키워드 없이 구조체 선언하기

    #include <stdio.h>
    typedef struct Score { //typedef사용
        char name[20]; //이름
        int kor; //국어성적
        int mat; //수학성적
        int eng; //영어성적
    }S;
    
    int main()
    {
        S s1 = { "홍길동",50,70,80 };
    
        return 0;
    }
    

    typedef는 자료형의 별칭을 만드는 기능입니다. 따라서 구조체의 별칭도 만들 수 있습니다. 본래는 구조체를 구조체를 정의하고 이것을 변수로 선언하려면 반드시 앞에 'struct'라는 키워드를 붙여서 구조체라는 것을 알려주어야 합니다. 하지만 이런 것이 횟수가 많다면 매번 struct를 앞에 써주어야 하므로 번거로울 수 있습니다. 이것이 번거롭다면 구조체를 정의할 때 앞에 'typedef'라는 키워드를 사용하여 사용자 지정 타입으로 만들어준다면 'struct'키워드를 일일이 써주지 않아도 구조체를 사용하실 수 있습니다.

    댓글

    Designed by JB FACTORY