함수 정의, 매개변수, 반환값
func greet(name: String) -> String { return "Hello, \(name)!" } let result = greet(name: "James") print(result) // Hello, James! - func 키워드로 정의
- 매개변수: name: String
- 반환값: -> String
외부/내부 매개변수 이름
Swift는 매개변수에 두 개의 이름을 붙일 수 있다.
- 외부 이름: 함수 호출할 때 사용
- 내부 이름: 함수 정의 안에서 사용
func greet(to name: String, from sender: String) -> String { return "Hello, \(name), from \(sender)" } greet(to: "James", from: "Alice") - to/from -> 외부 이름
- name/sender -> 내부 이름
만약 외부 이름을 쓰고 싶지 않으면 _ 사용
func greet(_ name: String) { print("Hello \(name)") } greet("James") // 외부 이름 필요 없음 기본값, 가변 매개변수, inout
- 기본값
func greet(name: String = "Guest") { print("Hello \(name)") } greet() // Hello Guest greet(name: "GO") // Hello Go - 가변 매개변수 (...)
func sum(_ numbers: Int...) -> Int { return numbers.reduce(0, +) } print(sum(1, 2, 3, 4)) //10 - numbers는 [Int] 배열로 들어옴.
- inout(값 변경 허용)
func addOne(to number: inout Int) { number += 1 } var x = 10 addOne(to: &x) print(x) // - inout은 함수 안에서 매개변수를 직접 수정할 수 있게 함.
- 단, 상수(let)이나 리터럴은 못 넘김
📝 함수 연습문제
1. 외부/내부 매개변수
👉 사람 이름과 나이를 받아서 "James is 30 years old" 형태의 문자열을 반환하는 함수 introduce를 만들어라.
- 함수 호출 시에는 introduce(person: "James", age: 30) 처럼 읽히도록 작성할 것.
func introduce(person name: String, age: Int) -> String { return "\(name) is \(age) years old" } print(introduce(person: "James", age: 30)) 2. 가변 매개변수
👉 여러 개의 문자열을 받아서 모두 이어붙인 하나의 문자열을 반환하는 함수 combineWords를 만들어라.
- 예: combineWords("I", "love", "Swift") → "I love Swift"
func comebineWords(words: String...) -> String { return words. 아 모르겠다. ㅠ } print(combineWords("I", "love", "Swift")) - 연습문제를 풀어보니 모르는 개념이 나온다.
- 가변 매개변수(String...)를 쓰면 함수 안에서는 배열처럼 다뤄야 한다. 그래서 words는 [String] 타입이다. 배열을 문자열로 합치려면 .joined() 메서드를 쓰자.
func comebineWords(words: String...) -> String { return words.joined(separator: " ") } print(combineWords("I", "love", "Swift")) 3. inout
👉 정수 하나를 받아서 제곱값으로 바꾸는 함수 square를 만들어라.
- 예: var num = 5 → square(&num) 실행 후 num == 25
func square(to number: inout Int) { return number * number } var num = 5 square(&num) - 잘 시도했지만 두 가지 수정 포인트가 있다.
- inout 매개변수는 함수 안에서 직접 값 변경을 해줘야 한다.
- return으로 값을 내보내면 안됨.
- number을 수정해야 하고, 반환 타입은 Void(생략)이어야 한다.
func square(_ number: inout Int) { number = number * number } var num = 5 square(&num) - inout을 쓰면 함수 안에서 매개변수를 참조로 받아옴.
- 그래서 함수 안에서 number = number * number 해주면 실제 num이 바뀜
- 함수 호출할 때 &num처럼 & 붙여야 하는 것도 참조로 넘긴다는 뜻.