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 함수 내에서도 특정 멤버 변수 변경 가능 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 8. 객체지향 프로그래밍 (2 - virtual 함수와 오버라이딩 (Overriding)) (0) | 2025.02.22 |
---|---|
C++ 초급 - 8. 객체지향 프로그래밍 (1 - 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (5 - this 포인터) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (4 - 접근 지정자 (private, public, protected)) (0) | 2025.02.22 |
C++ 초급 - 7. 구조체와 클래스 (3 - 생성자와 소멸자 (Constructor & Destructor)) (0) | 2025.02.22 |