함수와 메서드
- 함수(function): 여러 실행문들을 하나의 기능으로 구현한 것
- 메서드(method): 클래스 내에서 정의한 함수
둘의 형태는 동일하다.
Swift의 함수
함수 정의 및 호출
func 함수명(매개변수: 매개변수자료형, 매개변수: 매개변수자료형, ...) -> 반환값자료형 {
실행문
return 반환값
}
함수명(매개변수: 인자, 매개변수: 인자, ...) //함수 호출
- 함수 내의 코드가 한 줄인 경우 반환값 앞의 return을 생략할 수 있다.
- 반환값이 없으면 반환값자료형은 void
- 함수 호출 시 매개변수가 있다면 반드시 매개변수를 사용한다.
인자 레이블(argument label)
func 함수명(인자레이블 매개변수: 매개변수자료형, ...) ->반환값자료형 {
실행문
return 반환값
}
함수명(인자레이블: 인자, ...)
- 매개변수 앞에 사용해서 매개변수의 기능을 설명한다.
- 인자 레이블을 사용할 때는 함수를 호출할 때 반드시 매개변수 대신 인자 레이블을 사용한다.
- 인자 레이블이 와일드카드 식별자(_)인 경우 함수 호출 시 매개변수와 인자 레이블을 생략한다. -> 이때 매개변수를 사용하면 에러 발생
매개변수의 기본값
func 함수명(매개변수: 매개변수자료형=기본값, ...) -> 반환값자료형 {
실행문
return 반환값
}
함수명(...)
- 함수를 호출할 때 인자를 전달받지 못하면 기본값을 사용한다.
함수 중복정의와 재정의
- 중복정의(overloading): 함수의 이름은 같지만 매개변수의 이름, 자료형, 개수가 다른 경우. 반환값의 자료형은 같아도 되고 달라도 된다.
- 재정의(overriding): 부모 클래스 내에 있는 메서드를 자식 클래스에서 수정하여 재정의한다. 부모 클래스와 자식 클래스의 메서드의 이름, 매개변수, 반환값의 자료형은 모두 같다.
가변 매개변수(variadic parameter)
func hello(me: String, friend name: String ...) -> String(~실행문~)print(hello(me: "Kim", friend: "Lee", "Park"))
- 함수를 정의할 때 가변 매개변수로 설정할 매개변수의 자료형 뒤에 범위 연산자를 표기한다.
- 가변 매개변수에 0개 이상의 인자를 전달하면 함수에서 배열로 사용된다.
입출력 매개변수(in-out parameter)
- Call by value: 함수 호출 시 값을 전달
- Call by reference: 함수 호출 시 값의 주소를 전달(포인터)
- 입출력 매개변수는 call by reference를 구현할 때 사용된다.
- 설정할 매개변수 자료형 앞에 inout 키워드를 사용한다.
- 함수를 호출할 때 입출력 매개변수에는 값의 주소를 전달해야 하므로 값 앞에 &를 표기한다.
var number: Int = 1func callByValue(num: Int) {var iNum: Int = numiNum = 4}callByValue(num: number) // number: 1 유지됨func callByReference(num: inout Int) {num = 5}callByReference(num: &number) // number: 5 변경됨var numbers: [Int] = [1, 2, 3]func callByReference(arr: inout [Int]) {arr[0] = 5}callByReference(arr: &numbers)
반환값이 없는 함수
- 반환값 자료형을 Void로 표현하거나 생략한다.
func 함수명( ) -> Void { }
func 함수명( ) -> (Void) { }
func 함수명( ) -> ( ) { }
func 함수명( ) { }
*괄호 안의 띄어쓰기는 괄호 잘 안 보여서 띈 것.
함수의 자료형
- 함수를 변수 또는 상수처럼 사용할 수 있다.
- 매개변수 또는 인자 레이블에 넣으면 안 된다.
func addInt(numA a: Int, numB b: Int) -> Int {return a + b}var mathFunc: (Int, Int) -> Int = addIntprint(mathFunc(3, 4))// 반환값이 없을 때func sayhello(a: String) {print("Hello! \(a)")}var hello: (String) -> Void = sayhellohello("Lee")//포인터처럼 사용할 수 있음typealias FuncDataType = (Int, Int) -> Intfunc function1(_ mathFunc: FuncDataType, _a: Int, _ b: Int) {print(mathFunc(a, b))}func function2(_ addCal: Bool) -> FuncDataType {return ~값~}
중첩함수(nested function)
- 함수 내에 함수가 구현된 함수
typealias MoveFunc = (Int) -> Intfunc funcForMove(_ shouldGoLeft: Bool) -> MoveFunc {func goRight(_ currentPosition: Int) -> Int {return currentPosition + 1}func goLeft(_ currentPosition: Int) -> Int {return currentPosition - 1}return shouldGoLeft ? goLeft : goRight}
반환값 무시
@discardableResult func 함수명(~~~~) -> ~{
return ~
}
- 함수의 반환값을 사용하지 않을 경우 컴파일러가 경고를 표시한다.
- 이를 무시하기 위해 함수를 정의할 때 func 앞에 @discardableResult 속성을 사용한다.
0 댓글