프로그래밍 일기 — Override 와 Overload
뭘 Over한다는 것일까?
지난 번 개념들을 복습하는 과정에서 Overriding과 Overloading이 무엇인지에 대해 확실하게 짚고 넘어가야겠다는 생각이 들었다. 그래서 오늘은 이 두 개념에 대해 다뤄보기로한다.
Overriding & Overloading(2)
Overloading
컴파일타임(compile-time)에 적용되는 다형성(polymorphism)으로써, 같은 이름을 공유하는 메서드지만, 받는 인자의 수나 타입이 서로 다른 메서드간에 사용될 수 있다. Java에서는 리턴 타입을 변경하는 것만으로 오버로딩을 활용할 수는 없기 때문에, 반드시 메서드 활용 매개변수를 변경해 주어야 리턴 타입을 같거나 다르게 가져갈 수 있다.
// 오버로딩 예제
import java.io.*;
class MethodOverloadingEx {
// add 매서드 다형성 1
static int add(int a, int b) { return a + b; }
// add 매서드 다형성 2
static int add(int a, int b, int c)
{
return a + b + c;
}
// Main Function
public static void main(String args[])
{
System.out.println("add() with 2 parameters");
// 다형성 1의 add 매서드 활용
System.out.println(add(4, 6));
System.out.println("add() with 3 parameters");
// 다형성 2의 add 매서드 활용
System.out.println(add(4, 6, 7));
}
}
>>
add() with 2 parameters
10
add() with 3 parameters
17
Overriding
런타임(run-time)에 적용되는 다형성(polymorphism)으로써, 부모클래스로부터 물려받은 특정 성질을 활용해 다른 클래스에 조금 다르게 구현한 성질을 부모 클래스에서도 활용할 수 있게 해준다. 즉, 자녀클래스의 성질이 부모클래스의 성질을 우선하는(override) 것이다.
오버로딩에 비해서 리턴 타입이 반드시 같다는 차이점이있다.
아래 예제에서는 부모클래스인 Animal
클래스의 eat()
메서드가 자녀클래스인 Dog
클래스의 eat()
메서드를 오버라이딩한 예제이다.
// 오버라이딩 예제
import java.io.*;
// 부모클래스
class Animal {
void eat()
{
System.out.println("eat() method of base class");
System.out.println("eating.");
}
}
// 상속클래스
class Dog extends Animal {
void eat()
{
System.out.println("eat() method of derived class");
System.out.println("Dog is eating.");
}
}
class MethodOverridingEx {
// Main Function
public static void main(String args[])
{
Dog d1 = new Dog();
Animal a1 = new Animal();
d1.eat();
a1.eat();
Animal animal = new Dog();
// base class의 eat()메서드가 animal 클래스의 eat() 메서드를 오버라이딩한다.
animal.eat();
}
}
>>
eat() method of derived class
Dog is eating.
eat() method of base class
eating.
eat() method of derived class
Dog is eating.
Overriding vs Overloading
두 방식의 차이를 요약하자면 아래와 같다.
Overloading 요약
- 컴파일타임(compile-time)에 적용되는 다형성(polymorphism)이다.
- 컴파일 타임 다형성으로 인해 성능이 낮다.
- 가독성에 도움이 된다.
- 클래스 내에서만 활용될 수 있다.
- 상속을 반드시 필요로 하지 않을 수 있다.
- 사용되는 메서드들의 이름이 같아도 타입이 다르면 활용될 수 있다.
- 메개변수에 따라 리턴 타입은 같거나 다를 수 있다.
- 메서드에 static binding이 활용된다.
- Private/Final 접근제어자를 가진 메서드에 대해 적용된다.
- 활용시 메서드의 인자들은 달라야한다.
Overriding 요약
- 런타임(run-time)에 적용되는 다형성(polymorphism)이다.
- 런타임 다형성으로 인해 퍼포먼스가 상대적으로 좋다.
- 부모로 부터 상속한 특정 성질을 이어받아 다르게 활용할때, 또 그것을 부모클래스에서도 활용할 때 유용하다.
- 상속 관계를 가진 두 클래스 사이에서 활용될 수 있다.
- 반드시 상속 관계에서만 활용가능하다.
- 메서드들이 반드시 같은 이름과 타입을 가져야한다.
- 리턴타입은 반드시 동일해야한다.
- 메서드에 dynamic binding이 활용된다.
- Private/Final 메서드에 적용할 수 없다.
- 활용시 메서드의 인자들이 같아야한다.
참조:
(1) https://pixabay.com/photos/scrap-iron-waste-junk-scrap-404081/
(2) https://www.geeksforgeeks.org/difference-between-method-overloading-and-method-overriding-in-java/