오버로딩(Overloading) 과 오버라이드(Override)
스위프트의 함수는 재정의(오버라이드)와 중복 정의(오버로드)를 모두 지원한다.
매개변수의 타입이 다르면 같은 이름의 함수를 여러 개 만들 수 있고, 매개변수의 개수가 달라도 같은 이름의 함수를 만들 수 있다.
오버 로딩
매개변수의 타입이 다른 경우, 매개변수의 개수가 다른 경우, 매개변수의 레이블이 다른 경우. 다른 함수로 간주된다.

func printNumber(number: Int) {
print("Int: \(number)")
}
func printNumber(number: Double) {
print("Double: \(number)")
}
func printNumber(number: Int, extra: String) {
print("Int: \(number), Extra: \(extra)")
}
// 이러한 함수들은 모두 오버로딩되어 있으며, 호출 시 매개변수의 타입과 개수에 따라 적절한 함수가 실행됩니다.
printNumber(number: 5) // Int: 5
printNumber(number: 3.14) // Double: 3.14
printNumber(number: 10, extra: "USD") // Int: 10, Extra: USD
func printNumber(number: Int) {
}
오버 라이딩
함수 오버라이딩(overriding)은 클래스의 상속 구조에서 사용된다. 서브 클래스에서 슈퍼클래스의 메서드를 재정의하여 사용할 수 있다.
class Animal {
func makeSound() {
print("animal sound")
}
}
class Dog: Animal {
override func makeSound() {
print("bark")
}
}
let myDog = Dog()
myDog.makeSound() // "bark", 서브클래스에서 오버라이드한 메서드가 호출됨
함수 정의 및 호출 방법
스위프트에서 함수는 함수의 이름과 매개변수, 반환 타입 등을 사용하여 정의한다.
func 함수 이름(매개 변수 ...) -> 반환 타입 {
실행 구문 ...
return 반환 값
}
// 기본 형태의 함수 정의와 사용
func hello(name: String) -> String {
return "Hello \(name)!"
}
let helloJenny: String = hello(name: "Jenny")
print(helloJenny) // Hello Jenny!
위 코드에서는 매개변수의 이름(Parameter Name) 으로 'name' 을 사용했다.
매개변수 이름과 더불어 전달인자 레이블(Argument Label)을 지정할 수도 있다. 매개변수의 역할을 좀 더 명확히 하기 위해 사용한다.
func sayHello(from myName:String, to name:String) -> String {
return "Hello \(name)! I'm \(myName)"
}
print(sayHello(from: "iyungui", to: "Jenny")) // Hello Jenny! I'm iyungui
함수 내부에서 전달인자 레이블 사용 불가, 함수 호출 시 매개변수 이름 사용 불가한 것을 알 수 있음
전달인자 레이블을 사용하고 싶지 않은 경우, 와일드카드 식별자 사용
func sayHello(_ name: String, _ times: Int) -> String {
var result: String = ""
for _ in 0..<times {
result += "Hello \(name)!" + " "
}
return result
}
print(sayHello("Chope", 2)) // Hello Chope! Hello Chope!
또한, 전달인자 레이블만 변경해도 함수 중복 정의(오버로드)로 동작이 가능하다.
매개변수마다 기본값을 지정할 수도 있다. 매개변수가 전달되지 않으면 기본값을 사용하는 방식이다.
func sayHello(_ name: String, times: Int = 3) -> String {
var result: String = ""
for _ in 0..<times {
result += "Hello \(name)!" + " "
}
return result
}
print(sayHello("Hana"))
print(sayHello("Joe", times: 2))
이 때, 기본값이 없는 매개변수가 먼저 나오고 그 다음 기본값이 있는 매개변수를 사용한다.
또한 기본값이 있는지와 상관 없이 중요한 매개변수는 앞쪽에 배치하는 것이 일반적이다.
가변 매개변수와 입출력 매개변수
---