반응형
오버로딩(Overloading)과 오버라이딩(Overriding)
오버로드란?
: 함수 중복 정의
- 오버로딩은 같은 이름의 함수에 매개변수를 다르게 사용하여 매개 변수에 따라 다른 함수가 실행되는 것
오버라이딩(Overriding)
: 함수 재정의
- 오버라이딩은 상속받았을 때 부모클래스의 함수를 사용하지 않고 다른 기능을 실행할 때 함수를 자식 클래스에 같은 이름, 매개변수로 재정의해서 사용하는 것.
객체 지향에서의 오버로딩은 같은 이름의 메소드를 여러개 중복 선언하는 것을 말한다.
C와 같은 기존언어에서는 같은 이름의 함수를 만들 수가 없었다. 이것이 직관적으로 보일 수 있지만, 다음과 같은 경우를 보자
- 만약, 정수값들을 더 해서 평균을 내는 메소드를 사용있다고 가정
- 같은 기능을 하는 것 == 실수를 다루는 메소드를 만들고 싶다
ex) 정수를 위한 메소드 이름 == average()
실수를 다루는 것은 조금이라도 이름이 달라져야 하기 때문에 average_float()과 같은 식으로 작성
but, 이런식으로 메소드들이 수 없이 만들어지면 개발자들은 모든 함수를 기억하기 힘듦.
C++에서는 이런 경우 average()라는 이름을 같이 사용할 수 있도록 해준다.
- 정수를 인수로 받는 average()메소드와 실수를 인수로 받는 average() 메소드를 같이 정의할 수 있게 하는 것
average()루틴을 사용하는 측면에서 어떻게 구별할까?
- average()메소드에 넘기는 인수의 종류를 달리해주면 된다.
- 정수를 다루는 average()부르고 싶다면 정수값을 넣어주고
- 실수를 다루는 경우에는 average()인수로 실수값을 넘기면 된다.
void average(int a, int b)
{
int avg = 0;
avg = (a * b) / 2;
printf("a : %d, b : %d , average : %d" ,a, b ,avg)
}
void average(float a, float b)
{
float avg = 0;
avg = (a * b) / 2;
printf("a : %f, b : %f , average : %f" ,a, b ,avg)
}
- 이렇게 하면 훨씬 직관적인 프로그램을 할 수 있다
- 오버로딩을 하기 위해서는 지켜야할 규칙이 있다.
- average()라는 똑같은 이름을 사용할 수 있다고 했지만, 각각 구별할 수 있는 방법이 필요.
- C++에서는 각 메소드에 대해서 시그네이쳐를 형성해서 이들을 구별함.
- 시그네이쳐는 각 메소드의 이름과 인수의 종류, 인수의 갯수에 구별됨.
따라서 인수의 갯수나, 타입만 다르면 같은 이름의 메소드라도 몇개든지 선언할 수 있다.
but 반환타입은 시그네이처에 포함되지 않기 때문에 주의해야함.
반환값만 다른 경우에는 컴파일러락 에러를 발생시킬 것임.
반응형