[04] 구조체 (struct)

구조체 사용하기

참고 문헌 (ch48) : https://dojang.io/mod/page/view.php?id=407

구조체를 만들고 사용하기

구조체 정의 : struct 이용

1
2
3
struct 구조체이름{
자료형 멤버이름;
};

구조체 선언 : struct (구조체이름) (변수이름);

예시

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
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일

struct Person { // 구조체 정의
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
};

int main()
{
struct Person p1; // 구조체 변수 선언

// 점으로 구조체 멤버에 접근하여 값 할당
strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "서울시 용산구 한남동");

// 점으로 구조체 멤버에 접근하여 값 출력
printf("이름: %s\n", p1.name); // 이름: 홍길동
printf("나이: %d\n", p1.age); // 나이: 30
printf("주소: %s\n", p1.address); // 주소: 서울시 용산구 한남동

return 0;
}

구조체의 정의와 선언을 동시에 하는 방법

1
2
3
struct 구조체이름 {
자료형 멤버이름;
} 변수;

예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일

struct Person { // 구조체 정의
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
} p1; // 구조체를 정의하는 동시에 변수 p1 선언

int main()
{
// 점으로 구조체 멤버에 접근하여 값 할당
strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "서울시 용산구 한남동");

// 점으로 구조체 멤버에 접근하여 값 출력
printf("이름: %s\n", p1.name); // 이름: 홍길동
printf("나이: %d\n", p1.age); // 나이: 30
printf("주소: %s\n", p1.address); // 주소: 서울시 용산구 한남동

return 0;
}

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

struct 키워드를 생략하고 선언하는 방법: typedef로 정의하면서 별칭(alias)을 정해주기

1
2
3
typedef struct 구조체이름 {
자료형 멤버이름;
} 구조체별칭;

typedef로 정의한 변수 선언하는 방법: (구조체 별칭) (변수 이름);

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
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일

typedef struct _Person { // 구조체 이름은 _Person
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
} Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의

int main()
{
Person p1; // 구조체 별칭 Person으로 변수 선언

// 점으로 구조체 멤버에 접근하여 값 할당
strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "서울시 용산구 한남동");

// 점으로 구조체 멤버에 접근하여 값 출력
printf("이름: %s\n", p1.name); // 이름: 홍길동
printf("나이: %d\n", p1.age); // 나이: 30
printf("주소: %s\n", p1.address); // 주소: 서울시 용산구 한남동

return 0;
}

또한 모든 자료형의 별칭을 설정할 수도 있음

1
2
3
4
5
6
7
8
typedef int MYINT;      // int를 별칭 MYINT로 정의
typedef int* PMYINT; // int 포인터를 별칭 PMYINT로 정의

MYINT num1; // MYINT로 변수 선언
PMYINT numPtr1; // PMYINT로 포인터 변수 선언

numPtr1 = &num1; // 포인터에 변수의 주소 저장
// 사용 방법은 일반 변수, 포인터와 같음

익명 구조체 사용하기

익명 구조체 정의하기: 구조체를 정의할 때 구조체의 이름 없이 별칭만을 이용해서 정의하는 구조체, 이 경우 별칭을 무조건 정해줘야한다.

1
2
3
typedef struct {
자료형 멤버이름;
} 구조체별칭;

익명 구조체 선언하기: (구조체 별칭) (변수 이름);

예시

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
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더 파일

typedef struct { // 구조체 이름이 없는 익명 구조체
char name[20]; // 구조체 멤버 1
int age; // 구조체 멤버 2
char address[100]; // 구조체 멤버 3
} Person; // typedef를 사용하여 구조체 별칭을 Person으로 정의

int main()
{
Person p1; // 구조체 별칭 Person으로 변수 선언

// 점으로 구조체 멤버에 접근하여 값 할당
strcpy(p1.name, "홍길동");
p1.age = 30;
strcpy(p1.address, "서울시 용산구 한남동");

// 점으로 구조체 멤버에 접근하여 값 출력
printf("이름: %s\n", p1.name); // 이름: 홍길동
printf("나이: %d\n", p1.age); // 나이: 30
printf("주소: %s\n", p1.address); // 주소: 서울시 용산구 한남동

return 0;
}