프로그래밍 일기 — Override 와 Overload

배우는 자(Learner Of Life)
5 min readOct 10, 2023

--

뭘 Over한다는 것일까?

너무 많이 적재(overload)해서 너무 오래 탄다(override)는 의미인가? (1)

지난 번 개념들을 복습하는 과정에서 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/

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet