[자바/Java] 오버라이딩과 오버로딩(OverRiding and OverLoading)
오늘은 오버라이딩과 오버로딩에 대한 설명 및 차이점에 대해 소개한다.
오버라이딩(OverRiding)이란?
오버라이딩은 상속 관계에 있는 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 것을 의미한다.
하지만 이 오버라이딩을 하기 위해서는 몇가지 규칙을 지켜야한다.
1. 부모 메서드의 이름, 파라미터, return 타입이 같아야 한다.
2. 부모 메서드의 접근제어자의 범위보다 더 좁아질 수 없다.
접근제어자에 대해서는 다음 포스팅에서 소개하겠지만, public > protected > (default) > private 순서로 범위가 작아진다는 것만
우선 알아두자.
3. 부모 메서드가 가지고 있는 예외의 개수보다 자식 클래스의 메서드의 예외 개수가 더 많아질 수 없다.
부모 클래스 : void parent_method(...) throws IOException, NullPointerException {...}
자식 클래스 : void children_method(...) throws Exception{...}
그러면 다음과 같은 경우는 부모 클래스의 예외가 2개이고, 자식 클래스의 예외가 1개이니 가능할까?? 불가능하다.
왜냐하면 자식 메서드에서 사용되는 Exception은 모든 예외를 다루고 있으므로 2개보다 많다. 이러한 경우를 제외하고는 개수를 통해
서 오버라이딩의 조건을 확인할 수 있을 것이다.
4. 인스턴스 메서드에서 static 메서드로, static 메서드에서 인스턴스 메서드로 변경할 수 없다.
아래에는 기본적인 오버라이딩에 대한 예제 코드를 첨부한다.
public class GenesisCar extends Car{
GenesisCar() {
super(150, true, 'A');
}
@Override
void run(){
System.out.println("제네시스");
super.run();
}
public static void main(String[] args) {
GenesisCar genesisCar = new GenesisCar();
genesisCar.run();
}
}
class Car {
int speed;
boolean operable;
char grade;
Car(int speed, boolean operable, char grade) {
this.speed = speed;
this.operable = operable;
this.grade = grade;
}
void run() {System.out.println("차가 달립니다.");}
}
GenesisCar 클래스가 Car의 run 메소드를 Override한 것을 알 수 있다. 또한 위에서 제시한 조건 4가지 또한 만족한다.
그렇다면 GenesisCar 클래스 내에 run 메소드에서 위에 적힌 @Override는 무엇일까? 바로 어노테이션이라고 한다. 애노테이션(Annotation)이라고도 불리는 이 용어는 말그대로 '주석'을 의미한다. 별다른 기능은 없지만 컴파일 과정에서 좀 더 유용하다 정도만 알아두고 넘어가자.
오버로딩이란?
오버로딩은 이름이 같은 메서드이지만 파라미터의 타입과 개수를 다르게 작성하여 선언하는 것이다.
오버로딩 또한 사용하기 위해 규칙을 지켜야한다.
1. 파라미터의 개수와 파라미터의 타입이 다를 때 사용할 수 있다.
2. 파라미터의 개수와 타입의 변화가 없지만 return 타입이 다를 때는 사용할 수 없다.
이 규칙을 지켜 선언하면 된다. 오버로딩은 별다른 어노테이션이 존재하지 않는다.
아래에는 예제 코드를 첨부한다.
public class Car {
void run() {}
void run(int a){}
void run(int a, boolean b){}
boolean run(String a) {return false;}
}
위와 같은 run 함수들이 오버로딩된 상태라고 할 수 있다.
이름은 비슷해서 혼동되기 쉽지만, 엄연히 다른 오버라이딩과 오버로딩의 개념에 대해서 알아봤다. 이제는 헷갈리지 말고 잘 구분해야겠다.