본문 바로가기

프로그래밍/C 기초

[C언어 강좌] #49 구조체

오늘의 강의 내용은 제목에도 쓰여있듯이 구조체입니다.





구조체는 여러가지 변수를 묶어서 하나의 타입을 정의하는 것입니다.

int , float , double , char 등등 여러가지 자료형처럼 새로운 자료형을 하나 만드는 것입니다.


다만 형태가 지금까지 배웠던 기본 자료형들과는 다릅니다.

배열이 여러개의 변수를 한번에 선언할 수 있듯이 자료형도 여러개의 변수를 한번에 만들 수 있습니다.

int형 배열, float형 배열같은것 처럼 배열은 하나의 타입만을 여러개 만들었지만, 구조체는 여러개의 타입을 한번에 만들 수 있습니다.

또한 그 타입마다 이름을 붙일 수 있고, 새로운 자료형으로써 사용 가능합니다.


예제를 보면 금방 이해가 될 것입니다.



구조체 선언


구조체를 선언하는 방법은 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
struct monster {
    char name[20];
    int level;
    int hp;
    int mp;
};
 
int main() {
    
}
cs

이 코드는 monster라는 구조체를 선언한 것입니다.
이 구조체는 char형의 name이라는 배열과 int형의 level,hp,mp 변수를 포함하고 있습니다.

그리고 이 monster는 새로운 자료형처럼 사용 가능합니다.

- 구조체 변수의 선언

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
struct monster {
    char name[20];
    int level;
    int hp;
    int mp;
};
 
int main() {
    struct monster slime;
}
cs

slime이라는 이름의 새로운 변수를 만들었습니다.

11행을 보시면 자료형이 들어갈 공간에 struct monster가 대신 들어갔습니다.
새로운 자료형처럼 사용해서 변수를 선언할 수 있습니다.

구조체 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
struct monster {
    char name[20];
    int level;
    int hp;
    int mp;
};
 
int main() {
    struct monster slime = {"Slime",1,30,30};
    
    slime.mp = 50;
    
    printf("몬스터 이름 : %s \n",slime.name);
    printf("레벨 : %d \n",slime.level);
    printf("체력 : %d \n",slime.hp);
    printf("마력 : %d \n",slime.mp);
}
cs


그리고 구조체 변수의 초기화, 대입, 참조 방법입니다.
배열처럼 {}를 이용해서 초기화가 가능하고, 구조체 멤버에 접근하기 위해서는 구조체 변수 이름 옆에 점을 붙이고 변수에 접근하면 됩니다.
slime.mp의 경우 slime 구조체 변수의 mp멤버에 접근한것입니다.





내용을 정리하면 다음과 같습니다.





구조체와 typedef



그리고 구조체는 typedef와 자주 사용됩니다.
typedef는 자료형에 별명을 지어주는겁니다.
1
typedef int test;
cs

이렇게 해주면 int형에게 test라는 별명이 생겼습니다. int 대신 test라고 적어서 선언해도 똑같이 사용할 수 있습니다.
1
2
typedef int test;
test num = 50;
cs


구조체를 선언할 때는 매번 struct를 붙여줘야 하는데 typedef를 이용해서 간단하게 선언할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
 
typedef struct monster {
    char name[20];
    int level;
    int hp;
    int mp;
} Monster ;
 
int main() {
    Monster slime = {"Slime",1,30,30};
    
    slime.mp = 50;
    
    printf("몬스터 이름 : %s \n",slime.name);
    printf("레벨 : %d \n",slime.level);
    printf("체력 : %d \n",slime.hp);
    printf("마력 : %d \n",slime.mp);
}
cs


예제처럼 구조체 선언부분 struct앞에 typedef를 붙여주고 끝부분에 새로운 이름을 붙여주면 됩니다.
그러면 구조체 변수를 선언할때 struct를 붙이지 않고 typedef로 만든 별명을 이용해서 간단하게 사용 가능합니다.



그리고 구조체는 객체 지향을 배울때 나오는 클래스와 비슷합니다.
구조체에서 추가된것이 클래스라고 보면 됩니다.