C언어 구조체

코딩C언어
읽는데 10분 소요
처음 쓰여진 날: 2026-02-03
마지막 수정일: 2026-03-20
조회수:

요약

C언어 구조체의 기본 개념과 구조체 포인터, 화살표 연산자(->)를 알아봅니다. 정보처리기사 실기에 자주 출제되는 구조체 문제를 풀기 위한 핵심 개념을 정리합니다.

구조체 핵심 정리

아래에서 하나씩 배울 내용을 미리 정리한 표입니다. 지금 이해가 안 돼도 괜찮습니다.

개념설명예시
구조체 정의 (틀 만들기)여러 변수를 하나로 묶는 새로운 자료형struct Student { int id; char name[20]; };
구조체 변수 (실제 데이터 공간)구조체 틀로 만든 변수struct Student s1;
멤버 접근 (.)구조체 변수에서 멤버 접근s1.id
멤버 접근 (->)구조체 포인터에서 멤버 접근p->id

구조체란? 기초

int, float, char 같은 자료형은 C언어에 미리 만들어져 있습니다. 구조체(struct) 는 이런 자료형들을 조합해서 프로그래머가 직접 새로 만드는 자료형입니다.

예를 들어, 학생 정보를 관리한다면 학번(int), 이름(char[]: 문자 여러 개를 저장하는 문자 배열), 점수(float: 소수점이 있는 실수)를 따로따로 관리하는 것보다 하나로 묶는 것이 편리합니다.

구조체를 만드는 과정은 설계도(틀)를 만드는 것실제 데이터 공간을 만드는 것 두 단계로 나뉩니다.

c
코드 하이라이팅 중...
구조체 개념
구조체는 여러 데이터를 하나로 묶어서 관리합니다. Student 안에 id, name, score가 함께 저장됩니다.

구조체 멤버란?

멤버(Member) 는 구조체 내부에 선언된 각각의 변수를 말합니다. 위 예시에서 id, name, score가 모두 멤버입니다.

c
코드 하이라이팅 중...
멤버 이름자료형설명
idint학번을 저장하는 정수형 멤버
namechar[20]이름을 저장하는 문자 배열 멤버
scorefloat점수를 저장하는 실수형 멤버

멤버는 서로 다른 자료형을 가질 수 있습니다. 아래처럼 포인터 타입도 멤버가 될 수 있는데, 포인터를 아직 모르셔도 괜찮습니다. 포인터 페이지에서 배운 뒤 돌아오면 됩니다.

c
코드 하이라이팅 중...

즉시 변수 선언 심화

앞에서 본 기본 형태는 구조체 정의구조체 변수 선언을 두 줄에 나눠 썼습니다.

c
코드 하이라이팅 중...

C 언어는 두 단계를 한 줄로 합쳐 쓰는 문법도 허용합니다. 구조체 정의의 닫는 중괄호 } 바로 뒤에 변수명을 붙이면 (} 뒤 공백이나 줄바꿈은 허용됩니다), 정의와 동시에 그 타입의 변수까지 만들어집니다.

c
코드 하이라이팅 중...

초기값을 바로 넣을 수도 있습니다.

c
코드 하이라이팅 중...

이 한 줄은 아래 두 줄과 컴파일러 입장에서 동일하게 처리됩니다. s1의 타입과 메모리 크기가 완전히 같습니다.

c
코드 하이라이팅 중...

변수를 여러 개 선언하기

} 뒤에 쉼표로 이어 쓰면 같은 타입의 변수를 여러 개 한 번에 만들 수 있습니다.

c
코드 하이라이팅 중...

선언한 변수들은 각자 독립된 공간을 가지며 .으로 멤버에 접근합니다.

c
코드 하이라이팅 중...

구조체 태그 없이 선언하기

정의와 동시에 변수를 만들 때는 struct 뒤의 이름, 즉 태그1를 생략할 수도 있습니다. 단, 태그를 생략하면 그 구조체 타입 자체에 이름이 없으므로, 이후 어디서도 같은 타입의 변수를 새로 선언할 수 없습니다.

c
코드 하이라이팅 중...

26년1회 기출 패턴

정보처리기사 26년1회 실기 16번에서는 함수 포인터 멤버를 가진 구조체를 이 문법으로 선언합니다.

c
코드 하이라이팅 중...

