자바(JAVA) 메서드 오버로딩과 오버라이딩
1. 메서드 오버로딩 (method overloading)
한 클래스내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩이라고 합니다.
오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 합니다.
- 메서드명이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- 리턴타입만 다른 경우는 성립되지 않는다.
다음 예제를 통해 오버로딩에 대해 확인해 보겠습니다.
class Math { int add(int a, int b) { return a + b; } long add(int a, long b) { return a + b; } long add(long a, long b, long c) { return a + b + c; } int add(int a, int b, int c) { return a + b + c; } long add(long b, int a) { return b + a; } }
조건에 따라 오버로딩이 이루어진 것을 확인할 수 있습니다.
※ 매개변수의 개수와 타입이 같고 순서만 다른 경우 오버로딩으로 간주됩니다.
ex)
long add(int a, long b) { return a+b; }
long add(long b, int a) { return a+b; }
2. 메서드 오버라이딩 (method overriding)
부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 메서드 오버라이딩이라고 합니다. 상속 받은 메서드를 그대로 사용하기도 하지만 변경이 필요한 경우에 대해서 오버라이딩을 해줍니다.
오버라이딩은 상속받은 메서드의 내용만을 새로 작성하는 것이며 다음의 조건을 만족해야 합니다.
- 부모 클래스에서 오버라이딩하려는 메서드와 메서드명이 같아야 한다.
- 부모 클래스에서 오버라이딩하려는 메서드와 매개변수가 같아야 한다. (매개변수의 개수와 타입이 동일해야함)
- 부모 클래스에서 오버라이딩하려는 메서드와 리턴타입이 같아야 한다.
즉, 오버라이딩하려는 메서드는 선언부가 부모 클래스의 메서드와 동일해야 합니다.
또한 아직 언급하지는 않았지만 접근 제어자와 예외(exception)에 있어서도 제한을 받습니다.
- 접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
- 부모 클래스의 메서드에 지정된 예외보다 많은 수의 예외를 선언할 수 없고, 상위에 있는 예외를 사용할 수 없습니다.
이 부분에 대해서는 관련 내용을 알아볼 때 다시 정리하도록 하겠습니다.
다음 예제 코드를 통해 오버라이딩을 확인해 보겠습니다.
public class Table { static String mainMenu = "rice"; static String subMenu = "kimchi"; class Parent { String eatSomeFood() { return "eat " + mainMenu + " and " + subMenu; } } class Child extends Parent { String myWill = "I will not "; String eatSomeFood() { return myWill + "eat " + mainMenu + " and " + subMenu; } } }
자식 클래스에서 메서드를 상속받아 오버라이딩이 이루어진 것을 확인할 수 있습니다.
※ 오버로딩 vs 오버라이딩
- 오버로딩(overloading) : 메서드명만 동일하게하여 새로운 메서드를 정의하는 것. (매개변수 개수와 타입이 달라야 한다)
- 오버라이딩(overriding) : 상속받은 메서드의 내용만 변경하는 것. (선언부가 부모 클래스의 메서드와 동일해야 한다)
이상으로 자바의 오버로딩, 오버라이딩에 대해서 알아봤습니다.
※ 참고 문헌
남궁성, 『Java의 정석 2nd Edition』, 도우출판(2010)