자바로 프로그래밍을 하다보면 Overriding과 Overloading이라는 키워드를 마주치게 된다.
Override
우선 Override란 자식 클래스에서 부모 클래스가 가진 기능에 무언가를 보태어 같은 이름으로 재정의할 때 사용하는 기능이다. 상속(inheritance)에서 사용되는 개념이다.
상속은 일반적으로 좀 더 추상적인 부모 클래스(superclass)와, 그 부모 클래스를 답습한 더 구체적인 자식 클래스(subclass)로 구분된다. 부모 클래스가 가지고 있는 기능을 마냥 답습하기만 하는 자식 클래스라면 굳이 만들 필요가 없다. 이때 부모 클래스가 가진 기능이지만 더 보태서 같은 이름으로 다시 재정의하는 것을 Override라고 하는 것이다.
class Calculator {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
class Calculator2 extends Calculator {
public int minus(int v1, int v2) {
return v1 - v2;
}
@Override
public int sum(int v1, int v2) {
System.out.println("Calculator2...");
return v1 + v2;
}
}
public class CalApp {
public static void main(String[] args) {
Calculator2 c2 = new Calculator2();
System.out.println(c2.sum(1, 2));
}
}
위 코드에서, 일단 extends 키워드를 통해 Calculator2가 Calculator을 상속 받는다는 것을 표현했다. 이때 기존 Calculator 클래스에는 없는 뺄셈 기능을 넣을 때에는 그냥 minus() 메소드를 추가로 선언했다. 그런데 부모 클래스에 있는 sum() 기능에 무언가를 추가하고 싶으면, 재정의(Override)하면 되는 것이다.
Override를 하고 main 메소드에서 Calculator2의 인스턴스를 생성하고 System.out.println(c2.sum(1, 2)); 를 하면, 부모 클래스의 sum()이 아니라 자식 클래스의 sum()으로 결과가 도출되는 것을 알 수 있다.
Overloading
Overloading은 상속과는 직접적인 관련이 없다. 특정 이름을 지닌 메소드가 있다 할지라도 우리는 같은 이름을 가진 메소드를 또 만들 수 있다. 다만 파라미터의 형식이 달라야 한다.
class Calculator {
public int sum(int v1, int v2) {
return v1 + v2;
}
// Overloading
public int sum(int v1, int v2, int v3) {
return v1 + v2 + v3;
}
}
이렇게 같은 클래스 내에 같은 이름을 가진 메소드라고 해도, 메소드를 호출할 때는 파라미터의 형식도 모두 보기 때문에 프로그램은 각각의 메소드가 서로 애매하다고 판단하지 않는다.
Overloading은 단지 메소드이기 때문에 상속 관계가 있다고 할 때 자식 클래스가 가질 수도 있다. 부모 클래스가 가지지 않는 기능을 추가하면서 부모 클래스가 가지고 있는 메소드 중에 이름이 같은 것과 함께 공존할 수 있는 것이다.
class Calculator {
public int sum(int v1, int v2) {
return v1 + v2;
}
}
class Calculator2 extends Calculator {
public int minus(int v1, int v2) {
return v1 - v2;
}
// Overloading
public int sum(int v1, int v2, int v3) {
return v1 + v2 + v3;
}
}
public class CalApp {
public static void main(String[] args) {
Calculator2 c2 = new Calculator2();
System.out.println(c2.sum(1, 2)); // 3
System.out.println(c2.sum(1, 2, 3)); // 6
}
}
위 코드에서처럼, 자식 클래스인 Calculator2에서 부모 클래스인 Calculator에서 이미 선언된 sum() 메소드와 같은 이름인 sum() 메소드를 정의할 때 파라미터를 int v1, int v2, int v3의 세 개로 함으로써 부모 클래스의 sum() 메소드와는 다른 메소드를 만든 것이다.
Overriding은 같은 클래스 안에서는 이뤄질 수 없고, 상속 관계를 가진 클래스 사이에서 이뤄질 수 있다는 특징을 지닌 반면, Overloading은 같은 클래스 안에서 이뤄질 수 있으며, 상속 관계를 가진 클래스 사이에서도 이뤄질 수 있다는 특징을 지녔다.
[참고자료]
https://docs.oracle.com/javase/tutorial/java/IandI/override.html
Overriding and Hiding Methods (The Java™ Tutorials > Learning the Java Language > Interfaces and Inheritan
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
'Language > Java' 카테고리의 다른 글
상속과 생성자 (0) | 2022.11.14 |
---|---|
this, super (0) | 2022.11.14 |
생성자(constructor)와 this (0) | 2022.11.13 |
static (0) | 2022.11.13 |
접근 제어자 (access level modifiers) (0) | 2022.11.10 |