English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift 함수 오버로드

이 기사에서 함수 오버로드, 함수 오버로드가 필요한 시점 및 예제를 배울 것입니다.

파라미터가 다른 함수동일한 이름을 가진 두 개 이상의이를 오버로드 함수라고 합니다.

함수 오버로드가 필요한 이유는 무엇인가요?

총격 게임을 개발하는 중이고, 플레이어가 칼, 칼, 권총을 사용하여 적을 공격할 수 있는 공격 기능을 정의할 수 있는 해결책이 있습니다:

func attack() {
    //..
    print("칼로 공격")
}
func attack() {
    //..
    print("用剑攻击")
}
func attack() {
    //..
    print("용기로 공격")
}

하지만, 위의 프로그램을 실행하려고 할 때, Swift에서 컴파일 시간 오류를 받게 됩니다. 'attack()' 이전에 선언되었습니다하지만, 다른 해결책은 특정 기능을 위해 다른 함수 이름을 정의하는 것일 수 있습니다. 예를 들어:

struct Knife {
}
struct Gun {
}
struct Blade {
}
func attackUsingKnife(weapon: Knife) {
    //..
    print("칼로 공격")
}
func attackUsingBlade(weapon: Blade) {
    //..
    print("用剑攻击")
}
func attackUsingGun(weapon: Gun) {
    //..
    print("용기로 공격")
}

struct가 무엇인지 모르시다면 걱정 마세요. 지금은 단순히 프로그래밍에서 물리적 객체를 생성하는 것으로 생각하면 됩니다. 그렇다면 칼, 권총, 검을 생성하고 있습니다.

이 해결책의 유일한 문제는 특정 공격 작업을 호출하려면 함수 이름을 기억해야 한다는 것입니다. 마찬가지로, 레벨이 높아지면서 플레이어는 지뢰, 플라스틱爆竹, 사격총 등을 사용하여 공격할 수 있는 다른 기능을 가질 수 있습니다.

다른 이름으로 함수를 생성하는 것은 시간이 많이 걸리고, 함수 이름을 기억하여 호출하는 데 부가적인 비용이 발생합니다. 총而言之, 이는 직관적이지 않습니다.

모든 무기를 동일한 이름으로 다른 함수를 생성할 수 있다면 더 좋겠습니다. 이렇게 하면 함수 이름만 기억하면 되고, 다른 무기의 함수 이름을 기억할 필요가 없습니다.

함수 오버로드는 무엇인가요?

저희가 언급한 과정은 함수 오버로드라고 합니다. 정의에 따르면, 동일한 이름을 가진 두 개 이상의 함수를 생성하여 매개변수의 수나 타입이 다른 과정을 함수 오버로드라고 합니다.

아래의 예제에서 이를 확인해보겠습니다:

예제1함수 오버로드

struct Knife {
}
struct Gun {
}
struct Blade {
}
func attack(with weapon: Knife) {
    print("칼로 공격")
}
func attack(with weapon: Gun) {
    print("용기로 공격")
}
func attack(with weapon: Blade) {
    print("用剑攻击")
}
attack(with: Gun())
attack(with: Blade())
attack(with: Knife())

위의 프로그램을 실행하면, 출력은 다음과 같습니다:

用枪攻击
用剑攻击
用刀攻击

在以上程序中,我们创建了三个具有相同名称的不同函数attack。但是,它接受不同的参数类型。这样,记住 attack 名称即可调用函数。

  • 调用 attack(with: Gun()) 将触发函数内部的  func attack(with weapon:Gun) 语句。

  • 调用 attack(with: Blade()) 将触发函数内部的  func attack(with weapon:Blade) 语句。

  • 调用 attack(with: Knife()) 将触发函数内部的 func attack(with weapon:Knife)  语句。

예제2:기본적인 파라미터 타입의 함수 오버로드

func output(x: Int) {
    print("int值是 \(x)")
}
func output(x: String) {
    print("字符串值是 \(x)")
}
output(x: 2)
output(x: "Swift")

위의 프로그램을 실행하면, 출력은 다음과 같습니다:

int值是 2
字符串值是 Swift

在上面的程序中,我们有两个具有相同名称和相同数量参数的函数output()。但是,第一个output()函数将整数作为参数,第二个output()函数将String参数作为参数。

与示例1类似,

  • 调用 output(x: 2) 会触发函数内部的 func output(x:Int) 语句

  • 调用 output(x: "Swift") 会触发函数内部的 func output(x:String) 语句。

예제3:기본적인 수량 파라미터의 함수 오버로드

func output() {
    print("Good Morning!")
}
func output(text: String) {
    print(text)
}
func output(text: String, num: Int) {
    print("(text)(num)!")
}
output()
output(text: "Good Evening!")
output(text1: "Good N", num: 8)

위의 프로그램을 실행하면, 출력은 다음과 같습니다:

Good Morning!
Good Evening!
좋은 밤 되세요!

위의 프로그램에서 함수 output()는 매개변수 수에 따라 오버로드되었습니다.

첫 번째 output() 매개변수가 없으며, 두 번째 output() 매개변수는 String, 세 번째 output() 매개변수는 String과 Int 두 개입니다.

매개변수 이름을 변경하여 오버로드를 시도해 보겠습니다. 매개변수 태그는 동일하게 유지됩니다. 다음과 같이 합니다:

예제4같은 매개변수 태그를 가진 함수 오버로드

func output(value text: String) {
    print(text)
}
func output(value num: Int) {
    print(num)
}
output(value: 2)
output(value: "Hello")

위의 프로그램을 실행하면, 출력은 다음과 같습니다:

2
Hello

위의 프로그램에서 볼 수 있듯이, 오버로드된 함수에 대해 동일한 매개변수 태그를 사용할 수 있습니다. 그러나 오버로드 요구 사항에 따라 매개변수의 수나 매개변수 타입이 다를 수 있습니다.