본문 바로가기

Swift 공부

Swift 함수형 프로그래밍

공부를 하면서 객체지향 , 함수형 등 프로그래밍을 들어봤지만  당연히 객체지향 프로그래밍을 사용하고 있고 

함수형 프로그래밍을 해본적이 없다고 생각을 하고있었다 하지만 공부를 위해 그리고 다양한 견문을 넓히기 위해

함수형 프로그래밍을 검색해서 공부를 해보았는데 어디서 본적있는 코드들이 나오는게 아닌가 예를 들어 배열에서 사용하는 필터등 ...

나는 함수형 프로그래밍을 사용하면서 모르고 있었던거였다 상당히 창피했다.

그래서 본격적으로 함수형 프로그래밍에 대해 찾아보고 정리를 하기로 결심을 하고 이 글을 작성한다

 

 

 

 

함수형 프로그래밍이란?

 

1.  함수의 응용을 중요하게 생각한다.

2. 함수를 일급 객체로 다룬다

3. 코드의 실행과 결과값이 함수에 전달된 인자값으로만 결과를 만들어 내기때문에 상태값을 가지고있지않고 순수하게 함수만으로 동작

관련 용어 Pure - Function , Side - Effect

4. 동작하는 과정에서 함수 호출이 각각 다른 함수의 간섭이 없이 실행이 되기에 병렬처리할때 예상하지 못한 오류가 적다.

1번은 말그대로 함수를 응용하는 것을 굉장히 중요하게 생각을 하고 여기서 파생되 2번인 함수를 일급 객체로 다룬다는 내용이 나온것 같다.

여기서 일급 객체란?

1.  변수 , 상수에 저장 or 할당 가능

2. 함수의 파라미터로 사용가능

3. 함수에서 리턴값으로 사용이 가능

 

func 일급객체(객체: String) -> String {
        
     return 객체
}
//1번
// 자체가 변수 or 상수에 저장이 가능하다
let 일급 = 일급객체
 
 
func 테스트함수(테스트변수: String) {
    print("2")
}
//2번
//위에서 선언된 "일급" 자체가 함수의 파라미터로 들어갈수있다. 
테스트함수(테스트변수: 일급("변수"))


func 테스트함수2(테스트변수: String) -> String {
//3번    
//함수 자체가 리턴값으로 사용할수있다
    return 일급객체(객체: "아이템")
}

 

 

순수한 함수

순수한 함수란 부작용이 없는 함수 , 즉 , 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻한다고 한다.

따라서 순수한 함수는 스레드가 안전하고 , 병렬적인 계산이 가능하다.

 

//3을 리턴하는함수
func ReturnThree() -> Int {
   return 3
}

let IntItem = ReturnThree()
        
let Result = ReturnThree() * ReturnThree()
        
let Result2 = IntItem * IntItem

ReturnThree 함수처럼 3을 리턴하는 함수가 있다고 가정을 해보자

 

ReturnThree함수의 결과 값은 외부의 요인에 영향을 받지 않고 오로지 함수자체의 결과에만 의존을 한다

그래서 ReturnThree 의 결과값이 input값이 null로 항상일정하다면 Result처럼 굳이 함수를 2번 선언하는것이 아닌

함수의 결과값 자체를 변수로 입력을 받아 최적화가 가능할 것 이다.

 

하지만  ReturnThree 가 순수한 함수가 아니였다면?

 

  var changeValue : Int = 1
  
  func ReturnThree() -> Int {
        
        changeValue += 1
        
        return 3 * changeValue
  }
  
    let IntItem = ReturnThree()
    let Result = ReturnThree() * ReturnThree()
    let Result2 = IntItem * IntItem

 

결과값
IntItem : 6
Result : 108
Result2 : 36

 

이렇게 외부의 값(Side - Effect)에 의해 같은 함수의 곱이지만 결과값은 전혀 다른 것 을 확인할 수 있다

순수한 함수란 위의 예시처럼 외부의 값(Side - Effect)에 따라 결과가 변하는것이 아닌 함수의 input이 같다면 항상 같은 결과를 도출해내는 함수를 말한다.

 

익명 함수

익명함수란 , 이름이 없는 함수를 뜻한다. 전통적인 명령형 언어에서는 모든 함수에 이름이 부여되어야만 한다. 

이것을 익명함수가아닌 일반 함수로 표현하게되면

func test(Item : String){
        print("Item: \(Item)")
}

하지만 이것을 익명 함수로 변경되면

    let test = { (item : String) -> Void in
           print("item: \(item)")
    }
    
    test("테스트")

이런식으로 함수를 이름이 없이 사용이 가능하다

 

 

고차 함수

고계 함수(higher-order function)란, 함수를 다루는 함수를 뜻한다. 사실 함수형 언어에서는 함수도 '값(value)'으로 취급한다. 그러므로 정수 1이나 인수를 제곱하는 함수나 동등한 입장에서 다룰 수 있다. 정수를 함수의 인수로 전달할 수 있듯이 어떤 함수도 다른 함수의 인수로 전달할 수 있다. 마찬가지로 함수의 결과 값으로 정수를 반환할 수 있듯이 함수를 반환할 수도 있다.

 

Swift에서 가장 큰 예로는 map , filter , reduce 를 예로 볼수있다.

 

만약

1에서 10까지 숫자로 이루어진 리스트의 각 원소를 제곱하고 싶다고 하자. 명령형 언어에서는 반복문을 이용하여 리스트를 훑어 가며 각 원소를 제곱하겠지만, 함수형 언어에서는 리스트를 다루는 Map함수로 쉽게 처리할 수 있다. 

 

  let item = numbers
            .map{ $0 * $0}

 

 

결론

함수형 프로그래밍은 함수중심의 프로그래밍을 진행하고 가장 중요한것은 Side - Effect의 영향을 받지 않는것이다.

 

아직은 글을 쓰는 능력이 많이 부족해 읽는 사람들이 많이 어렵다고 느낀다 ㅜㅜ 죄송합니다.

꾸준히 책을 읽고 글을 적으면서 필력을 많이 보완하도록 하겠습니다..!

'Swift 공부' 카테고리의 다른 글

Swift MVVM  (0) 2022.03.09
Protocol Oriented Programming(POP) - With RxSwift Mvvm  (0) 2022.02.18
WKWebView MemoryLeak 해결  (0) 2021.11.12
타입캐스팅 is , as 와 Any , AnyObject  (0) 2021.08.05
Moya / RxMoya 사용해보기  (2) 2021.08.01