💻 프로그래밍

F#

.NET 플랫폼의 함수형 우선 언어

📖 상세 설명

F#은 Microsoft가 개발한 .NET 플랫폼의 함수형 우선(functional-first) 프로그래밍 언어입니다. 2005년 Don Syme이 ML 계열 언어인 OCaml에서 영감을 받아 설계했으며, 함수형 프로그래밍의 강력한 기능과 .NET 생태계의 풍부한 라이브러리를 결합한 것이 특징입니다.

F#의 가장 큰 장점은 강력한 타입 추론과 패턴 매칭입니다. 컴파일러가 대부분의 타입을 자동으로 추론하므로 타입 선언 없이도 타입 안전성을 보장받을 수 있으며, 패턴 매칭을 통해 복잡한 데이터 구조를 간결하고 명확하게 처리할 수 있습니다.

불변성(immutability)이 기본값인 F#에서는 변수가 기본적으로 변경 불가능하여 부작용이 적고 동시성 프로그래밍이 안전합니다. 파이프 연산자(|>)를 통한 함수 합성으로 데이터 변환 파이프라인을 직관적으로 표현할 수 있어 데이터 처리 코드의 가독성이 뛰어납니다.

실무에서 F#은 금융 분야의 퀀트 분석, 데이터 과학, 웹 백엔드(Giraffe, Saturn), 그리고 도메인 주도 설계(DDD)에서 활발하게 사용됩니다. 2025년 현재 .NET 8과 함께 크로스 플랫폼을 완벽히 지원하며, Type Provider를 통해 외부 데이터 소스와의 통합이 매우 간편합니다.

💻 코드 예제

// 1. 기본 문법과 타입 추론
let greeting = "Hello, F#!"  // 타입 추론: string
let numbers = [1; 2; 3; 4; 5]  // 타입 추론: int list

// 2. 파이프 연산자와 함수형 처리
let result =
    numbers
    |> List.filter (fun x -> x % 2 = 0)  // 짝수만: [2; 4]
    |> List.map (fun x -> x * x)          // 제곱: [4; 16]
    |> List.sum                           // 합계: 20

printfn "짝수 제곱의 합: %d" result

// 3. 패턴 매칭과 구분된 유니온
type Shape =
    | Circle of radius: float
    | Rectangle of width: float * height: float
    | Triangle of baseLen: float * height: float

let calculateArea shape =
    match shape with
    | Circle r -> System.Math.PI * r * r
    | Rectangle (w, h) -> w * h
    | Triangle (b, h) -> 0.5 * b * h

let shapes = [Circle 5.0; Rectangle (3.0, 4.0); Triangle (6.0, 8.0)]
shapes |> List.iter (fun s -> printfn "면적: %.2f" (calculateArea s))

// 4. 비동기 워크플로우 (Async)
open System.Net.Http

let fetchDataAsync (url: string) = async {
    use client = new HttpClient()
    let! response = client.GetStringAsync(url) |> Async.AwaitTask
    return response.Length
}

// 병렬 실행 예시
let urls = ["https://example.com"; "https://fsharp.org"]
let results =
    urls
    |> List.map fetchDataAsync
    |> Async.Parallel
    |> Async.RunSynchronously

printfn "가져온 데이터 크기: %A" results

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"이 데이터 파이프라인은 F#으로 구현하면 파이프 연산자로 변환 단계를 명확하게 표현할 수 있습니다. 불변성 기본이라 병렬 처리도 안전하게 할 수 있어서 성능 최적화에도 유리해요."
💬 면접에서
"F#의 구분된 유니온(Discriminated Union)과 패턴 매칭을 사용하면 도메인 모델을 타입 시스템으로 표현할 수 있습니다. 'Make Illegal States Unrepresentable' 원칙을 따라 잘못된 상태를 컴파일 타임에 방지할 수 있습니다."
💬 코드 리뷰에서
"여기 mutable 키워드를 쓰고 있는데, F#에서는 가능하면 불변 데이터로 작성하는 게 좋습니다. 이 경우 fold나 scan으로 대체하면 부작용 없이 동일한 결과를 얻을 수 있어요."

⚠️ 흔한 실수 & 주의사항

들여쓰기 민감성 무시

F#은 Python처럼 들여쓰기가 문법의 일부입니다. 탭 대신 스페이스를 사용하고, 들여쓰기 수준을 일관되게 유지하세요. IDE 설정에서 탭을 스페이스로 자동 변환하도록 설정하는 것이 좋습니다.

C# 스타일로 F# 작성하기

클래스와 mutable 변수를 과도하게 사용하면 F#의 장점을 살리지 못합니다. 레코드, 유니온 타입, 순수 함수를 우선 사용하고, 필요할 때만 객체 지향 기능을 활용하세요.

Option 타입으로 null 제거

F#에서는 null 대신 Option 타입(Some/None)을 사용합니다. 패턴 매칭과 함께 사용하면 NullReferenceException을 완전히 방지할 수 있어 코드 안정성이 크게 향상됩니다.

🔗 관련 용어

📚 더 배우기