티스토리 뷰

반응형
반응형

C++ 오버로딩 vs 오버라이딩 – 헷갈리지 말고 딱 정리하자

C++을 공부하다 보면 **오버로딩(overloading)**과 **오버라이딩(overriding)**이라는 낯선 단어를 만나게 됩니다.
이름은 비슷한데, 실제로는 하는 일이 완전히 다릅니다.
이 글에서는 두 개념을 쉽게 비교하면서, 언제 어떻게 쓰는지를 딱 정리해보겠습니다.


오버로딩 (Overloading) – 같은 이름, 다른 입력

오버로딩은 같은 이름의 함수를 여러 개 만들되, 매개변수를 다르게 만드는 것을 말합니다.

class Printer {
public:
    void print(int x) {
        cout << "정수: " << x << endl;
    }

    void print(string s) {
        cout << "문자열: " << s << endl;
    }
};

이렇게 하면 print() 함수는 입력값의 타입에 따라 다른 버전이 호출됩니다.

Printer p;
p.print(10);        // 정수: 10
p.print("Hello");   // 문자열: Hello

🔹 정리: 오버로딩은 함수 이름은 같지만, 매개변수가 다르면 OK입니다.
🔹 쓰는 이유: 다양한 입력값에 맞게 하나의 동작 이름을 통일하고 싶을 때.


오버라이딩 (Overriding) – 부모의 함수를 자식이 바꿔쓰기

오버라이딩은 상속받은 자식 클래스가, 부모 클래스의 함수를 자기 방식으로 다시 정의하는 걸 말합니다.
이건 **다형성(polymorphism)**과 깊이 연결돼 있습니다.

먼저 부모 클래스:

class Animal {
public:
    virtual void speak() {
        cout << "동물이 말합니다." << endl;
    }
};

그리고 자식 클래스:

class Dog : public Animal {
public:
    void speak() {
        cout << "멍멍!" << endl;
    }
};

이제 포인터를 통해 함수를 호출해봅니다.

Animal* a = new Dog();
a->speak();  // 결과는?

결과:

멍멍!

🔹 정리: 오버라이딩은 자식이 부모의 가상 함수를 같은 이름, 같은 매개변수덮어써서 실행되게 만듭니다.
🔹 쓰는 이유: 상속받은 함수를 자기 방식으로 바꾸고 싶을 때.
🔹 조건: 부모 함수는 반드시 virtual이어야 합니다.


표 하나로 비교하자

구분 오버로딩 (Overloading) 오버라이딩 (Overriding)

사용 위치 같은 클래스 안 부모-자식 클래스 사이
이름 같음 같음
매개변수 다름 같음
virtual 필요 ❌ 필요 없음 ✅ 부모는 virtual이어야 함
동작 시점 컴파일 시 결정 실행 시 결정
관련 개념 편의성 다형성

헷갈릴 땐 이렇게 외우세요

  • 🟦 오버로딩매개변수를 바꿔서 같은 이름을 여러 번 쓰는 것
    → “과적재”: 기능을 더 얹는다
  • 🟩 오버라이딩상속받은 함수를 바꿔치기 하는 것
    → “재정의”: 기존 걸 덮어쓴다

실제 예시로 다시 복습

오버로딩

void greet() {
    cout << "Hello!" << endl;
}

void greet(string name) {
    cout << "Hello, " << name << "!" << endl;
}

greet();           // Hello!
greet("Alice");    // Hello, Alice!

오버라이딩

class Parent {
public:
    virtual void sayHi() {
        cout << "부모 인사" << endl;
    }
};

class Child : public Parent {
public:
    void sayHi() {
        cout << "자식 인사" << endl;
    }
};

Parent* p = new Child();
p->sayHi();  // 자식 인사

마무리 요약

개념 핵심 요약

오버로딩 같은 함수 이름, 다른 매개변수로 여러 버전 만듦
오버라이딩 상속받은 함수를 자식이 다시 정의함 (virtual 필요)

이제 이 둘의 차이가 명확해졌나요?
혼란이 왔을 때는 꼭,

  • 오버로딩은 “같은 이름, 다른 인자”
  • 오버라이딩은 “상속 + virtual + 덮어쓰기”
    이렇게 딱딱 구분해서 기억하시면 됩니다.

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함
반응형