[Swift] 함수
참조 : Swift 스위프트 프로그래밍 3판 Swift 5, 저자 야곰 (한빛미디어) , The Swift Programming Language Swift 5.6 Edition (iBooks)(https://books.apple.com/kr/book/the-swift-programming-language-swift-5-6/id881256329)
함수와 메서드
- 함수와 메서드는 기본적으로 같음, 상황이나 위치에 따라 다른 용어로 지칭되는 것
- 메서드 : 구조체, 클래스, 열거형 등 특정 타입에 연관되어 사용하는 함수
- 함수 : 모듈 전체에서 전역적으로 사용할 수 있는 함수
- 함수에서 소괄호(()) 생략 불가
- 재정의(override)와 중복 정의(overload) 모두 지원
기본적인 함수의 정의와 호출
- 함수의 이름과 매개변수(Parameter), 반환 타입(Return Type)등을 사용하여 함수 정의
- 함수를 정의하는 키워드 func, 함수 이름 지정후 매개변수는 소괄호로 감싸줌
- 반환 타입을 명시하기 전에는 ->를 사용하여 어떤타입이 반환될 것인지 명시, 반환하는 키워드는 return
- 함수 내부의 코드가 단 한 줄의 표현이고 그 표현의 결괏값의 타입이 함수 반환 타입과 같으면 return 키워드 생략 가능
func 함수 이름 (매개변수 ...) -> 반환 타입 {
실행구문
return 반환 값
}
매개변수(Parameter)
- 매개변수(Parameter) : 함수를 정의할 때 외부로 받아들이는 전달 값의 이름
- 함수에서 매개변수가 필요 없다면 매개변수 위치 공란
- 매개변수가 여러 개 필요한 함수를 정의할 때는 쉼표로 매개변수 구분
- 함수 호출 시에는 매개변수 이름을 붙여주고 콜론(:)을 적어준 후 전달인자를 보내줌
※ 키워드는 매개변수 이름으로 사용 불가
- 매개변수 마다 기본값을 지정 가능
- 기본값이 없는 매개변수를 기본값이 있는 매개변수 앞에 사용
→ 기본값이 없는 매개변수는 대체로 함수를 사용할 때 중요한 값을 전달할 가능성 높음
- 매개변수가 여러 개인 함수
func sayHello(myName: String, yourName: String)-> String {
return "Hello \(yourName)! I`m \(myName)"
}
print(sayHello(myName: "kim", yourName: "Jisoo")) // Hello Jisoo! I`m Kim
전달인자 레이블(Argument Label)
- 전달인자 레이블(인자) : 함수를 실제로 호출할 때 전달하는 값을 의미
- 매개변수 이름과 함께 전달인자 레이블을 지정 가능
- 전달인자 레이블을 별도로 선언 → 함수 외부에서 매개변수의 역할을 좀 더 명확히 함
- 전달인자 레이블을 변경하면 함수의 이름 자체가 변경됨
- 전달인자 레이블은 함수 타입의 구성요소가 아니므로 함수 타입을 작성할 때는 전달인자 레이블 사용 불가
- 전달인자 레이블을 사용하고 싶지 않으면, 와일드카드 식별자(_) 사용 가능
func 함수 이름 (전달인자 레이블 매개변수 이름: 매개변수 타입, 전달인자 레이블 매개변수 이름:
매개변수 타입...) -> 반환타입 {
실행구문
return 반환 값
}
가변 매개변수와 입출력 매개변수
- 매개변수로 몇 개의 값이 들어올지 모를 때, 가변 매개변수 사용
- 가변 매개변수는 0개 이상의 값을 받아올 수 있으며, 가변 매개변수로 들어온 인자 값은 배열처럼 사용 가능
- 함수마다 가변 매개변수는 하나만 사용 가능
- 함수의 전달인자로 값을 보통 복사해서 전달하지만, 값이 아닌 참조를 전달하려면 입출력 매개변수를 사용
- C언어의 포인터와 유사
- 입출력 매개변수를 사용할 때는 함수 외부의 값에 어떤 영향을 줄지 모르기 때문에 함수형 프로그래밍 패러다임에서는 지양
- 입출력 매개변수의 전달 순서
- 함수를 호출할 때, 전달인자의 값을 복사
- 해당 전달인자의 값을 변경하면 1에서 복사한 것을 함수 내부에서 변경
- 함수를 반환하는 시점에 2에서 변경된 값을 원래의 매개변수에 할당
- 참조는 inout 매개변수로 전달될 변수 또는 상수 앞에서 앰퍼샌드(&)를 붙여 표현
- 입출력 매개변수는 매개변수의 기본값을 가질 수 없고, 가변 매개변수로 사용 불가
- 상수는 변경이 불가하므로 입출력 매개변수의 전달인자로 사용 불가
반환이 없는 함수
- 반환 값이 없는 함수는 '없음'을 의미하는 Void로 표기하거나 생략
※ Void키워드는 빈 소괄호의 묶음으로 표현 가능
- (Void) -> Void
- () -> Void
- () -> ()
데이터 타입으로서의 함수
- 각 함수는 매개변수 타입과 반환 타입으로 구성된 하나의 타입으로 정의 가능
(매개변수 타입의 나열) -> 반환 타입
중첩 함수
- 스위프트는 데이터 타입의 중첩이 자유로움
- 특별한 위치에 속해 있지 않는 한 모든 함수는 전역함수
- 전역함수가 많은 큰 프로젝트에서 전역으로 사용이 불필요한 함수들의 사용범위를 조금 더 명확하고 깔끔하게 표현
종료되지 않는 함수
- return 되지 않는 함수
- 정상적으로 끝나지 않는 함수 → 비 반환 함수(Nonreturning function), 비반환 매서드(Nonreturning method)
- 어디서든 호출 가능하고, guard 구문의 else 블록에서도 호출 가능
- 반환 타입을 Never로 명시
반환 값을 무시하는 함수
- @discardableResult 선언 속성 사용
'iOS > Swift' 카테고리의 다른 글
[Swift] 모나드 (0) | 2022.09.16 |
---|---|
[Swift] 옵셔널(Optional) (0) | 2022.09.15 |
[Swift] 연산자 (0) | 2022.09.14 |
[Swift] 맵, 필터, 리듀스 (0) | 2022.09.14 |
[Swift] regular expression (0) | 2022.09.07 |