메소드 오버로딩의 핵심은 바로 메소드 시그니처(method signature)에 있다. 메소드 시그니처란 메소드의 선언부에 명시되는 매개변수의 리스트를 가리키며 만약 두 메소드가 매개변수의 개수와 타입, 그 순서까지 모두 같다면, 이 두 메소드의 시그니처는 같다고 할 수 있다.
메소드 오버로딩(overloading)이란 같은 이름의 메소드를 중복하여 정의하는 것을 의미한다. 자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있게 된다.
즉, 메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것이라고 할 수 있다. 이러한 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있으며 메소드를 호출할 때 전달해야 할 매개변수의 타입이나 개수에 대해 크게 신경을 쓰지 않고 호출할 수 있게 된다.
메소드 오버로딩은 객체 지향 프로그래밍의 특징 중 하나인 다형성(polymorphism)을 구현하는 방법 중 하나다.
메소드 오버로딩의 대표적인 예로는 println() 메소드를 들 수 있다. println() 메소드는 전달받는 매개변수의 타입에 따라 다음과 같이 다양한 원형 중에서 적절한 원형을 호출하게 됩니다.
1. println()
2. println(boolean x)
> 3. println(char x)
4. println(char[] x)
5. println(double x)
6. println(float x)
7. println(int x)
8. println(long x)
9. println(Object x)
10. println(String x) 입력하세요
자바에서 메소드 오버로딩이 성립하기 위해서는 다음과 같은 조건을 만족해야 한다.
메소드 오버로딩은 반환 타입과는 관계가 없다. 만약 메소드의 시그니처는 같은데 반환 타입만이 다른 경우에는 오버로딩이 성립하지 않는다.
오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것이라고 할 수 있다. 자바에서 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드를 상속받으며 이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있다. 즉, 메소드 오버라이딩이란 상속받은 부모 클래스의 메소드를 재정의하여 사용하는 것을 의미한다.
오버라이딩(overriding)은 무시하다, 우선하다라는 뜻을 가지고 있는데 말 그대로 기반 클래스의 메서드를 무시하고 새로운 메서드를 만든다는 뜻이다. 보통 프로그램에서 어떤 기능이 같은 메서드 이름으로 계속 사용되어야 할 경우 메서드 오버라이딩을 활용하며 기반 클래스의 매소드를 파생 클래스에서 재활용하여 중복을 줄일 수 있다. 즉, 중복되는 기능은 파생 클래스에서 다시 만들지 않고, 기반 클래스의 기능을 사용하면 되는 것이다. 이처럼 매소드 오버라이딩은 원래 기능을 유지하면서 새로운 기능을 덧붙일 때 사용한다.
자바에서 메소드를 오버라이딩하기 위한 조건은 다음과 같다.
참고문서
http://www.tcpschool.com/java/java_usingMethod_overloading
http://www.tcpschool.com/java/java_inheritance_overriding