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

2024. 4. 6. 17:27swift

 

객체지향 프로그래밍을 하다 보면 흔히 오버로딩(Overloading)과 오버라이딩(Overriding)이라는 단어를 들어볼 것이다.

 

오버로딩과 오버라이딩은 객체지향 프로그래밍에서 중요한 개념이며, 다형성(polymorphism) 구현하는 사용된다.

 

그러나 이 둘은 명확한 차이점이 있다.

 

 

 

먼저 오버로딩(Overloading)에 대해서 알아보자.

 

오버로딩이란 같은 이름의 메서드를 여러개 정의하는 것을 말한다.

 

같은 이름의 메서드를 2개이상 정의하면 에러가 나는데 어떻게 여러개 정의할 수 있다고 하는걸까? 이 오버로딩에서의 중요한 점은 메서드의 이름은 같지만, 매개변수의 갯수나 형식이 다른경우에 사용할 수 있다는 것이다.

 

참고로 리턴값만 다르면 오버로딩 되지 않는다.

 

개발자가 오버로딩을 통해 같은 이름의 메서드를 여러개 정의해 놓고 원하는 메서드의 매개변수 갯수나 형식을 맞춰 호출하면 컴파일러가 메서드 호출 인자의 개수와 형식을 보고 어떤 메서드를 호출할지 결정하는 원리이다.

 

아래 예시를 살펴보자.

 

class Calculator {
    func add(_ a: Int, _ b: Int) -> Int {
        return a + b
    }
    
    func add(_ a: Double, _ b: Double) -> Double {
        return a + b
    }
}

let calc = Calculator()
print(calc.add(3, 4))      // Int 타입의 add 메서드 호출
print(calc.add(3.5, 4.5))  // Double 타입의 add 메서드 호출

 

위의 예제에서는 Calculator 클래스에 add 메서드를 정의했다. 하나는 Int 타입의 매개변수를 받고, 다른 하나는 Double 타입의 매개변수를 받는다. 이러한 오버로딩을 통해 메서드를 여러 매개변수 형식에 대해 다양하게 사용할 있다.

 

 

 

다음은 오버라이딩(Overriding)에 대해 알아보자.

 

오버라이딩은 상위 클래스(부모 클래스) 정의된 메서드를 하위 클래스(자식 클래스)에서 재정의 하는 것을 의미한다.

 

위 오버로딩과의 차이점은 상위 클래스의 메서드 이름, 매개변수 형식, 반환 형식과 동일해야 하고 상속 관계에서 발생한다는 것이다.

 

아래 예시를 살펴보자.

 

class Animal {
    func sound() {
        print("울음소리")
    }
}

class Dog: Animal {
    override func sound() {
        print("멍멍!")
    }
}

let animal = Animal()
let dog = Dog()

animal.sound()  // Animal 클래스의 sound 메서드 호출
dog.sound()     // Dog 클래스에서 오버라이딩한 sound 메서드 호출

 

 

위의 예제에서는 Animal 클래스의 sound 메서드를 Dog 클래스에서 오버라이딩했다.

 

Animal 객체에서 sound 메서드를 호출하면 "울음소리"가 출력되지만, Dog 객체에서 sound 메서드를 호출하면 "멍멍!"이 출력되게 된다.