본문 바로가기
  • 개발하는 곰돌이
Programming Language/Common

오버로딩(Overloading) vs 오버라이딩(Overriding)

by 개발하는 곰돌이 2022. 12. 13.

개요

Java와 Kotlin에서는 다형성을 위해 메소드의 오버로딩과 오버라이딩이 가능하다. 이 두 개념은 전혀 다른 개념이지만 용어가 비슷하기 때문에 잘 구분하는 것이 좋다.

  • 오버로딩(Overloading) : 메소드의 파라미터 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러 개 작성하는 방법
  • 오버라이딩(Overriding) : 부모 클래스의 메소드를 자식 클래스에서 재정의 또는 구현하여 사용하는 방법

메소드의 오버로딩

오버로딩(Overloading). 단어 의미 그대로 해석하자면 과적재라는 뜻이다. 쉽게 생각하면 원래 하나의 메소드는 하나의 기능을 수행해야 하지만 파라미터의 개수나 타입만 다르고 수행하는 동작이 비슷할 경우에는 이 메소드의 이름을 그대로 사용하여 여러 파라미터에 대한 동작이 과적재되었다고 볼 수 있다. 그림으로 비유하면 다음과 같이 메소드 A에 파라미터가 2개일 때의 동작과 파라미터가 3개일 때의 동작이 과적재된 셈이다.

예를 들어 문자열이 2개가 파라미터로 들어오면 두 문자열을 개행으로 연결하여 반환하고 정수 2개가 파라미터로 들어오면 두 정수를 합한 값을 반환하는 메소드가 있다고 하자. 이 메소드를 코드로 나타내면 다음과 같다.

fun main() {
    println(addTwoElements("안녕하세요", "반갑습니다"))
    println(addTwoElements(111, 222))
}

fun addTwoElements(str1: String, str2: String) = """
    $str1
    $str2
""".trimIndent()

fun addTwoElements(num1: Int, num2: Int) = num1 + num2

/*
안녕하세요
반갑습니다
333
*/

메소드의 오버라이딩

오버라이딩(Overriding). 단어 의미 그대로 해석하면 최우선시 되는 것이라는 뜻이다. 이것도 단어 그대로 생각해보면 자식 클래스에서 오버라이딩한 메소드가 부모 클래스의 기존 메소드보다 우선시 되어 호출된다고 보면 된다. 오버로딩과의 차이는 오버라이딩을 위해서는 반드시 부모 클래스가 존재해야하며, 부모 클래스의 메소드만 오버라이딩이 가능하다. 조금 더 쉽게 설명하면 개요에서 이야기한 바와 같이 부모 클래스의 메소드를 재정의하는 것이라 보면 되는데 이 경우를 아래와 같은 그림으로 나타낼 수 있다.

부모 클래스에 A라는 메소드가 있는데, 자식 클래스에서 이를 자식 클래스만의 메소드 A로 덮어 쓴 것이라고 볼 수 있다. 오버라이딩의 예시는 다음과 같다.

fun main() {
    val animal = Animal("동물")
    val dog = Dog("멍멍이")
    animal.sound()
    dog.sound()
}

open class Animal(var name: String) {
    open fun sound() = println("동물이 소리를 냅니다.")
}

class Dog(name: String) : Animal(name) {
    override fun sound() = println("멍멍!")
}

/*
동물이 소리를 냅니다.
멍멍!
*/

부모 클래스의 객체 animal에서는 sound()를 호출했을 때 Animal 클래스의 sound()가 호출되었지만 자식 클래스의 객체 dog에서는 Dog 클래스에서 오버라이드 하여 덮어 쓴 sound()가 최우선적으로 호출되어 "멍멍!"이라는 문자열이 출력된다.


마무리

오버로딩과 오버라이딩은 전혀 다른 기법이지만 단어가 비슷하여 헷갈릴 수 있는 개념이다. 특히, 주니어 개발자 면접에서 단골 질문이기 때문에 확실하게 구분하는 것이 좋다.

댓글