파견이 끝나고 복귀하니 정신없는 시간을 보내게 되어 잠시 공부내용을 기록하는 것에 소홀했던 나.. 반성합니다.
이번엔 서로 다른 개념이지만 아름이 비슷해 헷갈리는 Overloading과 Overriding에 대해 정리해보려고 합니다.
class OverloadingTest {
void animal() {
System.out.println("매개변수 없음");
}
void animal(int a){
System.out.println(a);
}
void animal(int a, int b){
System.out.println(a+b);
}
void animal(int a, long b){
System.out.println(a+b);
}
}
class Main{
public static void main(String[] args) {
OverloadingTest olt = new OverloadingTest();
olt.animal();
olt.animal(1);
olt.animal(1, 2);
olt.animal(1,30000000);
}
}
결과값
매개변수 없음
1
3
300000001
즉, 같은 이름의 메서드이지만 매개변수의 개수 또는 타입이 다른 경우에 Overloading이 성립한다고 볼 수 있다.
또한
animal(int a, long b) { System.out.println(a+b); }
animal(long a, int b) { System.out.println(a+b); }
이 두 메서드의 경우에도 Overloading이라고 할 수 있다.
우리가 가장 익숙할만한 Overloading의 예는 println이 있다.
만약 우리가 출력할 때마다 매개변수의 개수, 타입이 다른 경우 또는 순서가 다른 경우마다 모두 메서드의 이름을 다르게 선언해야한다면 굉장히 불편할 것이다.
아래와 같이 예를 들 수 있다.
println();
printlnBoolean(boolean x);
printlnChar(char x);
printlnDouble(double x);
printlnString(String x);
class Point {
int x;
int y;
String getLocation() {
return “x : ” + x + “, y : ” + y;
}
class Point3D extends Point {
int z;
String getLocation() { // 오버라이딩
return “x : ” + x + “, y : ” + y + “, z : ” + z;
}
}
위의 코드와 같이 부모 클래스를 상속받은 자식 클래스가 부모 클래스와 다른 정보를 저장해야할 때 오버라이딩한다.
오버라이딩에도 역시 조건이 있다.
자식 클래스에서 오버라이딩하는 매서드는 부모 클래스의 메서드와
1. 이름이 같아야 한다.
2. 매개변수가 같아야 한다.
3. 반환타입이 같아야 한다.
조상 클래스의 메서드를 자손 클래스에서 오버라이딩할 때
즉, 오버라이딩은
라는 조건을 가진다고 기억하면 된다.
@Override에서 @는 어노테이션(Annotation)이라고 하며, 주석이라는 뜻이다. 우리가 알고있는 //과 같은 일반적인 주석과 다르게, 검증하는 기능을 한다. @Override는 여기서 오버라이딩을 검증하는 기능을 한다. 코드상으로 검사했을 때, 오버라이딩이 실제로 시행되지 않았다면 컴파일시 오류를 출력한다.