C++ 구조체(struct) 완벽 가이드: 선언, 인스턴스, 포인터, 함수 인자 전달
C++에서 구조체(Struct)란?
STRUCT는 서로 다른 데이터 타입의 요소들을 함께 저장하는 데 사용할 수 있는 C++ 데이터 구조입니다. C++에서 구조체는 사용자 정의 데이터 타입입니다. 구조체는 서로 다른 데이터 타입의 항목들을 단일 데이터 타입으로 그룹화하는 데이터 타입을 생성합니다.
예를 들어:
어떤 사람의 이름, 국적, 나이에 대한 정보를 저장해야 한다고 가정해 보세요. name, citizenship, age 같은 변수들을 만들어 데이터를 개별적으로 저장할 수 있습니다.
하지만 미래에 여러 사람에 대한 정보를 저장해야 할 수도 있습니다. 그러면 다른 개인들을 위한 변수들이 생성될 것입니다. 예: name1, citizenship1, age1 등. 이를 피하려면 구조체를 만드는 것이 좋습니다.
이 C++ 튜토리얼에서 배울 내용:
- C++에서 구조체(Struct)란?
- 언제 구조체를 사용하는가?
- C++ 구조체 초기화
- 구조체 인스턴스 생성
- 구조체 멤버 접근
- 구조체 포인터
- 함수 인자로 구조체 전달
- C++ 구조체의 한계
언제 구조체를 사용하는가?
C++에서 구조체 사용 이유:
- 서로 다른 데이터 타입의 요소들을 단일 데이터 타입 아래 저장해야 할 때
- C++ 구조체는 참조 타입이 아닌 값 타입입니다. 생성 후 데이터를 수정할 의도가 없다면 구조체 사용
C++ 구조체 초기화
C++ 구조체를 만들려면 struct 키워드 뒤에 식별자를 사용합니다. 식별자가 구조체 이름이 됩니다. C++ 구조체 생성 문법은 다음과 같습니다:
문법:
struct struct_name {
// struct members
}
위 문법에서 struct 키워드를 사용했습니다. struct_name은 구조체 이름입니다.
구조체 멤버는 중괄호 안에 추가됩니다. 이 멤버들은 아마도 서로 다른 데이터 타입에 속할 것입니다.
예를 들어:
struct Person {
char name[30];
int citizenship;
int age;
}
위 예제에서 Person은 세 멤버를 가진 구조체입니다. 멤버는 name, citizenship, age입니다. 한 멤버는 char 타입이고 나머지 둘은 정수입니다. 구조체가 생성될 때는 메모리가 할당되지 않습니다. 구조체에 변수가 추가된 후에만 메모리가 할당됩니다.
구조체 인스턴스 생성
위 예제에서 Person이라는 구조체를 만들었습니다. 구조체 변수는 다음과 같이 생성할 수 있습니다:
Person p;
p는 Person 타입의 구조체 변수입니다. 이 변수를 사용하여 구조체 멤버에 접근할 수 있습니다.
구조체 멤버 접근
구조체 멤버에 접근하려면 구조체 인스턴스와 점(.) 연산자를 사용합니다. 예를 들어 구조체 Person의 age 멤버에 접근하려면:
p.age = 27;
구조체 인스턴스 p를 사용하여 구조체 Person의 멤버 age에 접근했습니다. 그런 다음 멤버 age의 값을 27로 설정했습니다.
예제 1:
#include <iostream>
using namespace std;
struct Person {
int citizenship;
int age;
};
int main(void) {
struct Person p;
p.citizenship = 1;
p.age = 27;
cout << "Person citizenship: " << p.citizenship << endl;
cout << "Person age: " << p.age << endl;
return 0;
}
출력:

코드 스크린샷:

코드 설명:
- 프로그램에 iostream 헤더 포함하여 정의된 함수 사용
- std 네임스페이스 포함하여 클래스 직접 사용
- Person이라는 구조체 생성
- 구조체 본문 시작
- citizenship이라는 정수 타입 구조체 멤버 생성
- age라는 정수 타입 구조체 멤버 생성
- 구조체 본문 끝
- main() 함수 호출. 프로그램 로직은 이 함수 본문 내에 추가
- 구조체 Person의 인스턴스 생성하고 이름 p 부여
- 구조체 멤버 citizenship 값을 1로 설정
- 구조체 멤버 age 값을 27로 설정
- 구조체 멤버 citizenship 값을 다른 텍스트와 함께 콘솔 출력
- 구조체 멤버 age 값을 다른 텍스트와 함께 콘솔 출력
- 프로그램 성공 실행 시 값 반환
- main() 함수 끝
구조체 포인터
구조체를 가리키는 포인터를 생성할 수 있습니다. int, float, double 같은 네이티브 데이터 타입을 가리키는 포인터 생성과 유사합니다. C++에서 포인터는 메모리 위치를 저장한다는 점에 유의하세요.
예제 2:
#include <iostream>
using namespace std;
struct Length {
int meters;
float centimeters;
};
int main() {
Length *ptr, l;
ptr = &l;
cout << "Enter meters: ";
cin >> (*ptr).meters;
cout << "Enter centimeters: ";
cin >> (*ptr).centimeters;
cout << "Length = " << (*ptr).meters << " meters " << (*ptr).centimeters << " centimeters";
return 0;
}
출력:

