관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 함수 대신 closure를 사용하여 간결한 코드 유지하기 본문

iOS 응용 (swift)

[iOS - swift] 함수 대신 closure를 사용하여 간결한 코드 유지하기

jake-kim 2023. 10. 22. 01:06

함수로 정의 vs  closure로 정의

  • 보통 코드를 작성하다가 중복 작업이 있을 때나 로직이 여러개가 들어갈 때, 하나의 일은 하나의 함수에서 하기 위해서 별도의 함수를 정의하여 그 함수를 호출하도록 구현
  • 하지만 이렇게 함수를 만들때, 다른곳에서는 사용하지 않고 현재 위치에서만 사용하는 경우가 존재
// 리펙토링 전
func workA() {
  // A work
  // B work <- 하나의 함수에서 B일도 하므로 별도의 함수로 정의
}

(리펙토링 후)

  • 원래의 workA() 함수에서는 A일과 B일 두가지 일을 하므로 함수의 이름도 A, B 둘다 처리한다는 의미를 두고 이 내부 함수에서 workA(), workB() 호출
// 리펙토링 후
func workAWithB() {
  workA()
  workB()
}

func workA() {
  // A work
}

func workB() {
  // B work
}
  • 하지만 만약 workB(), workA()에서 파마미터를 많이 필요한 경우가 있는데 이 때 새로운 함수에서도 파라미터 선언하고 이 파라미터에 그대로 전달해주는 번거로움이 존재
    • 하나의 함수에서 하나의 일을 수행시키기 위해 함수로 분리시켰지만 많은 코드의 양이 존재
// 리펙토링 후
func workAWithB(a: Int, b: String, c: Double, d: Int, e: String, f: Double) {
  workA(a: 1, b: "2", c: 3)
  workB(d: 4, e: "5", f: 6)
}

func workA(a: Int, b: String, c: Double) {
  // A work
}

func workB(d: Int, e: String, f: Double) {
  // B work
}

함수대신 클로저로 표현하기

  • 하나의 함수에 일이 여러개가 있을 때, 이 일을 분리하기 위해서 별도의 함수로 빼다보면 위에서 알아본대로 여러가지의 파라미터를 그대로 넘겨주다보며 번거로움이 존재
  • 이 때 이 함수가 여러곳에서 사용되지 않고 단순히 해당 부분에서만 사용할것으로 예상되는 코드이면 함수가 아닌 클로저로 표현하면 더욱 간결한 코드 관리가 가능

ex) 아래처럼 별도의 함수 없이 workAWithB 함수 내부에서 workA, workB라는 클로저를 선언하면, 위에서 파라미터를 일일이 다시 정의하고 넘기지 않아도 간결하게 사용이 가능

// 리펙토링 후
func workAWithB(a: Int, b: String, c: Double, d: Int, e: String, f: Double) {
  let workA = {
    // a, b, c 값을 통한 계산
  }
  
  let workB = {
    // d, e, f 값을 통한 계산
  }

  // 필요한 시점에 workA(), workB() 호출하여 사용
}
Comments