2019년 11월 15일 금요일

오버로딩(Overloading)과 오버라이딩(Overriding)의 정의 및 차이

오버로딩(Overloading) : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술
오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용



오버로딩(Overloading)

오버로딩은 메서드 오버로딩과 생성자 오버로딩이 있습니다. 하지만 둘 다 같은 개념이에요.
같은 이름의 함수(메서드)를 여러개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게됩니다.


예제 코드)

class OverloadingTest
{
public:

void testfunc()
{
cout << "no param" << endl;
}

void testfunc(int a, int b)
{
cout << "param : " << a << ", " << b <<endl;
}

void testfunc(string s, int b)
{
cout << "param : " << s << ", " << b << endl;
}
};


int main()
{
OverloadingTest *ot = new OverloadingTest();

ot->testfunc();
ot->testfunc(1,2);
ot->testfunc("test", 3);

    return 0;
}

위와 같이 같은 함수의 이름을 여러번 만들지만 전달해주는 매개변수의 차이로 다른 함수가 될 수 있습니다.

실행결과)

no param
param : 1, 2
param : "test", 3


이렇게 나오게 됩니다.

매개변수에 알맞는 함수를 호출해주게 됩니다.



--------------------------------------------------------------------------------------------------



오버라이딩(Overriding)
 상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메서드도 하위 클래스로 상속되어 하위 클래스에 사용할 수 있습니다. 또한, 하위 클래스에서 메서드를 재정의해서도 사용할 수 있습니다.
쉽게 말해 메서드의 이름이 서로 같고, 매개변수가 같고, 반환형이 같을 경우에 상속받은 메서드를 덮어쓴다고 생각하시면 됩니다. ' 부모클래스의 메서드는 무시하고, 자식 클래스의 메서드 기능을 사용하겠다'와 같습니다.


예제 코드)

class Car 
{

public :

string name;
int create_year;

void showinfo() 
{
cout << "name : " << name << ", create year : " << create_year << endl;
}
};

class Bus : public Car
{
public :
int person_count;

void showinfo()
{
Car::showinfo();
cout << "person_count : " << person_count << endl;
}
};


int main()
{
Bus *b = new Bus();
b->name = "bus";
b->create_year = 2019;
b->person_count = 45;

b->showinfo();

    return 0;
}

실행결과)

name : "bus", create year : 2019
person_count : 45


bus클래스가 car클래스를 상속 받아 showinfo() 함수를 재정의 해주면서 부모의 함수를 재정의 된 함수에서 호출 ( Car::showinfo(); )을 해줌으로써 name과 create_year의 정보가 같이 나올 수 있게 됩니다.


오버로딩(Overloading)과 오버라이딩(Overriding) 성립조건
구분 
오버로딩 
오버라이딩 
 메서드 이름
동일 
동일 
 매개변수, 타입
다름 
동일 
 리턴 타입
상관없음 
동일 


출처: https://private.tistory.com/25 [공부해서 남 주자] (코드 제외)