C++ const 멤버 함수란? 객체 불변성을 보장하는 핵심 개념
📌 const 객체에서 호출 가능한 함수, const 멤버 함수 완전 정복!
C++를 학습하다 보면 함수 선언 뒤에 붙은 const라는 키워드를 처음 마주하게 됩니다.
처음에는 다소 생소하고 혼란스러울 수 있지만, 이 const 멤버 함수는 객체의 상태를 안전하게 유지하는 데 매우 중요한 역할을 합니다.
특히 const 객체는 const 함수만 호출 가능하기 때문에, 클래스 설계에서 필수적으로 고려되어야 하는 요소입니다.
이번 글에서는 const 멤버 함수의 개념부터 정의 방법, const 객체와의 관계, 실전 예제까지 완벽히 설명드립니다.
객체의 불변성(immutability)을 어떻게 유지하는지 궁금했던 분들이라면, 지금부터 하나씩 차근차근 따라오세요!
📋 목차
🔍 const 멤버 함수란 무엇인가요?
C++에서 const 멤버 함수는 클래스 내부에 정의된 멤버 함수 중, 객체의 상태를 변경하지 않음을 명시하는 함수입니다.
쉽게 말해, 이 함수는 객체의 멤버 변수 값을 수정할 수 없으며, 오직 읽기만 할 수 있도록 제한된 함수입니다.
const 멤버 함수는 다음과 같이 함수 선언 뒤에 const 키워드를 붙여서 작성합니다.
class MyClass {
private:
int value;
public:
int getValue() const {
return value;
}
};
위 예제에서 getValue() 함수는 const 멤버 함수로 선언되어 있어, value를 읽을 수는 있지만 변경은 할 수 없습니다.
이런 구조는 객체의 무결성을 유지하는 데 매우 효과적입니다.
💎 핵심 포인트:
const 멤버 함수는 클래스 설계 시 객체가 안전하게 사용되도록 보장하며, 특히 const 객체에서 필수로 사용됩니다.
🧊 const 객체에서 호출 가능한 함수는?
C++에서는 객체를 생성할 때 const 키워드를 붙이면, 해당 객체는 읽기 전용 상태가 됩니다.
즉, 이 객체는 생성 이후 내부 데이터를 변경할 수 없고, 오직 const 멤버 함수만 호출할 수 있습니다.
const 객체는 보통 아래처럼 선언합니다.
const MyClass obj;
obj.getValue(); // const 멤버 함수만 호출 가능
위 코드에서 getValue() 함수가 const 멤버 함수로 선언되지 않았다면, const MyClass 객체에서 호출할 수 없게 됩니다.
즉, const 객체는 자신이 안전하게 사용될 수 있는 함수만 호출하도록 강제하는 것입니다.
⚠️ 주의: const 객체는 비-const 멤버 함수에 접근할 수 없습니다. 이를 간과하면 컴파일 오류가 발생할 수 있습니다.
- 🔒const 객체는 읽기 전용입니다
- 🧩const 멤버 함수만 호출 가능합니다
- 📛비-const 함수 호출 시 컴파일 오류 발생
🛠️ const 함수 선언 및 사용 방법
const 멤버 함수는 멤버 함수 선언 뒤에 const 키워드를 붙이는 방식으로 정의합니다.
이 키워드는 해당 함수가 클래스의 멤버 변수를 변경하지 않는다는 것을 컴파일러에게 알려주는 강력한 규약입니다.
형식은 아래와 같이 사용됩니다.
class Book {
private:
string title;
public:
string getTitle() const {
return title;
}
void setTitle(string newTitle) {
title = newTitle;
}
};
위 코드에서 getTitle() 함수는 const 멤버 함수로 정의되어 있어, title을 읽기만 가능하며 변경은 불가능합니다.
반면 setTitle()은 일반 함수이므로 title의 값을 변경할 수 있습니다.
📌 const 함수에서 변경 시도 시 오류 예시
int getTitleLength() const {
title = "새 제목"; // 오류 발생: const 함수에서 멤버 수정 불가
return title.length();
}
이처럼 const 함수 내부에서 멤버 변수를 수정하려 하면 컴파일 에러가 발생합니다.
이를 통해 실수로 객체 상태를 바꾸는 것을 방지할 수 있어요.
💎 핵심 포인트:
const 함수는 객체의 불변성을 코드 수준에서 강제함으로써, 설계의 명확성과 안전성을 높여줍니다.
📌 예제로 이해하는 const 함수 동작
const 멤버 함수의 개념을 더 명확히 이해하기 위해, const 객체와 일반 객체에서 호출 가능한 함수의 차이를 예제로 확인해보겠습니다.
아래 예제는 User 클래스에서 const 함수와 일반 함수를 모두 정의한 뒤, const 객체와 일반 객체에서 각각 호출해보는 코드입니다.
#include <iostream>
using namespace std;
class User {
private:
string name;
public:
User(string n) : name(n) {}
string getName() const {
return name;
}
void setName(string n) {
name = n;
}
};
int main() {
const User user1("Alice");
cout << user1.getName() << endl; // ✅ 가능
// user1.setName("Bob"); // ❌ 오류: const 객체는 non-const 함수 호출 불가
User user2("Tom");
cout << user2.getName() << endl; // ✅ 가능
user2.setName("Jerry"); // ✅ 가능
return 0;
}
위 코드에서 user1은 const 객체이므로 getName()은 호출 가능하지만 setName()은 호출 불가능합니다.
반면 일반 객체인 user2는 두 함수 모두 자유롭게 호출할 수 있습니다.
💎 핵심 포인트:
const 객체는 오직 const 멤버 함수만 사용할 수 있으므로, 함수를 const로 선언해두는 습관은 매우 중요합니다.
⚠️ const 멤버 함수 사용 시 주의사항
const 멤버 함수는 객체의 상태를 보호하는 데 효과적이지만, 사용할 때 주의할 점도 분명 존재합니다.
특히 실수로 const 키워드를 빠뜨리면, const 객체에서 함수를 호출하지 못해 컴파일 오류가 발생할 수 있어요.
또한 const 함수 내부에서는 멤버 변수의 값을 직접 변경할 수 없습니다.
하지만 예외적으로 mutable 키워드가 붙은 변수는 const 함수 안에서도 변경이 가능합니다.
class Logger {
private:
mutable int count = 0;
public:
void log() const {
count++; // ✅ mutable 변수는 const 함수 안에서 수정 가능
}
};
이처럼 mutable 키워드를 활용하면, 상태 변경이 필요한 일부 변수에 한해 예외적으로 수정이 허용됩니다.
다만 너무 남용하면 불변성의 의미가 퇴색될 수 있으므로 신중하게 사용해야 합니다.
⚠️ 주의: const 함수 안에서는 멤버 변수 변경이 불가능하며, 이를 우회하려면 mutable을 사용해야 합니다. 하지만 이 방식은 꼭 필요한 경우에만 쓰세요.
- 📌const 멤버 함수는 반드시 함수 선언 뒤에
const키워드를 붙여야 함 - 🚫멤버 변수 변경 시 컴파일 오류 발생
- 🧩
mutable은 꼭 필요한 변수에만 사용
❓ 자주 묻는 질문 (FAQ)
const 멤버 함수는 반드시 선언부와 정의부 둘 다 const여야 하나요?
const 함수 안에서 멤버 함수 호출이 가능한가요?
const 객체는 생성자나 소멸자도 호출 가능한가요?
mutable 키워드는 정확히 어떤 상황에서 쓰나요?
getter 함수는 const로 만드는 것이 좋은가요?
const 멤버 함수도 오버로딩이 가능한가요?
const 함수 안에서 static 멤버 변수는 수정 가능한가요?
const 함수와 const 반환 값은 어떤 차이가 있나요?
🧩 const 멤버 함수 정리 및 활용 가이드
const 멤버 함수는 객체지향 프로그래밍에서 객체의 불변성을 유지하기 위한 매우 중요한 개념입니다.
특히 const 객체에서는 const 함수만 호출할 수 있기 때문에, 클래스를 설계할 때는 어떤 함수가 상태를 변경하지 않는지를 명확히 구분하여 const로 선언하는 습관이 필요합니다.
또한 const 함수는 코드의 신뢰성을 높여주고, 실수로 인해 객체가 변경되는 상황을 사전에 방지할 수 있게 해줍니다.
getter와 같이 단순 조회만 수행하는 함수는 반드시 const로 선언하는 것이 바람직하며, mutable 키워드나 static 멤버 변수에 대한 이해도 함께 필요합니다.
C++의 const 관련 기능은 처음에는 낯설지만, 익숙해질수록 더 안전하고 유지보수 가능한 코드를 작성할 수 있도록 도와줍니다.
오늘 배운 내용을 토대로 여러분의 코드에 적용해보세요!
🏷️ 관련 태그:C++const, const멤버함수, 객체불변성, C++클래스, C++기초문법, const객체, 멤버함수설계, C++공부, 캡슐화, C++예제