ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 고차함수와 함수형 프로그래밍
    Swift 2020. 12. 18. 12:10

    안녕하세요. 그린입니다!

    이번 포스팅에서는 고차함수와 함수형 프로그래밍에 대해 학습해보겠습니다.

    고차함수.. 말만 들어도 어렵죠? 저는 처음 수학에 관한건가? 라는 생각이 들었어요 ^^;

    자 그럼 고차함수부터 차근차근 알아보도록 하겠습니다!

    [고차함수]

    고차함수는 파라미터나 반환값을 함수로 주고 받는 함수입니다.

    고차함수를 활용한 대표적인 메서드는 map/filter/reduece가 있습니다.

    고차함수를 잘 사용한다면 기존 반복/조건문들을 장황하게 짜는것보다 더 편하게 함수 내에서 구현이 가능합니다.

     

    <고차함수 메서드>

    1) map: 컨테이너 내부 기존 데이터를 변형하여 새로운 컨테이너를 생성

    data = numbers.map( { (number: Int) -> Int in return number * 2})
    //파라미터,반환타입,반환키워드 생략
    data = numbers.map{ $0 * 2 }

    2) filter: 컨테이너 내부의 값에서 원하는 데이터만을 걸러서 새로운 컨테이너로 추출

    data = number.filter{ (number: Int) -> Bool in return number % 2 == 0 }
    //파라미터,반환타입,반환키워드 생략
    data = number.filter{ $0 % 2 == 0 }

    3) reduce: 컨테이너 내부 데이터들을 하나로 통합

    data = number.reduce(0, {(result: Int, currentItem: Int) -> Int in return result + currentItem } )
    //파라미터,반환타입,반환키워드 생략
    data = number.reduce(0) { $0 + $1 }

    순차적으로 데이터가 연산되어 누적되며 인자의 순서를 바꿔주면 계산되는 순서가 바뀝니다.

    매개변수의 이름은 결과값과 현재값을 알아볼 수 있는 result, currentItem으로 정의하는것이 좋습니다.

    reduce를 실행해볼때 계산순서를 Xcode에서 살펴보겠습니다.

    reduce(1)
    reduce(2)
    reduce(3)
    reduce(4)

    여기서 잠깐! 여기서 의문이 드실겁니다. reduce를 사용하여 통합할때 배열의 첫 인덱스부터 누적이된다.

    만약 배열의 마지막 인덱스부터 계산이 되게 할 수 있는 방법이 있을까??

    있긴합니다. 다만 reduce에서의 그런 역할을 해주는 기능은 없습니다.

    그럼 어떻게 가능하냐!? 바로 처음에 해당 자료를 reduce하기전 마지막 인덱스를 처음으로 바꿔주는 새로운

    자료구조의 배열로 만들어 주면됩니다! 조금 번거롭긴한데 해당 방법이 가장 좋습니다^^

     

    4) flatMap: 배열을 flattern하게 만들어주며 nil 값을 제거하여 보여주며 옵셔널 바인딩을 할 수 있습니다.

     -> Swift 4.1부터는 compactMap로 역할이 전부 이전된 느낌으로 compactMap 사용을 권장합니다.

     -> 그렇다고 삭제된 메서드는 아닙니다. 아래와 같은 경우일때 여전히 사용됩니다.

     -> 2차원 배열을 1차원 배열로 만들어줄때 사용합니다.

     

    5) compactMap: flatMap의 역할이 이전된 메서드

     -> nil 값의 매핑을 걸러줍니다.

     -> 2차원 배열을 1차원 배열로 만들어줄수는 없어 flatMap의 사용이 필요합니다.

     

    ++ 고차함수의 메서드들은 메서드체이닝으로 연결하여 사용할 수 있다.

     (예: data = number.filter().map().reduce() )

    ++ 인라인 클로저: 함수로 따로 정의가 된게 아닌 인자로 들어가 있는 형태의 클로저

     -> 타입 생략 가능

     -> 반환키워드 생략 가능

     -> 인자 이름 생략 가능 ($, 단축인자로 표시)

    ++ 후행 클로저: 함수 마지막 인자가 클로저라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있다.

     

    <고차함수의 장점>

    -. 간결함

    -. 반복/조건문을 사용시 변수를 밖에 var로 선언하여 사이드 이펙트가 발생할 수 있지만 고차함수는 상수 let으로

       함수 내부에서 바로 표현해주며 할당할 수 있어 한번에 표현이 가능하고 사이드 이펙트 발생을 막아줍니다.

    -. 성능의 이점

    [함수형 프로그래밍]

    스위프트는 객체지향이면서도 함수형이다. 즉 객체지향 패러다임을 채택하면서도 함수형 패러다임을 채택한다.

    따라서 우리는 여러 상황에서 더 맞는 패러다임으로 구현을 하면된다.

    하나의 치중하지말고 여러 시각으로 바라보는것이 중요하다!

     

    <특징>

    -. 변경 가능한 상태를 제거하며 순수함수로 구성된다.

    -. 사이드이펙트가 발생하지 않는다.

    -. 항상 같은값을 가짐으로 상태를 확인할 필요가 없어 대규모 병렬처리에 특화되어있다.

    -. 다중쓰레드 환경처럼 여러 작업을 할때 효과적이다.

     

    이렇게 오늘은 고차함수와 함수형 프로그래밍 그리고 연관된 개념들에 대해 학습해보았습니다.

    막상 접근하고 나니 어려운 부분이 아닙니다. 해당 개념들을 확실하게 알고 있다면 복잡한 코드 대신

    더욱 클린한 코드로 쉽게 구현해볼 수 있습니다ㅎㅎ

    다음 포스팅에서 더 유익한 정보로 돌아오겠습니다!

    감사합니다!

     

    'Swift' 카테고리의 다른 글

    인스턴스 생성 및 소멸  (0) 2020.12.28
    JSON 데이터 다루기  (0) 2020.12.23
    제네릭  (0) 2020.12.13
    프로토콜/구조체/클래스에 관하여  (0) 2020.11.23
    접근레벨 및 이니셜라이저 관련  (0) 2020.11.19
Designed by Tistory.