C언어 구조체 사용법과 예제

C 언어에서의 구조체 사용법

구조체는 C 언어에서 서로 다른 데이터 유형을 하나의 단위로 묶어주는 매우 유용한 기능입니다. 이를 통해 다양한 정보를 효율적으로 관리할 수 있으며, 프로그래머는 더 복잡한 데이터를 관리하는 데 큰 도움을 받을 수 있습니다. 본 게시글에서는 C 언어에서 구조체를 정의하고 사용하는 방법에 대해 살펴보겠습니다.

구조체의 정의 및 선언

구조체는 struct 키워드를 사용하여 정의합니다. 구조체의 기본 구조는 다음과 같습니다:

struct 구조체이름 {
  자료형 멤버이름1;
  자료형 멤버이름2;
  // 추가 멤버...
};

위와 같은 형식으로 구조체를 정의한 후, 이를 사용하기 위해서는 구조체 변수를 선언해야 합니다. 예를 들어, 학생 정보를 저장하는 구조체를 정의해보겠습니다.

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

구조체 변수의 선언과 초기화

구조체 변수를 선언하는 방법은 일반 변수와 유사합니다. 다음과 같이 구조체 변수를 선언하고 초기화할 수 있습니다:

struct Student student1 = {"홍길동", 20, 4.5};

이렇게 하면 student1이라는 구조체 변수가 만들어지며, 각각의 멤버는 정의된 값으로 초기화됩니다. 만약 초기화를 하지 않는다면, 남은 멤버는 기본값으로 설정됩니다.

구조체 멤버 접근하기

구조체의 멤버에 접근할 때는 점(.) 연산자를 사용합니다. 다음 예제를 통해 확인해보겠습니다:

printf("이름: %s\n", student1.name);
printf("나이: %d\n", student1.age);
printf("평점: %.2f\n", student1.grade);

구조체 배열의 활용

구조체로 여러 개의 데이터를 관리해야 할 경우, 구조체 배열을 사용할 수 있습니다. 구조체 배열은 동일한 구조체 타입의 변수를 여러 개 저장하는 배열입니다.

struct Student students[30];

이와 같이 선언하면 30명의 학생 정보를 저장할 수 있는 배열이 생성됩니다. 각 학생 정보를 입력받아 출력하는 간단한 프로그램을 작성해 보겠습니다:

for (int i = 0; i < 30; i++) {
  printf("학생 이름: ");
  scanf("%s", students[i].name);
  printf("학생 나이: ");
  scanf("%d", &students[i].age);
  printf("학생 평점: ");
  scanf("%f", &students[i].grade);
}

구조체 포인터

구조체 변수를 포인터로 사용할 수도 있습니다. 구조체 포인터는 구조체가 차지하는 메모리를 동적으로 할당할 수 있도록 돕습니다. 포인터를 선언할 때는 다음과 같이 합니다:

struct Student *studentPtr = malloc(sizeof(struct Student));

이렇게 하면 studentPtr이라는 포인터가 생성되며, 구조체의 메모리를 동적으로 할당받습니다. 이 포인터를 사용하여 멤버에 접근할 때는 화살표(->) 연산자를 사용합니다:

strcpy(studentPtr->name, "이몽룡");
studentPtr->age = 21;
studentPtr->grade = 3.8;

구조체 포인터의 메모리 해제

동적으로 할당한 메모리는 프로그램 종료 시 반드시 해제해야 합니다. 이를 위해 free 함수를 사용합니다:

free(studentPtr);

중첩 구조체

C 언어에서는 하나의 구조체 내에 다른 구조체를 멤버로 포함시킬 수 있습니다. 이를 통해 복잡한 데이터 구조를 보다 쉽게 관리할 수 있습니다. 예를 들어, 주소 정보를 포함하는 구조체를 만들어보겠습니다.

struct Address {
  char city[20];
  char street[30];
};
struct Person {
  char name[30];
  struct Address addr; // 중첩 구조체
};

이렇게 하면 Person 구조체 안에 Address 구조체를 포함할 수 있습니다. 중첩된 구조체의 멤버에 접근할 때는 점(.) 연산자를 두 번 사용합니다:

struct Person person1;
strcpy(person1.name, "김철수");
strcpy(person1.addr.city, "서울");
strcpy(person1.addr.street, "강남구 테헤란로");

결론

구조체는 C 언어의 중요한 데이터 타입으로, 여러 데이터 유형을 효과적으로 관리하는 데 큰 도움을 줍니다. 본 게시글을 통해 구조체의 정의, 사용법, 배열, 포인터 및 중첩 구조체에 대해 알아보았습니다. 이러한 지식을 바탕으로 더 복잡한 데이터 구조를 효율적으로 관리할 수 있을 것입니다. 구조체를 적절히 활용해 보다 나은 프로그램을 작성해보시기 바랍니다.

자주 찾는 질문 Q&A

구조체란 무엇인가요?

구조체는 C 언어에서 다양한 데이터 타입을 하나의 단위로 묶어 관리할 수 있게 해주는 유용한 기능입니다.

구조체를 어떻게 정의하나요?

구조체는 struct 키워드를 사용하여 정의하며, 멤버 변수와 자료형을 명시하여 구성합니다.

구조체 멤버에 접근하는 방법은?

구조체의 각 멤버에 접근하기 위해서는 점(.) 연산자를 사용하여 해당 변수를 이용하면 됩니다.

구조체 포인터의 사용 방법은?

구조체 포인터는 메모리를 동적으로 할당하여 사용하며, 화살표(->) 연산자를 통해 멤버에 접근할 수 있습니다.

Leave a Comment