[C 기초 - 구조체]

Junyeong Fred Kim·2021년 12월 6일
0

C언어

목록 보기
18/21

구조체


C언어를 이용하여 콘솔로 간단한 동아리 주소록 시스템을 만든다고 가정해보자.
이 주소록에는 동아리에 가입한 학생의 이름, 학번, 나이, 전화번호를 저장해야한다.
만약 구조체를 사용하지 않는다면, 정보 저장을 위해 일일히 변수를 하나하나 선언해주어야 한다.

코드

#include <stdio.h>

struct student
{
	char name[15];
	int s_id;
	int age;
	char phone_number[14];
};

int main()
{
	struct student goorm;
	
	printf("이름 : ");
	scanf("%s", goorm.name);
	printf("학번 : ");
	scanf("%d", &goorm.s_id);
	printf("나이 : ");
	scanf("%d", &goorm.age);
	printf("번호 : ");
	scanf("%s", goorm.phone_number);
	
	printf("이름 : %s, 학번 : %d, 나이 : %d, 번호 : %s\n", goorm.name, goorm.s_id, goorm.age, goorm.phone_number);
	
	return 0;
}

출력

이름 : fred
학번 : 21
나이 : 20
번호 : 1
이름 : fred, 학번 : 21, 나이 : 20, 번호 : 1

출력 설명

구조체는 새로운 자료형을 만드는 것과 같다고 할 수 있기에 위와 같이 보통 main함수 전에 선언한다. 어떤 함수 안에 선언하면 그 함수안에서만 사용할 수 있기 때문이다.

구조체의 형태

struct 구조체 이름 { 구조체 멤버들 };

사용할 변수들은 안에 묶어서 적어주는데, 이 변수들을 구조체 멤버라고 한다.
선언한 것만으로는 구조체를 바로 사용할 수 없고, main 함수 안에서 따로 선언을 해주어야한다.

구조체 멤버의 초기화


구조체 멤버의 값을 main에서 선언할 때 대입하여 초기화 할 수 있다.
초기화 할 때에는 멤버 연산자 .와 중괄호를 사용한다. 구조체는 배열처럼 멤버 전체를 초기화 할 수도, 원하는 변수만을 초기화 할 수도 있다.

코드


#include <stdio.h>

struct student
{
	int age;
	char phone_number[14];
	int s_id;
};

int main()
{
	struct student goorm = { .age = 20, .phone_number = "010-1234-5678", 10 };
	struct student codigm = { 22, "010-8765-4321"};

	printf("나이 : %d, 번호 : %s, 학번 : %d\n", goorm.age, goorm.phone_number, goorm.s_id);
	printf("나이 : %d, 번호 : %s, 학번 : %d\n", codigm.age, codigm.phone_number, codigm.s_id);

	return 0;
}

출력

나이 : 20, 번호 : 010-1234-5678, 학번 : 10
나이 : 22, 번호 : 010-8765-4321, 학번 : 0

출력 설명

초기화 할 때에는 {.멤버이름 = 값 }과 같은 형태로 초기화 할 수 있고, 멤버 이름을 적지 않고 초기화 할 수도 있다. 멤버 이름을 적지 않을 때는 구조체를 정의했던 순서대로 값이 들어간다. 값을 따로 넣어주지 않은 멤버는 0으로 초기화 된다.

typedef를 이용한 구조체 선언


선언할 때 더 편리한 방법은 typedef 키워드를 사용하는 것이다. typedef를 사용할 때는 구조체 이름을 생략할 수 있는데, 먼저 구조체 이름을 생략하지 않고 사용하는 방법은 아래와 같다.

typedef

typedef 를 이용하면 main 함수에서 구조체를 선언할 때 매번 struct를 써줄 필요가 없다. typedef를 사용할 때에는 구조체 별칭이 필요한데, 구조체 별칭은 구조체를 정의할 때 중괄호 뒤에 써주면 된다.

#include <stdio.h>

typedef struct _Student {
	int age;
	char phone_number[14];
} Student;

int main(){
	Student goorm;
	
	printf("나이 : ");
	scanf("%d", &goorm.age);
	printf("번호 : ");
	scanf("%s", goorm.phone_number);
	
	printf("----\n나이 : %d\n번호 : %s\n----", goorm.age, goorm.phone_number);
	
	return 0;
}

출력

나이 : 20
번호 : 10

출력 설명

위와 같이 typedef와 별칭을 써주면 main 함수에서 struct [구조체 이름]을 써줄 필요 없이 별칭만 써도 선언이 가능하다. 구조체 별칭은 이름과 동일하게 써주어도 무관하지만, 일반적으로 구조체 이름과 별칭을 둘 다 쓸 때는 구조체 이름 앞에 _를 붙여준다.


익명 구조체

구조체 이름도 생략이 가능하다. typedef를 사용하면, 구조체 이름을 쓰지 않고 별칭만 사용하는 것도 가능하다.

#include <stdio.h>

typedef struct {
	int age;
	char phone_number[14];
} Student;

int main(){
	Student goorm;
	
	printf("나이 : ");
	scanf("%d", &goorm.age);
	printf("번호 : ");
	scanf("%s", goorm.phone_number);
	
	printf("----\n나이 : %d\n번호 : %s\n----", goorm.age, goorm.phone_number);
	
	return 0;
}

출력

나이 : 20
번호 : 10

출력 설명

이렇게 구조체 이름을 따로 지정하지 않고 별칭만 사용하는 것을 익명 구조체라고 한다.


구조체 배열

구조체 배열을 선언하는 방법은 일반적인 배열을 선언하는 방법과 같다.

코드

#include <stdio.h>

typedef struct {
	char name[30];
	int age;
} Student;

int main(){
	Student goorm[3] = { {.name = "해리 포터"}, {.name = "헤르미온느 그레인저"}, {.name = "론 위즐리"} };
	
	goorm[0].age = 10;
	goorm[1].age = 10;
	goorm[2].age = 10;
	
	printf("이름 : %s / 나이 : %d\n", goorm[0].name, goorm[0].age);
	printf("이름 : %s / 나이 : %d\n", goorm[1].name, goorm[1].age);
	printf("이름 : %s / 나이 : %d\n", goorm[2].name, goorm[2].age);
	
	return 0;
}

출력

이름 : 해리 포터 / 나이 : 10
이름 : 헤르미온느 그레인저 / 나이 : 10
이름 : 론 위즐리 / 나이 : 10

출력 설명

위와 같이 구조체 배열을 선언하고 사용할 수 있다. 그 외에 사용법은 일반 구조체와 동일하다.

profile
기억보다 기록

0개의 댓글