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++에서 구조체를 함수의 매개변수로 전달하는 방식은 두 가지가 있다.

  1. 값 전달 (Call by Value)구조체의 복사본을 전달 (원본 변경 불가)
  2. 참조 전달 (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 함수(구조체& 변수) { ... } (원본 변경 가능)