일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Java
- ftz level13
- c언어
- OSI
- 정렬 알고리즘
- windosw 문자열
- 재귀
- 미로 탐색 알고리즘
- C
- web
- 백준
- 자료구조
- pwnable.kr
- windosws wbcs
- ftz
- SWiFT
- 두근두근 자료구조
- 암호수학
- 스택
- PHP
- System
- War Game
- HTML
- 파이썬
- level13
- Stack
- 큐
- 파일 시스템
- 시간복잡도
- LoB
- Today
- Total
나의 기록, 현진록
[Swift] 7 함수 / 함수 정의와 호출 / 매개변수 본문
스위프트 프로그래밍 3판 - 야곰 지음
7.1 함수와 메서드
함수와 메서드는 기본적으로 같다. 다만 상황이나 위치에 따라 다른 용어로 부르는 것뿐이다.
메서드 : 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수
함수 : 모듈 전체에서 전역적으로 사용할 수 있는 함수
즉, 함수가 위치하거나 사용되는 범위 등에 따라 호칭이 달라질 뿐, 함수라는 것 자체에는 변함이 없다.
swift의 기본적인 함수 형태이다.
func 함수이름(매개변수...) -> 반환타입{
실행구문
return 반환값
}
func hello(name: String) -> String{
return "Hello \(name)"
}
let helloJenny: String = hello(name: "Jenny")
print(helloJenny)
print(hello(name: "Jenny"))
7.2.2 매개변수
매개변수 이름과 전달인자 레이블
함수를 정의할 때 매개변수 이름과 전달인자 레이블을 지정해줄 수 있습니다. 이는 함수 내부 외부에서 그 활용을 더 높일 수 있습니다. 전달인자 레이블을 사용하려면 함수 정의에서 매개변수 이름 앞에 한 칸을 띄운 후 전달인자 레이블을 지정합니다.
func 함수이름(전달인자레이블 매개변수이름: 매개변수타입) -> 반환타입{
실행구문
return 반환 값
}
func sayHello(from myName:String, to name:String) -> String{
return "Hello \(name)! I'm \(myName)"
}
print(sayHello(from: "hyunjin", to: "jenny"))
전달인자 레이블은 함수 외부에서 사용하는 것이다.
매개변수는 함수 내부에서 사용하는 것이다.
C언어나 JAVA 같은 기존 언어처럼 전달인자 레이블을 사용하고 싶지 않다면 와일드카드 식별자를 사용하면 된다.
func sayHello(_ myName:String, _ name:String) -> String{
return "Hello \(name)! I'm \(myName)"
}
print(sayHello("hyunjin", "jenny"))
매개변수 기본 값
swift 함수에서는 매개변수마다 기본 값을 지정할 수 있습니다.
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))
가변 매개변수와 입출력 매개변수
매개변수로 몇 개의 값이 들어올지 모를 때, 가변 매개변수를 사용할 수 있습니다. 가변 매개변수는 0개 이상(0개 포함)의 값을 받아올 수 있으며, 가변 매개변수로 들어온 인자 값은 배열처럼 사용할 수 있습니다. 함수마다 가변 매개변수는 하나만 가질 수 있습니다.
func sayHelloToFriends(me: String, friends names: String...) -> String{
var result: String = ""
for friend in names{
result += "Hello \(friend)!" + " "
}
result += "I'm "+me+"!"
return result
}
print(sayHelloToFriends(me: "hyunjin", friends: "Johansson", "Jay", "Wizplan"))
print(sayHelloToFriends(me: "hyunjin"))
함수의 전달인자로 값을 전달할 때는 보통 값을 복사해서 전달합니다. 값이 아닌 참조를 전달하려면 입출력 매개변수를 사용합니다. 값 타입 데이터의 참조를 전달인자로 보내면 함수 내부에서 참조하여 원래 값을 변경합니다. C언어의 포인터와 유사합니다. 하지만 이 방법은 함수 외부의 값에 어떤 영향을 줄지 모르기 때문에 함수형 프로그래밍 패러다임에서는 지양하는 패턴입니다. 물론 객체지향 프로그래밍 패러다임에서는 종종 사용됩니다. 애플의 프레임워크(IOS, macOS) 에서는 객체지향 프로그래밍 패러다임을 사용하므로 유용할 수 있지만, 애플 프레임워크를 벗어난 다른 환경에서 함수형 프로그래밍 패러다밍르 사용할 때는 입출력 매개변수를 사용하지 않는 것이 좋습니다.
입출력 매개변수의 전달 순서는 다음과 같습니다.
1. 함수를 호출할 때, 전달인자의 값을 복사합니다.
2. 해당 전달인자의 값을 변경하면 1에서 복사한 것을 함수 내부에서 변경합니다.
3. 함수를 반환하는 시점에서 2에서 변경된 값을 원래의 매개변수에 할당합니다.
var numbers: [Int] = [1, 2, 3]
func nonReferenceParameter(_ arr: [Int]){
var copiedArr: [Int] = arr
copiedArr[1] = 1
}
func referenceParameter(_ arr: inout [Int]){
arr[1] = 1
}
nonReferenceParameter(numbers)
print(numbers)
referenceParameter(&numbers)
print(numbers)
입출력 매개변수는 매개변수 기본값을 가질 수 없으며, 가변 매개변수로 사용될 수 없습니다. 또한 상수는 변경될 수 없으므로 입출력 매개변수의 전달인자로 사용될 수 없습니다.
입출력 매개변수는 잘 사용하면 문제 없지만 잘못 사용하면 메모리 안전을 위협하기 때문에 사용에 제약이 많습니다. 그에 대한 자세한 내용은 추후 포스팅하겠습니다.
'Programming > Swift' 카테고리의 다른 글
[Swift] 8.1 옵셔널 (0) | 2021.07.13 |
---|---|
[Swift] 7.3 중첩함수 7.4 종료되지 않은 함수 7.5 반환을 무시하는 함수 (0) | 2021.07.13 |
[Swift] 6.1.2 switch 구문 (0) | 2021.07.05 |
[Swift] 4.5.5 순환 열거형 (0) | 2021.07.02 |
[Swift] 4.5.3 연관 값 / 4.5.4 항목 순회 (0) | 2021.07.02 |