본 시리즈는 아래 강의자료를 기반으로 작성되었습니다.
https://www.boostcourse.org/mo122/joinLectures/38564
오늘은 함수에 대하여 공부해보았다. Kotlin
이랑 문법이 비슷한 형태여서 훨씬 익숙하게 접근할 수 있었다. 또한 함수 호출시 파라미터 명시가 워낙 직관적이어서 상당히 세련된 느낌이 들었다. 전달인자 레이블 같은 경우 함수의 동작이 추상화된 상태에서 파라미터 각각의 대략적인 동작까지 사용자(개발자)로 하여금 훨씬 쉽고 간단하게 이해할 수 있게 해주는 것 같다.
// 함수 선언 기본 형태
func name(param1: String, param2: Int) -> String {
return "Hello, World!"
}
func sum(a: Int, b: Int) -> Int {
return a + b
}
// 반환 값 없는 경우
func name(param1: String, param2: String) -> Void {
return
}
// -> Void 생략 가능
func printMyName(name: String) {
print(name)
}
// 매개변수가 없는 함수
func maxIntegerValue() -> Int {
return Int.max
}
// 매개변수 및 반환값이 없는 함
// 가독성 해치지 않는 범위에서 한 줄 표현 가능
func bye() { print("BYE") }
sum(a: 3, b: 5) // 8
printMyName(name: "H43RO") // H43RO
maxIntegerValue() // Int 의 최댓값
bye() // BYE
→ 매개변수에 기본적으로 전달될 값을 미리 지정할 수 있음
func greeting(friend: String, me: String = "H43RO"){
print("Hello \(friend)! I'm \(me)")
}
greeting(friend: "LULU") // Hello LULU! I'm H43RO
greeting(friend: "LULU", me: "LALA") // Hello LULU! I'm LALA
→ 함수를 호출할 때 함수 사용자의 입장에서 매개변수의 역할을 좀 더 명확하게 표현
// 함수 내부에서 전달인자 사용시 매개변수 원래 이름 사용
func greeting(to friend: String, from me: String) {
print("Hello \(friend)! I'm \(me)")
}
// 함수 호출 할 때 전달인자 레이블 사용해야 함
greeting(to: "LULU", from: "LALA") // Hello LULU! I'm LALA
-> 이 경우 사용자가 매개변수의 레이블을 보고 매개변수 각각의 동작을 유추할 수 있음
→ 전달 받을 값의 개수를 알기 어려울 때 사용 (함수당 하나만 가질 수 있음)
func helloToFriends(me: String, friends: String...) -> String {
return "Hello \(friends)! I'm \(me)!"
}
print(helloToFriends(me: "H43RO", friends: "LULU", "LALA"))
// Hello ["LULU", "LALA"]! I'm H43RO!
→ 스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어라서 함수를 일급객체(일급시민)로 취급
→ 따라서 변수, 상수 등에 함수를 할당할 수 있고 매개변수로 활용할 수도 있음
// 데이터 타입으로 함수를 사용하는 경우 Void 등 반환 타입 생략이 불가능
var someFunction: (String, String) -> Void = greeting(to:from:)
someFunction("LULU", "H43RO") // Hello LULU! I'm H43RO
someFunction = greeting(friend:me:)
someFunction("LULU", "LALA") // Hello LULU! I'm LALA
// 타입이 다른 함수는 할당할 수 없음
// somefunction = helloTofriends(me:friends:) -> 가변 인자 있기 때문에 컴파일 오류 발생
func runAnother(function: (String, String) -> Void){
function("karina", "winter")
}
// Hello karina! I'm winter
runAnother(function: greeting(friend:me:))
runAnother(function: someFunction)