C언어 구조체
선수학습(2개)
요약
C언어 구조체의 기본 개념과 구조체 포인터, 화살표 연산자(->)를 알아봅니다. 정보처리기사 실기에 자주 출제되는 구조체 문제를 풀기 위한 핵심 개념을 정리합니다.
구조체 핵심 정리
아래에서 하나씩 배울 내용을 미리 정리한 표입니다. 지금 이해가 안 돼도 괜찮습니다.
| 개념 | 설명 | 예시 |
|---|---|---|
| 구조체 정의 (틀 만들기) | 여러 변수를 하나로 묶는 새로운 자료형 | struct Student { int id; char name[20]; }; |
| 구조체 변수 (실제 데이터 공간) | 구조체 틀로 만든 변수 | struct Student s1; |
| 멤버 접근 (.) | 구조체 변수에서 멤버 접근 | s1.id |
| 멤버 접근 (->) | 구조체 포인터에서 멤버 접근 | p->id |
구조체란? 기초
int, float, char 같은 자료형은 C언어에 미리 만들어져 있습니다. 구조체(struct) 는 이런 자료형들을 조합해서 프로그래머가 직접 새로 만드는 자료형입니다.
예를 들어, 학생 정보를 관리한다면 학번(int), 이름(char[]: 문자 여러 개를 저장하는 문자 배열), 점수(float: 소수점이 있는 실수)를 따로따로 관리하는 것보다 하나로 묶는 것이 편리합니다.
구조체를 만드는 과정은 설계도(틀)를 만드는 것과 실제 데이터 공간을 만드는 것 두 단계로 나뉩니다.

구조체 멤버란?
멤버(Member) 는 구조체 내부에 선언된 각각의 변수를 말합니다. 위 예시에서 id, name, score가 모두 멤버입니다.
| 멤버 이름 | 자료형 | 설명 |
|---|---|---|
id | int | 학번을 저장하는 정수형 멤버 |
name | char[20] | 이름을 저장하는 문자 배열 멤버 |
score | float | 점수를 저장하는 실수형 멤버 |
멤버는 서로 다른 자료형을 가질 수 있습니다. 아래처럼 포인터 타입도 멤버가 될 수 있는데, 포인터를 아직 모르셔도 괜찮습니다. 포인터 페이지에서 배운 뒤 돌아오면 됩니다.
구조체 멤버 접근 기초
점(.) 연산자 - 구조체 변수
구조체 변수에서 멤버에 접근할 때는 점(.) 연산자를 사용합니다. 값을 읽을 수도 있고, 새로운 값을 대입할 수도 있습니다.

화살표(->) 연산자 - 구조체 포인터
함수에 구조체를 넘길 때, 구조체 전체를 복사하면 비효율적이므로 주소(포인터)만 넘기는 경우가 많습니다. 이처럼 구조체 포인터로 멤버에 접근할 때는 화살표(->) 연산자를 사용합니다.
자세한 사용법과 -> 체인 해석 방법은 구조체 포인터를 참고하세요.
구조체 초기화 방법 기초
구조체를 초기화하는 방법은 중괄호 초기화와 멤버 개별 대입 두 가지가 있습니다. 두 방법 모두 최종 결과는 동일합니다.
- 중괄호 초기화: 선언 시점에 모든 값을 알고 있을 때 간편
- 멤버 개별 대입: 나중에 하나씩 값을 채워야 할 때 사용
선언과 동시에 초기화 (중괄호)
구조체 변수를 선언하면서 중괄호로 멤버 값을 한꺼번에 지정합니다.
중괄호 안의 값은 멤버 선언 순서(id, name, score)에 맞춰 나열해야 합니다. 순서가 틀리면 엉뚱한 멤버에 값이 들어가므로 주의하세요. 선언 시점에 모든 값을 알고 있을 때 사용합니다.
멤버 개별 대입 초기화
구조체를 먼저 만든 뒤, 점(.) 또는 화살표(->) 연산자로 멤버에 하나씩 값을 대입합니다. 초기화는 변수를 만든 뒤 처음 값을 넣는 것이고, 대입은 이미 값이 있는 변수에 새 값을 덮어쓰는 것입니다. 여기서는 구조체를 만든 뒤 처음으로 값을 채우는 과정이므로 초기화라고 합니다.
점(.) 연산자로 초기화
구조체 포인터로 초기화 (화살표 연산자)
이미 존재하는 구조체 변수의 주소를 포인터에 저장한 뒤, 화살표 연산자로 멤버를 초기화합니다.
동적 할당으로 구조체 생성 심화
앞의 예시는 이미 존재하는 구조체 변수(s1)의 주소를 포인터에 저장한 것입니다. 아래는 동적 메모리 할당으로 새로운 메모리 공간을 직접 만들어서 구조체를 초기화하는 방법입니다. 연결 리스트(데이터들을 사슬처럼 연결해서 저장하는 자료구조)의 각 데이터 덩어리(노드)를 만들 때 자주 사용됩니다.
malloc이 메모리에 구조체 크기만큼 공간을 확보하면, 그 주소가 포인터 node에 저장됩니다. 이후 -> 연산자로 각 멤버에 값을 대입합니다.