DEV Community

CloudHolic
CloudHolic

Posted on • Originally published at dev.to

F# Tutorial (1) - Intro

※ 이 시리즈는 코딩을 처음 하는 사람을 대상으로 하지 않습니다. 이미 기본적인 전산학 및 코딩, 특히 C#과 OOP에 대해서는 이미 알고 있다고 가정하고 진행합니다.

닷넷하면 보통 C#을 떠올리기 마련이지만, (그리고 실제로도 C#이 주가 되는 환경이기는 하지만) 닷넷 위에서 동작하는 언어가 C#만 있는 것은 아닙니다. Delphi.NET이나 C++/CLI 같은 원본이 따로 있는 언어를 제외하면, VB.NET과 F#이 있습니다. 그리고 이 시리즈에서 살펴볼 언어는 F#입니다.

F#은 그 이름답게 Functional Programming(FP)을 위한 언어입니다.
그러니 F#을 사용하다 보면 FP 역시 알게 될 수 밖에 없습니다. 마치 C#을 하다보면 OOP를 알게 되는 것처럼요.

물론 함수형 언어가 F#만 있는 것은 아닙니다. LISP과 여기서 파생된 Scheme, 순수 함수형 언어로 유명한 Haskell, JVM 위에서 돌아가게 만든 Clojure 등등 종류가 생각보다 다양합니다. 이런 언어들과 비교하면 F#은 순수한 함수형 언어는 아닙니다. 함수형 패러다임이 주가 되기는 하지만, 닷넷 및 C#과의 호환성을 위해 class나 mutable, loop 등 순수한 함수형 언어에선 찾아볼 수 없는 문법들이 많죠. 이런 식으로 OOP와 FP를 섞어놓은 언어는 F# 외에도 Scala, Kotlin, Javascript (많은 사람들이 잘 모르지만 Javascript는 multi-paradigm 언어입니다. React에서 쓰는 Functional Component를 생각해보시면 됩니다.) 등이 있습니다. 하지만 이들 언어는 OOP 베이스에 FP를 약간 섞은 식이라면, Scala와 F#은 FP 베이스에 OOP를 약간 섞은 느낌입니다.

여기서는 FP로써의 F#을 알아볼 것이기 때문에 (얼마 안되지만) OOP적인 요소는 최대한 배제하겠습니다. 그러면 Haskell을 사용하지 왜 F#을 쓰냐고요? 저는 닷넷의 지원을 받는다는게 굉장히 큰 장점이라고 생각합니다. 결국 C#과 F# 모두 CIL로 컴파일되기 때문에 C#과 F#의 상호호환이 상당히 쉽게 가능하고, 무엇보다 F# 또한 패키지 매니저로 nuget을 사용하기 때문에 C#을 해보셨던 분이라면 쉽게 적응할 수 있거든요.

그러면 C#만 쓰지 왜 F#을 같이 쓰냐고 물을 수 있습니다. FP 언어는 OOP 언어엔 없는 몇 가지 특징들이 있습니다. 추후에 자세히 다루겠지만, FP 언어는 기본적으로 불변성(Immutability)을 지향하며, 함수 그 자체가 일급 객체이기 때문에 코드를 간략하게 쓰기 용이합니다. 또한 언어 자체적으로 Lazy evaluation을 지원하죠. 이러한 특징들 덕에 FP 언어는 유지보수가 쉬우며, 코드를 간략하게 쓰기 용이합니다.

간단한 예시를 통해 비교해 보죠. 아래 코드는 Quicksort를 수행하는 C#코드입니다.

public class QuickSortHelper
{
    public static List<T> QuickSort<T>(List<T> values) where T : IComparable
    {
        if (values.Count == 0)      
            return new List<T>();     
        T firstElement = values[0];

        var smallerElements = new List<T>();
        var largerElements = new List<T>();
        for (int i = 1; i < values.Count; i++)
        {
            var elem = values[i];
            if (elem.CompareTo(firstElement) < 0)         
                smallerElements.Add(elem);         
            else         
                largerElements.Add(elem);         
        }

        var result = new List<T>();
        result.AddRange(QuickSort(smallerElements.ToList()));
        result.Add(firstElement);
        result.AddRange(QuickSort(largerElements.ToList()));
        return result;
    }
}
Enter fullscreen mode Exit fullscreen mode

그리고 이 코드와 동일한 일을 하는 F#코드는 다음과 같습니다.

let rec quicksort = function
    | [] -> []
    | first::rest ->
        let smaller,larger = List.partition ((>=) first) rest
        List.concat [quicksort smaller; [first]; quicksort larger]
Enter fullscreen mode Exit fullscreen mode

27줄짜리 코드가 5줄로 줄어들었습니다.

F#은 이처럼 닷넷에서 사용 가능한 유일한 FP 언어라는 점에서 충분히 매력적인 언어라고 생각합니다. 다음 글에서부터 본격적으로 F#의 문법 및 FP에 대해 알아보겠습니다.

Top comments (0)