프린세스 다이어리

[C] 구조체가 무엇인가요? 구조체의 개념, 활용하는 방법 본문

C, C++

[C] 구조체가 무엇인가요? 구조체의 개념, 활용하는 방법

개발공주 2021. 10. 1. 12:00
728x90

1. 구조체란

 

여러 개의 변수를 묶어서 하나의 객체를 표현하고자 할 때 구조체를 사용할 수 있다. 배열과 달리, 서로 다른 특성을 같이 묶어서 객체의 성격을 표현하는 것이다. 캐릭터, 몬스터, 좌표 등 다양한 객체를 모두 정의할 수 있다. 

 

구조체는 다음과 같이 선언할 수 있다.

struct 구조체명 {
	자료형1 변수명1;
    	자료형2 변수명2;
}

 

2. 구조체의 정의 방법

 

한 명의 학생에 대한 정보를 담고 있는 구조체를 만들어 본다면 다음과 같다.

#include <stdio.h> 

struct Student
{
    char studentId[10];
    char name[10];
    int grade;
    char major[100]; 
};

 

위와 같이 프로그램에서 요구하는 특성에 맞게 객체의 특성을 정의할 수 있다.

 

int main(void) {
    struct Student s;
    strcpy(s.studentId, "201302559");
    strcpy(s.name, "이은진");
    s.grade = 4;
    strcpy(s.major, "지리교육전공"); 
}

main함수 안에서 구조체를 만들어주는 방법이다. 구조체 자체가 하나의 자료형이 되고 변수에 접근할 때는 온점을 사용한다. 

 

#include <stdio.h> 
#include<string.h>

struct Student
{
    char studentId[10];
    char name[10];
    int grade;
    char major[100]; 
};

int main(void) {
    struct Student s;
    strcpy(s.studentId, "201302559");
    strcpy(s.name, "이은진");
    s.grade = 4;
    strcpy(s.major, "지리교육전공");

    printf("학번: %s\n", s.studentId);
    printf("이름: %s\n", s.name);
    printf("학번: %d\n", s.grade);
    printf("전공: %s\n", s.major);
}
학번: 201302559
이름: 이은진
학번: 4
전공: 지리교육전공

이렇게 완성해보았다.

 

2-1. 정의와 동시에 선언을 하는 방법

struct Student
{
    char studentId[10];
    char name[10];
    int grade;
    char major[100]; 
} s;

하나의 구조체 변수만 사용하는 경우, 정의와 선언을 동시에 하여 전역 변수로 사용할 수 있다. 많이 사용되는 형태는 아니다.

 

2-2. 구조체의 변수를 한 줄에 초기화하기

int main(void) {
    struct Student s = {"201302559", "이은진", 4, "지리교육전공"}; 

    printf("학번: %s\n", s.studentId);
    printf("이름: %s\n", s.name);
    printf("학번: %d\n", s.grade);
    printf("전공: %s\n", s.major);
}

선언과 동시에 초기화하기 위해, 변수를 차례대로 넣으면 된다. 

 

3. typedef 키워드로 구조체 자료형 만들기

 

typedef 키워드를 이용하여 임의의 자료형을 만들 수 있다. 

#include <stdio.h> 
#include <string.h>

typedef struct Student
{
    char studentId[10];
    char name[10];
    int grade;
    char major[100]; 
} StudentT;

int main(void) {
    StudentT s = {"201302559", "이은진", 4, "지리교육전공"}; 

    printf("학번: %s\n", s.studentId);
    printf("이름: %s\n", s.name);
    printf("학번: %d\n", s.grade);
    printf("전공: %s\n", s.major);
}

드디어 타입스크립트같은.. 아는 내용이 나왔다. struct 앞에 typedef 키워드를 붙여서, 앞으로 Student라는 구조체의 자료형을 StudentT라고 부르겠다 라고 정의해주는 것이다. 

 

#include <stdio.h> 
#include <string.h>

typedef struct
{
    char studentId[10];
    char name[10];
    int grade;
    char major[100]; 
} StudentT;

int main(void) {
    StudentT s = {"201302559", "이은진", 4, "지리교육전공"}; 

    printf("학번: %s\n", s.studentId);
    printf("이름: %s\n", s.name);
    printf("학번: %d\n", s.grade);
    printf("전공: %s\n", s.major);
}

최근에는 익명 구조체의 개념이 생겨, 구조체의 이름인 Student를 생략해도 컴파일러가 자동으로 알아듣는다.

 

4. 구조체 포인터 변수에 접근하는 방법

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>

typedef struct
{
    char studentId[10];
    char name[10];
    int grade;
    char major[100]; 
} StudentT;

int main(void) {
    StudentT *s = malloc(sizeof(StudentT));

    strcpy(s->studentId, "201302559");
    strcpy(s->name, "이은진");
    s->grade = 4;
    strcpy(s->major, "지리교육전공"); 

    printf("학번: %s\n", s->studentId);
    printf("이름: %s\n", s->name);
    printf("학번: %d\n", s->grade);
    printf("전공: %s\n", s->major);
}

구조체가 포인터 변수로 사용되는 경우, 즉 동적 할당을 이용해서 포인터 변수에 접근해야 하는 경우, 내부 변수에 접근할 때 온점이 아닌 화살표(->)를 사용한다. *s 같은 경우에는 메모리 포인터이기 때문에, 메모리 주소에 접근을 해서 학번을 바꾸겠다 하는 직관적인 표기를 한다고 생각하면 된다. 

728x90
Comments