C언어의 구조체
C언어의 구조체
구조체는 여러 개의 변수를 하나로 묶을 수 있는 사용자 정의 자료형이다. 쉽게 말해 JAVA에서의 class의 역할과 비슷하다.(좀 라이트한) 밑에 예시를 보며 이해해보자.
struct Person {
char name[20];
int age;
float height;
};
위의 코드는 하나의 사람을 나타내기 위해 필요한 정보인 이름, 나이, 키 등을 Person이라는 구조체에 묶습니다.
이렇게 구조체는 관련 있는 데이터를 논리적으로 묶어서 관리할 수 있게 도와줍니다.
사용법
구조체는 선언과 변수 생성으로 사용할 수 있습니다. 계속해서 선언하고 변수를 생성해야되는 작업을 줄임으로써 코드를 작성하는데, 효율적으로 작성 가능합니다.
struct Person {
char name[20];
int age;
float height;
};
int main() {
struct Person p1;
strcpy(p1.name, "철수");
p1.age = 20;
p1.height = 175.5;
printf("이름: %s, 나이: %d, 키: %.1f\n", p1.name, p1.age, p1.height);
}
위의 우선적으로 struct를 통해 Person이라는 구조체를 선언해줍니다.
main 함수를 차례대로 살펴보겠습니다. 먼저, p1에 struct Person을 선언합니다.(치환)
배열에 문자열을 직접 대입할 수 없으니, strcpy(p1.name, "철수"); 라는 코드를 통해 배열에 문자열을 복사하여 해결합니다. (보강)#############
오른쪽 문자열(철수)을 왼쪽 배열(p1.name)에 하나하나씩 복사하라는 의미이다. 그래서 char name[20]이 적용되어 철수가 이름에 저장된다.
p1.age = 20; 을 통해 int age가 적용되어 나이값에 20이 들어갑니다.
printf에 의해 모든 값들이 출력되게 됩니다.
구조체와 포인터(typedef???)
구조체 변수에 포인터로 접근하는 건 링크드 리스트 구현에서 핵심입니다. 기존 접근과 살짝 다르게 표시됩니다.
struct Person {
char name[20];
int age;
};
void printPerson(struct Person *p) {
printf("이름: %s\n", p->name); // 화살표 연산자(->) 사용
printf("나이: %d\n", p->age);
}
전에 확인한 변수 접근(.)과 다르게 포인터에서 구조체 멤버를 접근할 때에는 ->을 사용합니다.
p->name은 (*p).name 과 같은 의미입니다.
링크드 리스트와 구조체의 연결
링크드 리스트는 노드라는 구조체들을 연결해서 만든 자료구조이므로 다음과 같이 구축합니다.
struct Node {
int data; // 저장할 값
struct Node *next; // 다음 노드를 가리키는 포인터
};
노드에 저장할 값을 넣고, 다음 노드를 불러옵니다.
자기 자신과 같은 타입의 포인터를 멤버로 포함합니다.(struct Node *)
이 포인터로 다음 노드와 연결됩니다.(링크드 리스트의 다음 노드 “연결” 개념)
Ex) 노드 2개 연결하기
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node *next;
};
int main() {
struct Node *head = malloc(sizeof(struct Node));
struct Node *second = malloc(sizeof(struct Node));
head->data = 10;
head->next = second;
second->data = 20;
second->next = NULL;
printf("1번째 노드: %d\n", head->data);
printf("2번째 노드: %d\n", head->next->data);
free(head);
free(second);
}
malloc: 동적으로 새로운 노드 생성
free: 메모리를 날린다. 메모리 누수 방지.
내일 malloc, free에 대해서 정리할 예정이다.