int* (*fn)(int*) 부분은 지금 이해하지 않아도 됩니다. 이 코드에서 집중할 부분은 } mine; — 구조체를 정의하면서 동시에 변수 mine을 만든다는 패턴입니다. int* (*fn)(int*) 같은 복잡한 멤버 문법은 함수 포인터 페이지에서 다룹니다.

위 코드의 의미: "fns라는 구조체 타입을 만들고, 그와 동시에 그 타입의 변수 mine도 만든다." 이후 mine.fn으로 멤버에 접근합니다.

c
코드 하이라이팅 중...

구조체 멤버 접근 기초

점(.) 연산자 - 구조체 변수

구조체 변수에서 멤버에 접근할 때는 점(.) 연산자를 사용합니다. 값을 읽을 수도 있고, 새로운 값을 대입할 수도 있습니다.

c
코드 하이라이팅 중...
구조체 멤버 접근
구조체 변수 s1의 각 멤버에 점(.) 연산자로 접근합니다. s1.id, s1.name, s1.score로 값을 읽거나 수정할 수 있습니다.

화살표(->) 연산자 - 구조체 포인터

함수에 구조체를 넘길 때, 구조체 전체를 복사하면 비효율적이므로 주소(포인터)만 넘기는 경우가 많습니다. 이처럼 구조체 포인터로 멤버에 접근할 때는 화살표(->) 연산자를 사용합니다.

c
코드 하이라이팅 중...

자세한 사용법과 -> 체인 해석 방법은 구조체 포인터를 참고하세요.


구조체 초기화 방법 기초

구조체를 초기화하는 방법은 중괄호 초기화멤버 개별 대입 두 가지가 있습니다. 두 방법 모두 최종 결과는 동일합니다.

  • 중괄호 초기화: 선언 시점에 모든 값을 알고 있을 때 간편
  • 멤버 개별 대입: 나중에 하나씩 값을 채워야 할 때 사용

선언과 동시에 초기화 (중괄호)

구조체 변수를 선언하면서 중괄호로 멤버 값을 한꺼번에 지정합니다.

c
코드 하이라이팅 중...

중괄호 안의 값은 멤버 선언 순서(id, name, score)에 맞춰 나열해야 합니다. 순서가 틀리면 엉뚱한 멤버에 값이 들어가므로 주의하세요. 선언 시점에 모든 값을 알고 있을 때 사용합니다.

멤버 개별 대입 초기화

구조체를 먼저 만든 뒤, 점(.) 또는 화살표(->) 연산자로 멤버에 하나씩 값을 대입합니다. 초기화는 변수를 만든 뒤 처음 값을 넣는 것이고, 대입은 이미 값이 있는 변수에 새 값을 덮어쓰는 것입니다. 여기서는 구조체를 만든 뒤 처음으로 값을 채우는 과정이므로 초기화라고 합니다.

점(.) 연산자로 초기화

c
코드 하이라이팅 중...

구조체 포인터로 초기화 (화살표 연산자)

이미 존재하는 구조체 변수의 주소를 포인터에 저장한 뒤, 화살표 연산자로 멤버를 초기화합니다.

c
코드 하이라이팅 중...

동적 할당으로 구조체 생성 심화

앞의 예시는 이미 존재하는 구조체 변수(s1)의 주소를 포인터에 저장한 것입니다. 아래는 동적 메모리 할당으로 새로운 메모리 공간을 직접 만들어서 구조체를 초기화하는 방법입니다. 연결 리스트(데이터들을 사슬처럼 연결해서 저장하는 자료구조)의 각 데이터 덩어리(노드)를 만들 때 자주 사용됩니다.

c
코드 하이라이팅 중...

malloc이 메모리에 구조체 크기만큼 공간을 확보하면, 그 주소가 포인터 node에 저장됩니다. 이후 -> 연산자로 각 멤버에 값을 대입합니다.


정보처리기사 실기 대비 문제 기초


Footnotes

  1. struct 키워드 바로 뒤에 오는 구조체 이름을 **태그(tag)**라고 합니다. struct Student에서 Student가 태그입니다. 태그가 있어야 나중에 struct Student s2;처럼 같은 타입의 변수를 추가로 선언할 수 있습니다.


관련 글

(41개)
제목태그시험
C언어 형변환 (Casting)
C언어
-
C언어 연결 리스트 뒤집기 (Reverse Linked List)
C언어
-
C언어 사용자 정의 함수 기초
C언어
-
C언어 구조체 | 정처기 감자