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하는 기능을 수행한다.
이렇게 하나의 연산자가 적용되는 피연산자에 대해 다른 기능을 수행하는 다형성을 제공한다.

 

Java - ArrayList

메서드 오버로딩을 한 눈에 알 수 있는 예시이다

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;
    }
}