1 분 소요

Overriding and Overloading

둘이 서로 비슷한 이름과 다형성을 높여주며, 객체지향 프로그래밍에서 중요한 개념이다. 또한 공통점을 보자면 같은 이름의 다른 함수를 호출한다는 점인데, 정확히 보면 그 원리와 목적이 서로 다르다. 이에 대한 내용은 아래에 설명 할 예정이다.

오버라이딩(Overriding)란?

오버라이딩은 상속 받은 메소드를 자식 클래스가 재정의 하여 사용하는 것을 의미한다. 즉, 자식 클래스에서 부모 클래스의 메소드를 다시 구현하여 자식 클래스에서 해당 메소드를 호출하면, 자식 클래스에서 구현한 메소드가 실행된다. 예를들어, 부모 클래스에서 ‘getArea()’메소드를 정의했다면, 자식 클래스에서 ‘getArea()’메소드를 재정의할 수 있다.

오버로딩(Overloading)란?

오버로딩은 같은 이름의 메소드를 여러 개 정의하는 것을 의미한다. 이때 메소드의 매개변수의 개수나 타입이 다르면, 각각의 메소드는 서로 다른 시그니처(signature) 를 가지게 된다. 예를들어, ‘sum()’ 메소드를 정의할 때 ‘sum(a: int, b: int)’와 ‘sum(a: int, b: int, C: int)’ 두 가지 시그니처를 가지는 메소드를 모두 정의할 수 있다.

Overriding vs Overloading

오버라이딩과 오버로딩의 차이점을 간단하게 보자면 크게 아래 4가지와 같이 나눌 수 있다.

  1. 메소드가 정의되는 위치
    • 오버라이딩
      • 하위 클래스에서 상위 클래스의 메소드를 재정의 하는 것입니다. 따라서 메소드의 정의 위치는 상위 클래스에 있습니다.
    • 오버로딩
      • 하나의 클래스 안에서 같은 이름의 메소드를 여러 개 정의하는 것입니다.
  2. 리턴 타입
    • 둘 다 메소드 이름 동일
    • 오버라이딩
      • 부모 클래스와 자식 클래스에서 메소드의 이름, 매개변수의 타입, 갯수, 순서 등의 시그니처가 모두 같아야 한다. 또한 자식 클래스에서 오버라이딩된 메소드의 리턴 타입은 부모 클래스의 메소드와 동일하거나 부모 클래스의 메소드에서 리턴 타입의 서브타입 이어야 한다. 이것은 서브타입의 다형성을 보장하기 위한 것이기 때문이다.
    • 오버로딩
      • 같은 이름의 메소드를 여러 개 정의할 때, 메소드의 매개변수의 타입, 갯수, 순서 등이 서로 다른 시그니처를 가지게 된다. 이때 메소드의 리턴 타입은 같거나 달라도 상관이 없다.
  3. 접근 범위
    • 오버라이딩
      • 자식 클래스에서 재정의된 메소드의 접근 범위는 부모 클래스의 메소드의 접근 범위보다 같거나 넓어야 한다. 즉, 자식 클래스에서 부모 클래스의 private 메소드를 재정의할 수 없다.
    • 오버로딩
      • 메소드의 접근 제어자와 상관없이 정의할 수 있다.
  4. 예외 처리
    • 오버라이딩
      • 자식 클래스에서 재정의된 메소드가 발생시키는 예외 클래스는 부모 클래스의 메소드가 발생시키는 예외 클래스의 서브 클래스 이거나 같아야 한다. 즉, 자식 클래스에서 발생시키는 예외 클래스의 범위가 부모 클래스에서 발생시키는 예외 클래스의 범위보다 좁을 수 없다.
    • 오버로딩
      • 예외처리와 상관 없다.

참고 사이트

  • 오버라이딩 - https://docs.oracle.com/javase/tutorial/java/IandI/override.html

업데이트: