Programming
Overriding(오버라이딩)과 Overloading(오버로딩)
이진2
2021. 8. 16. 01:13
오버라이딩과 오버로딩은 한글로 보면 더더욱 헷갈리는 객체지향 프로그래밍의 메소드 정의 방식이다
(Method) Overriding : 자식(서브) 클래스가 부모(슈퍼) 클래스에 정의된 메소드를 재정의 할 수 있는 기능.
부모 클래스에 정의되어 있는 메소드와 정확히 같은 이름, 같은 반환형, 같은 파라미터를 가져야 한다
Java에서는 @Override 메소드를 이용하여 오버라이딩을 할 수 있다
class Thought {
public void message() {
System.out.println("I feel like I am diagonally parked in a parallel universe.");
}
}
public class Advice extends Thought {
@Override // @Override annotation in Java 5 is optional but helpful.
public void message() {
System.out.println("Warning: Dates in calendar are closer than they appear.");
}
}
이 때 new Thought()를 통해 Thought 객체를 생성하고 message를 호출하면 Thought의 message가, Advice 객체를 생성하기 때문에
Thought result1 = new Thought();
Thought result2 = new Advice();
Advice result3 = new Thought(); //잘못 된 선언 방식
Advice result4 = new Advice();
result1.message(); // Thought - message
result2.message(); // Advice - message
result4.message(); // Advice - message
위와 같은 실행 결과를 얻을 수 있다
(Method) Overloading : 같은 함수 이름, 다른 함수 파라미터를 가지는 여러 메소드를 정의할 수 있는 기능.
✅연산자 오버로딩
' + ' 연산자는 Numeric type에 대해서는 두 숫자 값을 더하여 Numeric type result를 반환하지만
String type에 적용될 때 에는 두 개의 String 객체를 concatenate하는 기능을 수행한다.
이렇게 하나의 연산자가 적용되는 피연산자에 대해 다른 기능을 수행하는 다형성을 제공한다.
메서드 오버로딩을 한 눈에 알 수 있는 예시이다
ArrayList에는 삽입할 element 하나만을 맨 끝에 삽입하는 메서드, 삽입할 위치 index를 함께 인자로 전달받는 메서드 2개가 존재한다
메서드를 오버로딩 해서 사용할 때 에는 반드시 함수 파라미터를 다르게 지정해줘야 한다(access modifier나 return-type에는 제한이 없다)
클래스를 정의할 때 여러 개의 생성자를 만들 수 있는 것도 생성자 오버로딩을 활용한 예시라고 볼 수 있다 ❗
// 출처: https://opentutorials.org/course/4408/28703
class Cal{
public int sum(int v1, int v2){
return v1+v2;
}
// Overloading
public int sum(int v1, int v2, int v3){
return v1+v2+v3;
}
}
class Cal3 extends Cal{
public int minus(int v1, int v2){
return v1-v2;
}
// Overriding
public int sum(int v1, int v2){
System.out.println("Cal3!!");
return v1+v2;
}
}
public class InheritanceApp {
public static void main(String[] args) {
Cal c = new Cal();
System.out.println(c.sum(2,1));
System.out.println(c.sum(2,1,1));
Cal3 c3 = new Cal3();
System.out.println(c3.sum(2,1));
System.out.println(c3.minus(2,1));
System.out.println(c3.sum(2,1));
}
}
class Cal2{
public int sum(int v1, int v2){
return v1+v2;
}
public int minus(int v1, int v2){
return v1-v2;
}
}