오버라이딩과 오버로딩
오버로딩과 오버라이딩은 이름이 비슷해서 그런지, 차이점이 무엇인지 아느냐는 질문을 종종 받곤 한다.
이 개념들은 자바에서 다형성(Polymorphism)을 지원하는 방법이기도 하다.
오버라이딩(Overriding)
상속(Inheritance) 받은 부모 클래스의 메소드를 자식 클래스가 재정의하여 사용하는 것
메소드의 이름, 매개 변수의 타입 및 개수, 리턴 타입이 같아야 한다.
상속 받은 메소드의 기능 외에 다른 기능을 필요로 할 때 주로 사용된다.
예를 들어 자식인 스마트폰이 핸드폰이라는 부모 클래스를 상속 받았다고 가정해보자.
통화 기능에 있어서 핸드폰은 기지국을 거친 통화만 가능했다. 그러나 스마트폰은 인터넷을 통한 VoIP 통화가 가능해졌다.
이럴 때 핸드폰의 통화 기능을 오버라이딩하여 인터넷 통화 기능을 추가해 재정의하는 것이 오버라이딩이다.
코드로 살펴보자면 아래와 같다.
매우 억지로 짠 코드지만 양해를 바란다
public class Cellphone{
...
public void PhoneCall(){
return baseStation;
}
}
public class Smartphone extends Cellphone{
...
@Override
public void PhoneCall(){
if(this.callType == VoIP)
return internet protocol;
else
return baseStation;
}
}
오버로딩(Overloading)
같은 이름을 가진 메소드의 매개변수를 다르게 하여 사용하는 것
메소드의 이름이 같아야 하고 매개 변수의 타입이나 개수가 달라야 한다. 리턴 타입은 상관이 없다.
매개 변수의 타입이 다르거나 개수가 다른 것을 통해 컴파일러가 메소드를 찾아낸다.
대표적인 예로 자바에서 System.out.println
이 있다.
println
에는 int형, String형 등 다양한 형을 매개 변수로 주더라도 콘솔에 프린트 되는 기능은 같다.
오버로딩은 이러한 경우처럼 비슷한 기능을 가졌으나 매개 변수로 받아야 하는 타입이 다른 경우에 주로 사용한다.