코드 스크린샷:

코드 설명:
- 프로그램에 iostream 헤더 포함하여 함수 사용
- 프로그램에 std 네임스페이스 포함하여 클래스 직접 사용
- Length라는 구조체 생성
- 구조체 Length 본문 시작
- meters라는 정수 타입 구조체 멤버 생성
- centimeters라는 정수 타입 구조체 멤버 생성
- 구조체 Length 본문 끝
- main() 함수 호출
- main() 함수 본문 시작
- Length 타입의 포인터 변수 *ptr과 일반 변수 l 생성
- 변수 l의 주소를 포인터 변수에 저장
- 콘솔에 메시지 표시하여 meters 변수 값 입력 요청
- 키보드로 사용자 입력 읽기. 멤버 meters는 포인터 변수로 접근
- 콘솔에 메시지 표시하여 centimeters 변수 값 입력 요청
- 키보드로 사용자 입력 읽기. 멤버 centimeters는 포인터 변수로 접근
- 사용자로부터 읽은 값들을 다른 텍스트와 함께 콘솔 출력
- 프로그램 성공 실행 시 값 반환
- main() 함수 본문 끝
함수 인자로 구조체 전달
구조체를 함수 인자로 전달할 수 있습니다. 이는 일반 인자 전달과 같은 방식으로 수행됩니다. 구조체 변수도 함수에 전달 가능합니다. 좋은 예는 구조체 멤버 값들을 표시해야 할 때입니다. 이를 시연해 보겠습니다:
예제 3:
#include<iostream>
using namespace std;
struct Person {
int citizenship;
int age;
};
void func(struct Person p);
int main() {
struct Person p;
p.citizenship = 1;
p.age = 27;
func(p);
return 0;
}
void func(struct Person p) {
cout << " Person citizenship: " << p.citizenship<<endl;
cout << " Person age: " << p.age;
}
출력:

코드 스크린샷:

코드 설명:
- iostream 헤더 파일을 우리 파일에 포함. 그러면 오류 없이 함수 사용 가능
- 프로그램에 std 네임스페이스 포함하여 클래스 사용. 네임스페이스 호출 없이 클래스 사용 가능
- Person이라는 구조체 생성
- 구조체 Person 본문 시작
- 구조체 Person의 멤버 생성. 멤버 이름은 citizenship이고 타입은 정수
- 구조체 Person의 멤버 생성. 멤버 이름은 age이고 타입은 정수
- 구조체 Person 본문 끝
- 구조체 Person의 인스턴스 p를 인자로 받는 함수 생성
- main 함수 호출. { 는 main() 함수 본문 시작 표시
- 구조체 Person의 인스턴스 생성하고 이름 p 부여
- 구조체 인스턴스 p를 사용하여 구조체 멤버 변수 citizenship 접근하고 값 1 할당
- 구조체 인스턴스 p를 사용하여 구조체 멤버 변수 age 접근하고 값 27 할당
- 함수 호출하며 구조체 Person의 인스턴스 p를 인자로 전달
- 함수는 성공 실행 시 값 반환
- main() 함수 본문 끝
- 함수 본문 생성
- 함수 본문 시작
- 구조체 멤버 citizenship 값 접근하여 다른 텍스트와 함께 콘솔 출력
- 구조체 멤버 age 값 접근하여 다른 텍스트와 함께 콘솔 출력
- 함수 본문 끝
C++ 구조체의 한계
다음은 구조체들의 한계입니다:
- 구조체 데이터 타입을 내장 데이터 타입처럼 다룰 수 없음
+, - 같은 연산자를 구조체 변수에 사용할 수 없음
- 구조체는 데이터 은닉을 지원하지 않음. 구조체 멤버는 범위와 상관없이 모든 함수에서 접근 가능
- 구조체 본문 내에 정적 멤버 선언 불가
- 구조체 내에 생성자 생성 불가
요약:
- 구조체는 서로 다른 타입의 데이터 요소들을 저장하는 데이터 구조입니다.
- 배열이 비슷한 타입의 데이터 요소들을 저장하는 반면, 구조체는 서로 다른 타입의 데이터 요소들을 저장합니다.
- 데이터 요소들이 값을 변경하지 않을 것으로 예상될 때 구조체 사용
- 구조체 멤버는 점(.) 연산자로 접근
- 구조체 인스턴스를 생성해야 함
- C++ 구조체 생성을 위해 struct 키워드 사용
- 구조체를 가리키는 포인터는 일반 타입을 가리키는 포인터 생성 방식과 유사하게 생성
- 구조체는 일반 함수가 전달되는 것과 같은 방식으로 함수 인자로 전달 가능