구조체 — 복합 데이터 관리
지금까지 배운 변수, 배열, 문자열을 하나로 묶어 '사용자 정의 자료형'을 만듭니다. 학생, 회원, 상품 등 현실 세계의 데이터를 모델링하는 객체지향 프로그래밍의 기반을 다집니다.
학습 목표
struct)의 개념을 이해한다.. 연산자를 통해 멤버에 접근한다.typedef를 이용해 구조체를 간결한 새로운 자료형으로 정의한다.-> 연산자로 값을 수정한다.구조체(structure)란 무엇인가?
학생 한 명의 정보를 관리하려면 학번(int), 이름(char 배열), 점수(double) 등 서로 다른 자료형이 필요합니다. 구조체를 사용하지 않으면 변수들을 파편적으로 흩어지게 관리해야 합니다.
구조체는 서로 다른 자료형의 데이터를 하나로 묶어 새로운 데이터 덩어리(자료형)를 만드는 기능입니다. 이는 훗날 Java나 C++에서 배우게 될 클래스(Class)와 객체(Object)의 근간이 됩니다.
├── id → int
├── name[50] → char[]
├── age → int
└── score → double
구조체 선언과 . (멤버 접근) 연산자
구조체 내부에 있는 변수들을 멤버(member)라고 부릅니다. 구조체 변수를 만든 뒤에는 점(.) 연산자를 찍어 내부 멤버에 접근합니다.
#include <stdio.h> #include <string.h> // 구조체 틀(설계도) 선언 struct Student { int id; char name[50]; double score; }; int main() { // 설계도를 바탕으로 student라는 변수 생성 struct Student student; // 점(.)을 찍어서 내부 멤버에 접근 student.id = 1001; strcpy(student.name, "홍길동"); student.score = 95.5; printf("학번: %d, 이름: %s\n", student.id, student.name); return 0; }
typedef를 이용한 자료형 재정의
매번 struct Student라고 길게 쓰기 귀찮습니다. typedef(타입 정의)를 사용하면 내가 만든 구조체에 깔끔한 이름을 붙여 새로운 자료형(Type)처럼 사용할 수 있습니다.
// 익명 구조체를 선언함과 동시에 'Student'라는 자료형 이름 부여 typedef struct { int id; char name[50]; double score; } Student; int main() { // struct를 생략하고 곧바로 사용할 수 있습니다! (실무 표준 방식) Student s1 = {1001, "홍길동", 90.5}; return 0; }
구조체 배열 (회원 관리의 기초)
학생 100명을 관리하려면 구조체 자체를 배열로 만듭니다. 이것은 마치 데이터베이스의 테이블과 레코드 구조와 완벽히 같습니다.
Student students[3] = { {1001, "홍길동", 90.5}, {1002, "김철수", 85.0}, {1003, "이영희", 95.5} }; for (int i = 0; i < 3; i++) { printf("이름: %s, 점수: %.1f\n", students[i].name, students[i].score); }
구조체 포인터와 화살표(->) 연산자
STEP 09에서 배웠듯, 함수 안에서 원본 구조체의 데이터를 뜯어고치려면 포인터(주소)를 넘겨줘야 합니다.
이때, 포인터로 넘어온 구조체의 멤버에 접근하려면 점(.) 대신 화살표(->) 연산자를 씁니다.
구조체변수.멤버
구조체포인터->멤버
// 원본 구조체의 주소를 포인터로 받습니다. void changeScore(Student *s) { // 포인터 변수이므로 -> 연산자 사용! s->score = 100.0; } int main() { Student s1 = {1001, "홍길동", 80.0}; // 주소를 넘겨줍니다. changeScore(&s1); return 0; }
구조체 안의 구조체 (중첩)
주소 정보처럼 데이터가 많을 경우 별도의 Address 구조체를 만들고, 이를 Student 구조체의 멤버로 포함시킬 수 있습니다.
typedef struct { char city[50]; char detail[100]; } Address; typedef struct { int id; char name[50]; Address addr; // 구조체 안에 다른 구조체 포함 } Student; // 점(.)을 연속으로 찍어 접근합니다. // student.addr.city
STEP 11 최종 프로젝트
실무형 학생 관리 데이터베이스(DB) 코어 구축
지금까지 배운 [배열 + 함수 + 포인터 + 문자열 + 구조체]를 모조리 융합하여 미니 관리 프로그램을 작성합니다.
├── 1.
typedef struct Student 설계 (학번, 이름, 성적)├── 2.
Student students[100]; DB 배열 구축├── 3.
void printStudent(Student *s) 함수 구현 (화살표 연산자)└── 4.
strcmp()를 활용한 이름 기반 검색 로직
이 프로그램 골격은 향후 "회원 관리", "도서 관리", "재고 관리" 시스템의 뼈대로 그대로 재사용됩니다.
STEP 11 완료 체크리스트
단순한 문법 공부를 넘어, "세상의 복잡한 데이터를 코드로 어떻게 묘사(Modeling)할 것인가?"라는 실무 개발자의 관점을 갖게 되셨습니다. 다음 단계에서는 이렇게 열심히 만든 데이터가 프로그램이 꺼져도 날아가지 않도록 파일 입출력(File I/O)을 배우게 됩니다.