Java 에서 다형성(polymorphism)을 지원하는 방법으로 Overriding 과 Overloading 이 있다. 한글 발음으로는 두 가지가 비슷하여 헷갈릴 수 있으나 그 뜻을 비교하면 이해하기 쉽다.
Overriding 은 사전적 의미 그대로 조상클래스의 메서드를 자손 클래스에서 재정의하는 것을 말한다. 가장 대표적인 예시는 Object Class 의 toString 메서드 이다.
Object Class toString() Method
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
모든 클래스의 최상위 조상인 Object 에서는 toString() 메서드가 객체의 클래스명 @ 16진수 해시코드 를 반환하는 메서드로 정의되어 있으나, 오버라이딩(재정의)를 통해 원하는 방식으로 변환할 수 있다.
public class Student {
String name;
int score;
@Override
public String toString() {
return "Student [name=" + name + ", score=" + score + "]";
}
}
toString() 메서드를 학생의 이름과 점수를 출력하는 메서드로 재정의하였다.
Overriding 의 뜻 그대로 재정의하여 사용한 것이다.
오버라이딩에는 몇가지 조건이 있지만 생각해보면 당연한 것들이다.
Overloading 은 메서드뿐만 아니라 생성자에도 적용할 수 있으며 같은 이름의 메서드를 여러개 정의하고, 매개변수의 유형과 개수를 다르게 하여 다양한 유형의 호출에 응답할 수 있게 한다. 즉 하나의 이름을 여러가지 경우의 수에 적용(Loading)하는 것이라고 생각하면 이해하기 쉽다.
public int add(int a, int b) {
return a + b;
}
두 개의 int 타입 매개변수를 받아 더한 뒤 그 결과를 int 타입으로 반환하는 메서드이다. 그러나 사용자의 실수로 문자열로된 매개변수를 입력할 경우 오류가 발생될 수 있을 것이다. 이러한 경우를 막기 위한 오버로딩을 해보자.
public int add(int a, int b) {
return a + b;
}
public int add(String a, String b) {
int aa = Integer.parseInt(a);
int bb = Integer.parseInt(b);
return aa + bb;
}
public int add(String a, int b) {
int aa = Integer.parseInt(a);
return aa + b;
}
public int add(int a, String b) {
int bb = Integer.parseInt(b);
return a + bb;
}
두 개의 매개변수 중 어느 한쪽이 문자열이거나 모두 문자열일 경우 이를 int 타입으로 변환하여 연산을 수행하고 그 결과를 반환할 수 있도록 추가적인 메서드를 작성했다. 이렇게 이름이 같은 메서드를 여러개 정의하여 전달받는 매개변수에 따라 호출되는 메소드가 다르게 하여 원하는 결과를 얻을 수 있다.