Apple/Swift

[iOS/Swift] 오버로딩(Overloading) 그리고 오버라이딩(Overriding)

59date 2024. 9. 3. 23:19

오버로딩(Overloading) 그리고 오버라이딩(Overriding) 두 개의 차이점을 알아보겠습니다.

 

오버로딩과 오버라이딩은 프로그래밍에서 자주 사용되는 개념으로, 비슷해 보이지만 실제로는 다릅니다.

 

오버로딩(Overloading)

먼저 오버로딩은 같은 이름을 가진 함수나 메서드를 여러 개 정의할 수 있도록 해주는 기능입니다.

 

이때 각 메서드는 매개변수의 타입이나 개수, 또는 순서가 다르면 됩니다.

 

만약

동일한 이름으로 중복 선언

func foo() {}
func foo() {} // 에러: Invalid redeclaration of 'foo'

 

당연히 에러를 나타냅니다.

Invalid redeclaration of 'foo()'

에러 메시지를 살펴보면 "함수 foo()의 잘못된 재선언" 이라는 의미입니다.

즉, foo()라는 이름을 가진 함수를 다시 사용해서(이미 정의되어 있는) 뜬 에러입니다. 

 

 

다음 코드를 살펴보면

func foo() {}
func foo(a: Int) {}
func foo(a: Int, b: String) {}

함수의 이름은 동일하지만 에러가 발생하지 않습니다.

 

위에서 설명했다시피 함수의 이름은 같아도 매개변수의 타입, 개수, 순서가 다르면 오버로딩이 가능합니다. 

 

코드를 하나씩 살펴보면 

1. func foo() {}

 • 매개변수를 받지 않는 함수입니다.

2. func foo(a: Int) {}

 • 하나의 Int 매개변수를 받는 함수입니다.

3. func foo(a: Int, b: String) {}

 • 두 개의 매개변수를 받으며, 첫 번째는 Int, 두 번째는 String 타입입니다.

 

이처럼 각각의 함수는 매개변수의 개수나, 타입이 다르기 때문에 Swift는 이 함수들을 오버로딩된 함수로 구분할 수 있게 됩니다.

 

 

오버로딩의 장점은

동일한 기능을 하는 여러 함수를 같은 이름으로 제공함으로써, 코드가 직관적이고 읽기 쉬워집니다. 함수의 이름이 일관되게 유지되기 때문에 함수 사용 시 혼동이 줄어들게 됩니다.

 

 

오버라이딩(Overriding)

오버라이딩에 관한 자세한 설명은 여기를 참고해 주시기 바랍니다.

 

 

오버라이딩은 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의하는 기능입니다.

 

자식 클래스는 부모 클래스의 메서드와 동일한 이름, 매개변수, 반환 타입을 가진 메서드를 다시 구현할 수 있습니다.

// 부모 클래스
class Parent {
    func greet() {
        print("Hi")
    }
}

//자식 클래스
class Child: Parent {
    override func greet() {
        print("Hello")
    }
}

override 키워드를 사용하여 부모 클래스를 Hi에서 Hello로 재정의 한 것을 확인할 수 있습니다. 

 

재정의 = 오버라이딩

이것이 오버라이딩 입니다.

 

정리하자면

1. 오버로딩(Overloading):

  • 범위: 함수 및 메서드의 정의에서 사용됨.

  • 조건: 같은 이름의 함수/메서드지만 매개변수의 타입, 개수, 순서가 다름.

  • 사용 목적: 하나의 함수 이름으로 다양한 입력에 대해 다른 동작을 수행하게 함.

2. 오버라이딩(Overriding):

  • 범위: 상속 관계에서 메서드의 재정의에 사용됨.

  • 조건: 부모 클래스에 있는 메서드를 자식 클래스에서 같은 이름으로 재정의함.

  • 사용 목적: 상속받은 메서드를 자식 클래스에 맞게 동작을 변경함.

 

 

오버로딩과 오버라이딩은 이름은 비슷하지만 정말 다른 개념임을 확인해 보았습니다.

 


 

잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)