C++ 초급 - 7. 구조체와 클래스 (1 - 구조체 (struct))
2025. 2. 22. 13:57ㆍ프로그래밍 언어/C++
📌 7. 구조체와 클래스
C++에서 구조체(struct)와 클래스(class)는 사용자 정의 데이터 타입을 만들기 위한 기능이다.
구조체는 단순한 데이터 묶음 역할을 하며, 클래스는 객체 지향 프로그래밍(OOP)을 지원한다.
이 장에서는 구조체와 클래스의 차이, 생성자와 소멸자, 접근 지정자, this 포인터, const 멤버 함수 등을 학습한다.
📌 7.1 구조체 (struct)
구조체(struct)는 여러 개의 데이터를 하나로 묶을 수 있는 사용자 정의 자료형이다.
C++에서는 구조체 내부에 멤버 변수뿐만 아니라 멤버 함수도 포함할 수 있으며, 클래스(class)와 유사하지만 기본 접근 지정자가 public이라는 차이가 있다.
구조체는 보통 단순한 데이터 저장 용도로 사용되며, 객체 지향 프로그래밍(OOP)을 위해서는 클래스(class)를 사용하는 것이 일반적이다.
📌 1. 구조체 선언 및 초기화
🔹 (1) 구조체 선언 방식
💡 기본 문법
struct 구조체이름 {
데이터타입 변수명;
};
💡 예제: 구조체 선언 및 초기화
#include <iostream>
// 구조체 선언
struct Person {
std::string name;
int age;
float height;
};
int main() {
// 구조체 변수 선언 및 초기화
Person p1 = {"Alice", 25, 167.5f};
Person p2 = {"Bob", 30, 175.0f};
std::cout << "이름: " << p1.name << ", 나이: " << p1.age << ", 키: " << p1.height << "cm" << std::endl;
std::cout << "이름: " << p2.name << ", 나이: " << p2.age << ", 키: " << p2.height << "cm" << std::endl;
return 0;
}
🔹 출력 결과
이름: Alice, 나이: 25, 키: 167.5cm
이름: Bob, 나이: 30, 키: 175cm
💡 설명
- struct Person { ... }; → 구조체 정의.
- Person p1 = {"Alice", 25, 167.5f}; → 구조체 변수 선언 및 초기화.
- p1.name, p1.age, p1.height → 구조체 멤버 접근.
📌 2. 구조체 멤버 변수와 함수
C++ 구조체에는 변수뿐만 아니라 멤버 함수도 포함 가능하다.
클래스와 유사하게, 함수도 구조체 내부에서 정의하여 데이터 조작 가능.
💡 예제: 구조체 내부 함수 포함
#include <iostream>
struct Car {
std::string brand;
int year;
// 멤버 함수 정의
void printInfo() {
std::cout << "브랜드: " << brand << ", 연식: " << year << std::endl;
}
};
int main() {
Car car1 = {"Toyota", 2022};
Car car2 = {"BMW", 2021};
car1.printInfo(); // 구조체 멤버 함수 호출
car2.printInfo();
return 0;
}
🔹 출력 결과
브랜드: Toyota, 연식: 2022
브랜드: BMW, 연식: 2021
💡 설명
- void printInfo(); → 구조체 내부에 멤버 함수 정의 가능.
- car1.printInfo(); → 구조체 변수를 통해 멤버 함수 호출 가능.
📌 3. 구조체를 함수의 매개변수로 전달하는 방법
C++에서 구조체를 함수의 매개변수로 전달하는 방식은 두 가지가 있다.
- 값 전달 (Call by Value) → 구조체의 복사본을 전달 (원본 변경 불가)
- 참조 전달 (Call by Reference) → 원본 데이터를 직접 수정 가능
🔹 (1) 값 전달 (Call by Value)
- 구조체가 복사되어 전달되므로 함수 내에서 변경해도 원본에는 영향 없음.
💡 예제: 값 전달 방식
#include <iostream>
struct Student {
std::string name;
int score;
};
// 값 전달 방식 (복사본 사용)
void printStudent(Student s) {
s.score = 100; // 원본에는 영향 없음
std::cout << "학생: " << s.name << ", 점수: " << s.score << std::endl;
}
int main() {
Student stu = {"David", 85};
printStudent(stu); // 값 전달 (복사본 생성)
std::cout << "함수 호출 후 원본 점수: " << stu.score << std::endl; // 원본 값 유지
return 0;
}
🔹 출력 결과
학생: David, 점수: 100
함수 호출 후 원본 점수: 85
💡 설명
- void printStudent(Student s); → 구조체가 값으로 전달되므로 원본은 유지됨.
- s.score = 100; → 복사된 구조체의 값만 변경됨.
- stu.score 값은 그대로 유지(85).
🔹 (2) 참조 전달 (Call by Reference)
- 구조체의 원본 데이터를 직접 변경 가능.
- 메모리 사용량이 줄어들어 성능이 향상됨.
💡 예제: 참조 전달 방식
#include <iostream>
struct Student {
std::string name;
int score;
};
// 참조 전달 방식 (원본 변경 가능)
void updateScore(Student& s) {
s.score += 10; // 원본 값 변경
}
int main() {
Student stu = {"Emma", 80};
updateScore(stu); // 참조로 전달 (원본 변경)
std::cout << "업데이트 후 점수: " << stu.score << std::endl; // 90
return 0;
}
🔹 출력 결과
업데이트 후 점수: 90
💡 설명
- void updateScore(Student& s); → 참조(&)를 사용하면 원본이 변경됨.
- s.score += 10; → 원본 값이 변경되어 80 → 90이 됨.
- 복사본이 생성되지 않으므로 메모리 사용량이 적고 성능이 향상됨.
📌 4. 정리
개념 | 설명 |
구조체 선언 | struct 구조체이름 { 멤버변수; }; |
구조체 초기화 | 구조체이름 변수명 = { 값1, 값2 }; |
구조체 멤버 접근 | 변수명.멤버변수; |
구조체 내 함수 포함 | void 함수명() { ... } |
구조체를 값으로 전달 | void 함수(구조체 변수) { ... } (복사본 사용) |
구조체를 참조로 전달 | void 함수(구조체& 변수) { ... } (원본 변경 가능) |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 7. 구조체와 클래스 (3 - 생성자와 소멸자 (Constructor & Destructor)) (0) | 2025.02.22 |
---|---|
C++ 초급 - 7. 구조체와 클래스 (2 - 클래스 (class vs struct)) (0) | 2025.02.22 |
C++ 초급 - 6. 배열과 문자열 (5 - std::string (C++ 표준 문자열)) (0) | 2025.02.22 |
C++ 초급 - 6. 배열과 문자열 (4 - C-스타일 문자열 (char str[])) (0) | 2025.02.22 |
C++ 초급 - 6. 배열과 문자열 (3 - std::vector) (0) | 2025.02.22 |