Study/Java

[자바] 오버로딩과 오버라이딩

minulbora 2023. 11. 21. 23:36

목표: 오버라이딩에 대하여 정확하게 알고, 오버로딩과 오버라이딩의 차이를 생각해보자. 

 

메서드 오버로딩에 관해서는 앞서 공부한 바가 있다. 

간단하게 다시 살펴보자면, 메서드 오버로딩은 코드의 중복성을 줄여 재사용성을높이며 사용자에게 매개변수의 자율성을 제공하기 위해 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것이다. 이때 각 메서드는 이름이 같고, 매개변수의 개수 또는 타입이 다르게 구현되어야 한다. 

다만, 반환타입은 아무런 영향을 미치지 않는다

 

다음은 오버로딩의 간단한 예시다. 

 

add 와 sub 라는 동일한 이름의 메서드를 매개변수 0개, 2개로 각각 2개씩 나누어 오버로딩 하였다. 

물론, 답은 300, 100으로 2번 반복되어 나오지만 오버로딩의 기능을 확인해 볼 수 있는 예시다. 

이러한 메서드 오버로딩은 생성자에도 적용하여 사용할 수 있음을 앞서 확인했었다. 

 

 

다음으로, 메서드 오버라이딩에 대하여 알아보자. 

오버라이딩은 상속을 전제로 한다. 

상속받은 자식 클래스는 부모(조상) 클래스의 변수나 메서드를 받아 사용하는데, 여기에서 예외를 만들고 싶을 때 사용하는 것이다.   

따라서 메서드 오버라이딩을 사용하려면, 부모 클래스와 이름이 완전히 같아야 하고, 매개변수, 반환 타입 역시 같아야 한다. 

즉, 선언부가 일치해야 한다.  

 

다음은 오버라이딩의 예시다.

Point3D 클래스는 extends 를 활용하여 Point 클래스를 상속받았다는 점을 알 수 있다. 

getLocation 함수를 두 클래스에 동일한 선언부로 설정한 후, return 값을 다르게 설정했다. 

main 메서드에서 자식 클래스를 객체 생성했으므로, 본래 부모 클래스의 getLocation 메서드를 활용할 수 있지만, 위의 경우에는 오버라이딩을 활용했으므로, Point3D의 getLocation이 찍히게 된다. 

 

이러한 경우에, 부모 클래스의 getLocation 메서드를 활용하고 싶다면, 위와 같이 부모클래스의 객체생성을 따로 하여 활용하거나, 자식클래스의 getLocation 메서드 안에 super.getLocation(); 을 활용하는 두 가지 방법이 있다. 

 

 

끝으로, 오버라이딩과 오버로딩의 차이점을 다시 한 번 요약해보자. 

본질적으로, 오버로딩은 한 클래스 내에서 중복을 제하고 코드의 재사용성을 늘리기 위한 방법이고 오버라이딩은 상속 관계에서 예외를 만들기 위해 부모 클래스 내의 메서드를 자식 클래스에 그대로 작성하는 방법이다. 

따라서 오버로딩은 매개변수에 차이가 있으며, 또 반환 타입을 신경쓰지 않아도 되는 반면, 오버라이딩은 선언부가 완전히 동일해야 하므로 매개변수, 반환타입 등 역시 동일해야 한다는 점을 알 수 있다.