지금까지 C언어에서 어렵다면 가장 어려운 배열, 포인터, 문자열 다루는 방법에 대해서 알아보았습니다. 지금까지는 하나의 변수에 데이터를 저장하고 메모리를 할당하고 사용하는 방법을 알아보았습니다.
이번 포스팅에서는 여러개의 변수를 묶어서 하나의 변수처럼 사용할 수 있는 구조체에 대해서 알아보도록 하겠습니다.
구조체(structures) 정의 방법
구조체는 공통된 조건을 가지는 변수들을 하나로 묶어서 사용하는 C언어의 문법입니다. 예를들어서 '학생'이라는 변수가 있다면 이 변수에는 이름, 나이, 성별 등의 값이 함께 포함될 수 있습니다. 앞서 이름, 나이, 성별은 각각을 변수로 선언할 수 있었고 지금부터 이들을 모두 묶은 '학생'은 struct 키워드를 이용해서 구조체로 정의할 것입니다.
구조체 문법
struct structureName
{
dataType name1;
dataType name2;
...
};
구조체 문법은 간단합니다. struct라는 키워드에 사용하고자 하는 구조체 변수명을 정하고 내부에는 변수로 사용할 다양한 데이터들을 넣어주시면 됩니다. 예를들면 다음과 같습니다.
struct Student
{
char name[20];
int age;
float height;
};
이와같이 Student라는 구조체는 char자료형 name과 int자료형 age, float자료형 height를 포함해서 선언할 수 있습니다.
구조체(structures) 사용 방법
앞서 정의해 놓은 구조체를 실제 main함수 혹은 다른 함수들에서 직접 사용해야합니다. 그리고 이 구조체는 지금부터 데이터자료형을 선언할때 type을 선언하듯 사용하시면 됩니다. 소스코드로 예를 들어서 보겠습니다.
struct Student
{
char name[20];
int age;
float height;
}
int main()
{
struct Student stu1, stu2, stu3;
return 0;
}
구조체를 정의하는 곳은 main함수 밖입니다. 그리고 이렇게 정의한 구조체를 main함수 내부에서 사용하는 방법을 보았습니다. 함수 내에서 사용하기 위해서는 변수가 필요하고 구조체 변수를 만드는 과정입니다.
구조체의 타입을 정의했을때, 저장공간이나 메모리를 할당하지 않습니다. 마치 char, int, float 등과 같은 type으로 만드는 과정입니다. 이렇게 만들어진 구조체 타입은 실제 메인함수에서 변수로 선언될 때 내부에 할당된 크기만큼 메모리를 할당합니다.
구조체(structures) 멤버 변수 접근
구조체 내부에 변수들은 멤버(member) 변수라 부릅니다. 이 멤버변수에 접근하는 방법에는 두 가지가 있습니다.
첫 번째는 점(.) 연산자입니다. 예를 들어서 변수로 선언한 stu1의 멤버번수 age에 접근하기 위해서는 stu1.age로 접근합니다.
두 번째는 화살표(->) 연산자입니다. 이는 포인터 변수일 때 접근하는 방법입니다. (&stu1)->age 와 같이 포인터일 경우에는 이 연산자를 사용합니다.
접근 방법을 이용해서 간단한 소스코드를 함께 보겠습니다.
소스코드1. struct.c
#include <stdio.h>
struct Student {
char name[20];
int age;
float height;
};
void displayStudent(struct Student*);
int main() {
struct Student stu1;
printf("이름을 입력하세요 : ");
scanf("%s", stu1.name);
printf("나이를 입력하세요 : ");
scanf("%d", &stu1.age);
printf("키를 입력하세요 : ");
scanf("%f", &stu1.height);
displayStudent(&stu1);
return 0;
}
void displayStudent(struct Student* st) {
printf("\n이름: %s\n", st->name);
printf("나이: %d\n", st->age);
printf("키: %.2f\n", st->height);
}
결과1
이름을 입력하세요 : Ironman
나이를 입력하세요 : 36
키를 입력하세요 : 176.3
이름: Ironman
나이: 36
키: 176.30
연산자를 모두 사용해 보기 위해서 사용자 정의 함수를 하나 추가했습니다. 먼저 앞서 정의한 그대로 struct Student 타입을 정의하고 main함수 내에서 stu1을 선언하였습니다.
이렇게 선언된 변수 stu1의 각 멤버변수는 점(.) 연산자를 이용하고 scanf() 함수를 이용해서 값을 하나씩 입력받았습니다. 이때, name은 배열이기 때문에 scanf() 함수 사용시 &는 생략합니다. 표준 입출력 관련 내용은 아래 포스팅을 참고해주세요.
2020.08.06 - [쿤즈 Dev/C] - [C언어] 표준입력 표준출력 사용하기 (첫 프로그래밍 시작!)
출력할 때에는 displayStudent() 라는 함수를 만들고 parameter로는 struct Student* 포인터를 받도록 사용자 정의 함수를 만들어 주었습니다. 사용자 정의 함수에 대한 내용도 아래 포스팅을 참고해 주세요.
2020.09.28 - [쿤즈 Dev/C] - [C언어] 함수(Function) (2) 사용자 정의 함수의 사용법
사용자 정의 함수 displayStudent()에서는 포인터로 parameter를 받았기 때문에 화살표(->) 연산자를 이용해서 멤버 변수에 접근하였습니다.
오늘 포스팅에서는 C언어 프로그래밍에서 매우 많은 부분을 차지하는 구조체에 대해서 알아보았습니다. 구조체는 어플리케이션을 만들때 필요한 집단을 한데 모아놓은 새로운 타입을 정의해서 사용하는 것입니다. 그리고 구조체를 선언할 때, malloc()과 같은 메모리 할당 함수들을 이용해서 필요시 동적으로 사용하는 방법도 있습니다. 도움이 되셨으면 합니다. 이상입니다.
'쿤즈 Dev > C' 카테고리의 다른 글
[C언어] 파일 (File) 다루는 함수 사용 방법 (0) | 2021.03.24 |
---|---|
[C언어] 구조체(structs)와 포인터(pointers) (2) | 2021.03.18 |
[C언어] 문자열과 배열 사이의 관계 (0) | 2020.12.21 |
[C언어] 포인터를 이용한 메모리 동적 할당(Memory Allocation) (2) | 2020.12.17 |
[C언어] 포인터를 이용한 함수 사용 방법 (0) | 2020.12.16 |
댓글