오버로딩 vs 오버라이딩
둘이 가끔 헷갈릴만한 단어인데 오버라이딩은 상속받은 메서드의 내용을 변경하는 것이고 오버로딩은 기존에 없는 새로운 메서드를 정의하는 것이다.
class parent{
void method1(){};
}
class child{
void method1(){};
} //method overriding
부모 클래스에 있는 메서드와 동일한 이름의 메서드를 만들면 부모 클래스의 메서드가 아닌 자식 클래스의 메서드로 내용이 변경이 된다.
반면에, 오버로딩은 같은 클래스 내에서 동일한 이름의 메서드를 여러 개 정의하는 것을 말한다.
오버로딩이 가능하려면 다음 2가지 조건을 만족해야한다.
여기서 주의해야 할 점은 메서드의 리턴 타입이 다른 것은 오버로딩의 조건이 되지 않는 것이다.
class overloadclass{
int method1(){}
String method1(){} //1.오버로딩 불가능
int method1(int a, int b){} //2.오버로딩 가능
String method1(String a){} //3.오버로딩 가능
1번째 메서드의 경우 리턴 타입은 다르지만 매개변수의 개수, 타입에서 차이점을 가지지 못하여 오버로딩이 불가하다. 2,3번째 메서드의 경우 매개변수의 개수, 타입이 다르기 때문에 오버로딩이 가능하다.
그렇다면 매개변수의 순서가 다른 경우는 어떻게 될까?
class overloadclass2{
long method1(int a, long b){}
long method2(long a, int b){}
}
이 경우에도 매개변수의 값에 의해 호출될 메서드가 구분될 수 있기 때문에 오버로딩이 가능하다.
그렇다면 오버로딩을 왜 사용할까? 오버로딩이 불가능하다면 모든 메서드를 이름만으로 구별해야 한다. 그렇게되면 한 클래스내의 모든 메서드들은 이름이 달라져야 한다.
println 메서드를 예로 들어보자.
void println()
void println(boolean x)
void println(char x)
void println(char[] x)
void println(double x)
void println(int x)
void println(long x)
println 메서드는 매개변수의 타입으로 위의 오버로딩된 메서드들 중 하나가 호출되는 방식이다. 하지만, 오버로딩이라는 개념이 없다면 println을 사용하기 위해서는 다음과 같이 메서드를 정의해야한다.
void println()
void printlnBoolean(boolean x)
void printlnInt(int x)
...
이렇게 되면 모든 메서드를 일일히 기억해야 하기 때문에 사용하는 쪽에서 부담이 크게 된다.