함수와 메서드

  • 함수(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 = 1

func callByValue(num: Int) {
  var iNum: Int = num
  iNum = 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 = addInt
print(mathFunc(3, 4))

// 반환값이 없을 때
func sayhello(a: String) {
  print("Hello! \(a)")
}
var hello: (String) -> Void = sayhello
hello("Lee")

//포인터처럼 사용할 수 있음
typealias FuncDataType = (Int, Int) -> Int

func function1(_ mathFunc: FuncDataType, _a: Int, _ b: Int) {
  print(mathFunc(a, b))
}

func function2(_ addCal: Bool) -> FuncDataType {
  return ~값~
}

중첩함수(nested function)

  • 함수 내에 함수가 구현된 함수

typealias MoveFunc = (Int) -> Int

func 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 속성을 사용한다.