티스토리 뷰

반응형
클래스에서 const 오버로딩 — 왜 필요한가?

📌 클래스에서 const 오버로딩 — 왜 필요한가?

1️⃣ 개념부터 잡기: const 오버로딩이란?


C++에서는 멤버 함수에 const를 붙여 오버로딩할 수 있습니다.
이것은 동일한 함수 이름이지만, 객체가 const인지 아닌지에 따라 서로 다른 함수 버전이 호출되도록 합니다.
class Sample {
public:
    int getValue() const;  // const 객체에서 호출됨
    int getValue();        // 일반 객체에서 호출됨
};
🔍 즉, const는 함수 시그니처의 일부이며, 오버로딩이 가능합니다.


2️⃣ 왜 필요한가? — const 객체의 함수 호출 제한


C++에서 const 객체는 const 멤버 함수만 호출할 수 있습니다.
const Sample s;
s.getValue(); // -> const 버전만 호출 가능
만약 const 함수가 정의되지 않았다면, 컴파일 에러가 발생합니다.


3️⃣ 실전 코드 예제: const 오버로딩 없을 때와 있을 때


✅ const 오버로딩 없는 경우 (컴파일 에러 발생)

#include <iostream>
using namespace std;

class Item {
    int value;
public:
    Item(int v) : value(v) {}
    
    int getValue() { // const 아님
        return value;
    }
};

int main() {
    const Item item(10);
    cout << item.getValue() << endl; // ❌ 에러 발생
    return 0;
}
🔴 컴파일 오류 메시지 (예시):
error: passing 'const Item' as 'this' argument discards qualifiers



✅ const 오버로딩 적용한 경우

#include <iostream>
using namespace std;

class Item {
    int value;
public:
    Item(int v) : value(v) {}

    int getValue() const { // const 객체용
        cout << "[const 버전 호출] ";
        return value;
    }

    int getValue() {       // 일반 객체용
        cout << "[일반 버전 호출] ";
        return value;
    }
};

int main() {
    const Item constItem(10);
    Item nonConstItem(20);

    cout << constItem.getValue() << endl;    // ✅ const 버전 호출
    cout << nonConstItem.getValue() << endl; // ✅ 일반 버전 호출

    return 0;
}
✅ 출력 결과:
[const 버전 호출] 10
[일반 버전 호출] 20



반응형

 


4️⃣ const 오버로딩 정리표


구분 함수 원형 호출 가능 객체 수정 가능성
일반 멤버 함수 int getValue() 비-const 객체 O
const 멤버 함수 int getValue() const const / 비-const 객체

✔️ const 멤버 함수는 멤버를 수정하지 않겠다는 약속입니다.
✔️ const 객체에서는 const 멤버 함수만 호출 가능합니다.


5️⃣ const 오버로딩이 필요한 실제 상황들


  • vector, string 등 표준 라이브러리에서 많이 사용합니다.
  • getter 함수는 const 객체에서도 호출할 수 있어야 하므로 const로 선언합니다.
  • 멤버 값을 변경하지 않는다면, 무조건 const 함수로 선언하는 것이 좋습니다.
int getSize() const; // 데이터를 건드리지 않는 getter는 이렇게 선언!



✅ 최종 요약


핵심 포인트 설명
const 오버로딩 const 유무에 따라 멤버 함수를 구분
필요성 const 객체가 const 함수만 호출 가능
const 함수의 의미 멤버를 수정하지 않겠다는 약속
const 함수만 있으면? const 객체, 비-const 객체 모두 호출 가능
const 함수 없으면? const 객체는 멤버 함수 호출 불가 (컴파일 에러)



💬 한마디 요약


“const 객체는 const 함수만 부른다. 수정 안 할 거면 const 함수로 선언하자!”
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함