-
Overriding(오버라이딩)과 Overloading(오버로딩)Programming 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; } }
'Programming' 카테고리의 다른 글
Value와 Object, identity와 equality의 차이 (0) 2021.08.07 [Python] Datetime 시간 객체 활용하기(문자열 변환, 증감, 대소비교) (0) 2021.03.24