English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 기사에서 함수 오버로드, 함수 오버로드가 필요한 시점 및 예제를 배울 것입니다.
파라미터가 다른 함수동일한 이름을 가진 두 개 이상의이를 오버로드 함수라고 합니다.
총격 게임을 개발하는 중이고, 플레이어가 칼, 칼, 권총을 사용하여 적을 공격할 수 있는 공격 기능을 정의할 수 있는 해결책이 있습니다:
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가 무엇인지 모르시다면 걱정 마세요. 지금은 단순히 프로그래밍에서 물리적 객체를 생성하는 것으로 생각하면 됩니다. 그렇다면 칼, 권총, 검을 생성하고 있습니다.
이 해결책의 유일한 문제는 특정 공격 작업을 호출하려면 함수 이름을 기억해야 한다는 것입니다. 마찬가지로, 레벨이 높아지면서 플레이어는 지뢰, 플라스틱爆竹, 사격총 등을 사용하여 공격할 수 있는 다른 기능을 가질 수 있습니다.
다른 이름으로 함수를 생성하는 것은 시간이 많이 걸리고, 함수 이름을 기억하여 호출하는 데 부가적인 비용이 발생합니다. 총而言之, 이는 직관적이지 않습니다.
모든 무기를 동일한 이름으로 다른 함수를 생성할 수 있다면 더 좋겠습니다. 이렇게 하면 함수 이름만 기억하면 되고, 다른 무기의 함수 이름을 기억할 필요가 없습니다.
저희가 언급한 과정은 함수 오버로드라고 합니다. 정의에 따르면, 동일한 이름을 가진 두 개 이상의 함수를 생성하여 매개변수의 수나 타입이 다른 과정을 함수 오버로드라고 합니다.
아래의 예제에서 이를 확인해보겠습니다:
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) 语句。
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) 语句。
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 두 개입니다.
매개변수 이름을 변경하여 오버로드를 시도해 보겠습니다. 매개변수 태그는 동일하게 유지됩니다. 다음과 같이 합니다:
func output(value text: String) { print(text) } func output(value num: Int) { print(num) } output(value: 2) output(value: "Hello")
위의 프로그램을 실행하면, 출력은 다음과 같습니다:
2 Hello
위의 프로그램에서 볼 수 있듯이, 오버로드된 함수에 대해 동일한 매개변수 태그를 사용할 수 있습니다. 그러나 오버로드 요구 사항에 따라 매개변수의 수나 매개변수 타입이 다를 수 있습니다.