iOS 공부하는 감자

Day6) 함수, 파라미터, 클로저 본문

22 베이직 챌린지

Day6) 함수, 파라미터, 클로저

DongTaTo 2022. 1. 8. 22:58
반응형

함수

  • func 키워드를 사용하여 함수를 정의할 수 있다.
  • 스위프트에서의 함수는 재정의(오버라이드), 중복 정의(오버로드)를 모두 지원한다.
  • 스위프트에서 함수는 일급 객체로, 함수를 변수나 상수에 할당 가능하고 매개변수를 통해 전달도 가능하다.
  • 매개변수(=parameter) : 함수를 정의할 때 외부로부터 받아들이는 전달 값의 이름 (=parameter)
  • 전달인자(=argument) : 실제로 함수를 실행할 때 전달하는 값
  • 전달인자 레이블 : 함수 외부에서 매개변수의 역할을 좀 더 명확하게 할 수 있다.
  • func addNumber(a: Int, b: Int) -> Int {
        return a + b
    }
    
    print(addNumber(a: 3, b: 5))    // 8

 

매개변수 기본값

  • 스위프트의 함수에서는 매개변수마다 기본값을 지정할 수 있다.
  • 함수를 호출할 때 매개변수가 전달되지 않으면 기본값을 사용한다.
  • func sayHo(times: Int = 3) {
        for _ in 1...times {
            print("Ho!!")
        }
    }
    
    sayHo()  // 매개변수를 전달해주지 않아서 기본값만큼 3번 출력
    
    sayHo(times: 1)  // 매개변수로 넘겨준 숫자만큼 출력

가변 매개변수

  • 매개변수로 몇 개의 값이 들어올지 확실하지 않을 때 사용한다.
  • 가변 매개변수는 0개 이상의 값을 받아올 수 있으며 들어온 인자 값은 함수 내부에서 배열처럼 사용한다.
  • // ...키워드로 가변 매개변수임을 나타냄
    func printPresents(presents: String...) {
        for present in presents {
            print(present)
        }
    }
    
    printPresents(presents: "iMac", "iPhone", "Macbook Pro")
    //iMac
    //iPhone
    //Macbook Pro
    매개변수로 다수의 값을 받을 때 가변 매개변수와 배열 매개변수의 차이점
    기본값을 가질 수 없음 기본값을 가질 수 있음
    함수의 매개변수가 적을 때 유용 함수의 매개변수가 많을 때 유용
    배열로 저장된 다른 변수, 상수를 매개변수로 받을 수 없음  

 

입출력 매개변수

  • 함수의 전달인자로 값을 전달할 때는 일반적으로 값을 복사해서 전달한다. (상수로)
  • 값이 아닌 참조를 전달하고자 한다면 입출력 매개변수를 사용할 수 있다.
  • 값 타입 데이터의 참조를 전달인자로 전달하면 함수 내부에서 해당 값을 참조하여 직접 값을 변경할 수 있다.
  • 입출력 매개변수의 전달 순서
    1. 함수를 호출할 때 전달인자의 값을 복사
    2. 해당 전달인자의 값을 변경하면 1에서 복사한 것을 함수 내부에서 변경
    3. 함수를 반환하는 시점에 2에서 변경된 값을 원래의 매개변수에 할당
  • 입출력 매개변수로 설정할 매개변수의 타입 앞에 inout 키워드를 추가해서 표현
  • var someInt: Int = 0
    
    print(someInt)          // 0
    
    func addFive(number: inout Int) {
        number += 5
    }
    
    addFive(number: &someInt)
    print(someInt)          // 5

 

 

 

 


 

클로저

  • 일정 기능을 수행하는 코드를 하나의 블록으로 모아놓은 것이다.
  • 위에서 설명한 함수는 클로저의 한 형태 (Named Closure)
  • 일반적으로 클로저라고 부르는 형태는 익명 함수(Unnamed Closure)를 의미한다.
  • 함수와 마찬가지로 일급 객체이다.
  • 클로저(익명함수)에서는 전달인자(Argument Label)를 사용하지 않는다.
  • // 익명함수이므로 func 키워드를 사용하지 않는다.
    { (Parameter) -> ReturnType in
        실행구문
    }

 

후행 클로저

  • 함수나 메서드의 마지막 매개변수가 클로저일 때 클로저 문법을 함수 뒤에 붙여서 작성하는 방법
  • 후행클로저를 사용하면 전달인자는 생략된다.
  •  
  • let someIntArray: [Int] = [1, 2, 3, 4, 5, 6] let reversed: [Int] = someIntArray.sorted() { (first: Int, second: Int) -> Bool in return first > second } print(reversed) // [6, 5, 4, 3, 2, 1]

 

클로저 표현 간소화

  • 함수나 메서드의 전달인자로 전달되는 클로저는 메서드에서 요구하는 형태로 전달해야 한다. ex) (Int, Int) -> Bool ..
  • 전달인자로 전달할 클로저는 이미 적합한 타입을 준수하고 있다고 유추할 수 있다.
  • 따라서 전달인자로 전달하는 클로저는 매개변수의 타입이나 반환값의 타입을 명시하지 않고 생략할 수 있다.
  • 단축 인자이름 : 클로저의 매개변수 이름이 굳이 필요하지 않다면 단축 인자이름을 사용 가능하다. ($0, $1....)
  • // a, b라는 정수형과 (Int, Int) -> Int 형태를 가지는 클로저를 매개변수로 받는 함수
    func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
        return method(a, b)
    }
    
    // 클로저 문법을 작성할 때 (Int, Int) -> Int in 부분이 생략되었다.
    var result: Int = calculate(a: 3, b: 3, method: {
        return $0 + $1
    })
    
    print(result)  // 6
  • 암시적 반환 표현 : 클로저에 반환값이 있고, 클로저의 내부 구문이 단일 리턴문인 경우 return 키워드를 생략 가능하다.
  • 위 코드에서 return 키워드를 생략해도 잘 작동한다.
  • // a, b라는 정수형과 (Int, Int) -> Int 형태를 가지는 클로저를 매개변수로 받는 함수
    func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
        return method(a, b)
    }
    
    // 클로저 문법을 작성할 때 (Int, Int) -> Int in 부분이 생략되었다.
    var result: Int = calculate(a: 3, b: 3, method: {
        $0 + $1
    })
    
    print(result)  // 6

 

 

 

반응형