하아찡

오버라이딩, 오버로딩 본문

C++/기본문법

오버라이딩, 오버로딩

하아찡 2024. 12. 15. 18:35

매번 그냥 이름이 헷갈린다.

오버로딩.. 오버라이딩...

왜 앞에 두개가 똑같아서

 

일단 오버라이딩부터 보자.

오버라이딩은 Base클래스에서 Derived클래스 측에서 "함수명, 매개변수, 리턴타입"이 동일해야합니다.

다른말로하면 부모클래스에서 자식클래스에서  "함수명, 매개변수, 리턴타입"이 동일해야합니다.

또 다른말로하면 기본클래스에서 파생클래스 측으로  "함수명, 매개변수, 리턴타입"이 동일해야합니다.

 

그래서 어디서 쓰냐?

상속받은 메소드를 재정의해서 사용을 하게됩니다.

기존에 상속받아서 쓰던 메소드가 있었는데 해당 메소드를 상속받은 클래스에서 다르게 사용하게될때 새롭게 재정의 한다고 생각하면 됩니니다.

 

예시를 보자면

#include <iostream>
#include <string>

class Base {
private:
    std::string str;

public:
    Base() : str("Base") { std::cout << "Base Class" << std::endl; }

    void ShowClass() { std::cout << str << std::endl; }
};


class Derived : public Base {
private:
    std::string str;

public:
    Derived() : Base(), str("Derived") {
        std::cout << "Derived Class" << std::endl;
        
        //상속받아서 Base 클래스 내부 ShowClass 메소드 사용가능
        ShowClass();
    }
    

    //오버라이딩
    //void ShowClass() { std::cout << str << std::endl; }
};
int main() {
    std::cout << " === Base Class 생성 ===" << std::endl;
    Base p;

    std::cout << " === Derived Class 생성 ===" << std::endl;
    Derived c;

    return 0;
}

위코드를 실행시켜보면 아래와 같은 결과가 나옵니다.

 === Base Class 생성 ===
Base Class
 === Derived Class 생성 ===
Base Class
Derived Class
Base

 

Derived 클래스에서 Base 클래스를 상속받아 ShowClass 함수를 호출하였는데 Derived클래스에는 ShowClass를 Base클래스에서 가져다가 사용하게 됩니다.

하지만 그 함수를 사용했을때 출력값은 Base클래스에 있는 변수를 사용하기에 출력값이 다르게 나오게 됩니다.

 

이걸 이제 Derived클래스에 str 변수값을 출력하기위해 ShowClass를 오버라이딩을 하게됩니다.

 

#include <iostream>
#include <string>

class Base {
private:
    std::string str;

public:
    Base() : str("Base") { std::cout << "Base Class" << std::endl; }

    void ShowClass() { std::cout << str << std::endl; }
};


class Derived : public Base {
private:
    std::string str;

public:
    Derived() : Base(), str("Derived") {
        std::cout << "Derived Class" << std::endl;
        
        //상속받아서 Base 클래스 내부 ShowClass 메소드 사용가능
        ShowClass();
    }
    

    //오버라이딩
    void ShowClass() { std::cout << str << std::endl; }
};
int main() {
    std::cout << " === Base Class 생성 ===" << std::endl;
    Base p;

    std::cout << " === Derived Class 생성 ===" << std::endl;
    Derived c;

    return 0;
}

위코드를 봤을떄 Derived클래스에 ShowClass 메소드를 오버라이딩을 하여 출력값이 아래와 같이 변하게됩니다.

 === Base Class 생성 ===
Base Class
 === Derived Class 생성 ===
Base Class
Derived Class
Derived

 

이게 오버라이딩입니다. 상속받은 클래스에 있는 함수를 파생클래스에서 재정의해서 사용합니다.

 

 

 

자그러면 오버로딩은뭐냐?

이름은 헷갈립니다 오버라이딩 오버로딩

하지만 오버로딩은 그냥 단순하게 생각합니다.

 

함수명은 동일하지만 매개변수와 리턴타입이 변하면 가능합니다

int TestFunction(int t) {
    std::cout << t << std::endl;
    return 0;
}
int TestFunction(int t, int t2) {
    std::cout << t << std::endl;
    return 0;
}
double TestFunction(double t) {
    std::cout << t << std::endl;
    return 0;
}
double TestFunction(double t, double t1) {
    std::cout << t << std::endl;
    return 0;
}

위 코드와 같이 함수명은 동일하지만 매개변수 및 리턴값이 달라지면 함수를 선언할 수 있습니당.

반응형

'C++ > 기본문법' 카테고리의 다른 글

mutex  (1) 2024.12.26
접근제한자, 캡슐화  (0) 2024.12.16
레퍼런스(참조자) 란?  (0) 2024.12.10
변수란?  (0) 2024.12.02