C++ 초급 - 7. 구조체와 클래스 (6 - const 멤버 함수)

2025. 2. 22. 14:53프로그래밍 언어/C++

📌 7.6 const 멤버 함수

C++에서 const 멤버 함수객체의 데이터를 변경하지 않도록 보장하는 함수이다.
이를 활용하면 코드의 안정성을 높이고, 불필요한 데이터 변경을 방지하여 예측 가능한 설계를 할 수 있다.
또한, const 객체에서는 const 멤버 함수만 호출 가능하며, mutable 키워드를 사용하면 특정 멤버 변수만 예외적으로 변경 가능하다.


📌 1. const 멤버 함수 선언 및 활용

🔹 (1) const 멤버 함수란?

  • 멤버 변수 값을 변경하지 않는 멤버 함수.
  • 함수 선언 뒤에 const 키워드를 붙이면, 해당 함수는 객체의 멤버 변수를 변경할 수 없음.
  • 객체의 상태를 읽기 전용으로 유지하는 함수에 사용.

💡 기본 문법

class 클래스명 {
public:
    반환타입 함수명() const;  // const 멤버 함수 선언
};

💡 예제: const 멤버 함수 적용

#include <iostream>

class Car {
private:
    std::string brand;
    int year;

public:
    Car(std::string b, int y) : brand(b), year(y) {}

    // const 멤버 함수: 멤버 변수 변경 불가
    void printInfo() const {
        std::cout << "브랜드: " << brand << ", 연식: " << year << std::endl;
        // year = 2023;  // ❌ 오류 발생 (const 함수에서는 멤버 변수 변경 불가)
    }
};

int main() {
    Car car("Toyota", 2022);
    car.printInfo();  // ✅ const 멤버 함수 호출 가능

    return 0;
}

🔹 출력 결과

브랜드: Toyota, 연식: 2022

💡 설명

  • void printInfo() const; → 객체의 데이터를 변경하지 않는 함수.
  • printInfo() 내부에서 year = 2023; → 오류 발생 (const 함수에서는 멤버 변수 변경 불가).

📌 2. 객체 내부 데이터를 변경하지 않는 함수 작성

🔹 (1) const 멤버 함수의 역할

  • 객체 데이터를 읽기 전용으로 제공하는 함수는 반드시 const로 선언해야 한다.
  • 예측 가능한 설계를 위해 const 멤버 함수를 적극 활용.

💡 예제: const 멤버 함수 적용

#include <iostream>

class Person {
private:
    std::string name;
    int age;

public:
    Person(std::string n, int a) : name(n), age(a) {}

    // 읽기 전용 함수 (const 사용)
    std::string getName() const { return name; }
    int getAge() const { return age; }

    // 일반 함수 (멤버 변수 변경 가능)
    void setAge(int newAge) { age = newAge; }
};

int main() {
    Person p("Alice", 25);

    std::cout << "이름: " << p.getName() << std::endl;  // ✅ 가능
    std::cout << "나이: " << p.getAge() << std::endl;   // ✅ 가능

    p.setAge(26);  // ✅ 변경 가능
    std::cout << "변경된 나이: " << p.getAge() << std::endl;

    return 0;
}

🔹 출력 결과

이름: Alice
나이: 25
변경된 나이: 26

💡 설명

  • getName()과 getAge() → ✅ 읽기 전용 함수 (const 적용).
  • setAge(int newAge) → ✅ 객체 데이터를 변경하는 함수 (const 미적용).

📌 3. const 객체에서 const 멤버 함수만 호출 가능

🔹 (1) const 객체란?

  • const 객체는 객체 내부 데이터를 변경할 수 없음.
  • const 객체는 const 멤버 함수만 호출 가능.

💡 예제: const 객체와 const 멤버 함수

#include <iostream>

class Car {
private:
    std::string brand;
    int year;

public:
    Car(std::string b, int y) : brand(b), year(y) {}

    void setYear(int y) { year = y; }  // ✅ 일반 멤버 함수 (변경 가능)
    int getYear() const { return year; }  // ✅ const 멤버 함수 (읽기 전용)
};

int main() {
    const Car car("Honda", 2021);  // ❗ const 객체 선언

    std::cout << "연식: " << car.getYear() << std::endl;  // ✅ const 멤버 함수 호출 가능
    // car.setYear(2022);  // ❌ 오류 발생 (const 객체는 비-const 함수 호출 불가)

    return 0;
}

🔹 출력 결과

연식: 2021

💡 설명

  • const Car car("Honda", 2021); → const 객체 선언.
  • car.getYear(); → ✅ const 멤버 함수는 호출 가능.
  • car.setYear(2022); → ❌ const 객체에서는 비-const 멤버 함수 호출 불가.

📌 4. 클래스 내 mutable 키워드 활용

🔹 (1) mutable이란?

  • mutable 키워드를 사용하면 const 멤버 함수에서도 특정 멤버 변수의 변경이 가능.
  • 주로 캐싱(Cache) 및 임시 변수(로그 기록 등)에 활용됨.

💡 예제: mutable을 사용하여 const 멤버 함수에서 값 변경

#include <iostream>

class Logger {
private:
    mutable int logCount;  // mutable 변수 (const 함수에서도 변경 가능)

public:
    Logger() : logCount(0) {}

    void logMessage() const {
        logCount++;  // ✅ const 함수에서도 변경 가능 (mutable 사용)
        std::cout << "로그 기록: " << logCount << "번" << std::endl;
    }
};

int main() {
    const Logger logger;  // ❗ const 객체 선언

    logger.logMessage();  // ✅ mutable 덕분에 호출 가능
    logger.logMessage();

    return 0;
}

🔹 출력 결과

로그 기록: 1번
로그 기록: 2번

💡 설명

  • mutable int logCount; → mutable 키워드를 사용하여 const 함수에서도 변경 가능.
  • logger.logMessage(); → const 객체이지만 mutable 멤버 변수는 변경 가능.

📌 5. 정리

개념  설명
const 멤버 함수 객체 데이터를 변경하지 않는 멤버 함수
const 멤버 함수 선언 반환타입 함수명() const;
객체 내부 데이터 변경 금지 const 멤버 함수 내부에서 멤버 변수 변경 불가
const 객체 const 객체에서는 const 멤버 함수만 호출 가능
mutable 키워드 const 함수 내에서도 특정 멤버 변수 변경 가능