F# 언어에 대한 소개
F#는 함수형 프로그래밍 언어로, 특히 프로그래밍 언어를 다루는 작업에 매우 유용하다. 마이크로소프트가 개발한 F#는 .NET 플랫폼에서 실행되며, 다른 함수형 언어와 달리 생산성 높은 프로그래밍을 돕는 강력한 도구와 라이브러리를 제공한다. 다음에서는 F#의 주요 개념과 기본 문법을 소개하고, 이를 통해 F#이 제공하는 독특한 프로그래밍 방식과 장점을 살펴본다.
F#의 특징과 환경
함수형 프로그래밍 패러다임
F#는 함수형 언어로, 명령형 프로그래밍이 아닌 표현 중심의 프로그래밍을 지향한다. 일반적인 명령형 언어(C/C++, Python 등)에서는 컴퓨터가 수행할 작업 순서를 명령하지만, F#는 수학적 표현과 같은 표현식을 통해 코드를 작성한다.
예시:
let x = 10
let y = x + 1
let s = Set.add y Set.empty // s는 {11} 집합을 의미
이와 같은 표현형 패러다임 덕분에, F#에서는 코드가 간결해지고 높은 수준의 추상화가 가능하다.
개발 환경 설정
F#는 여러 환경에서 설치하여 사용할 수 있지만, Visual Studio가 F# 개발을 위해 최적화된 IDE다. 또한, dotnet SDK를 통해 F# 프로젝트를 생성하고 실행할 수 있다.
dotnet new console -lang "F#" -o HelloFSharp
cd HelloFSharp
dotnet build -o out
./out/HelloFSharp
이 명령을 통해 간단한 F# 콘솔 프로젝트를 생성하고, 빌드하여 실행할 수 있다.
F# 기초 문법과 자료형
값과 타입
F#에서는 값의 타입을 명시하지 않아도 타입 추론을 통해 자동으로 결정된다. 예를 들어 let x = 10
이라고 정의하면, F#가 x
의 타입을 int
로 추론한다. 하지만 초보자는 오류를 줄이기 위해 명시적으로 타입을 지정하는 것이 좋다.
타입 명시 예시:
let b: bool = true
let i: int = 1
let s: string = "Sharp"
연산자와 조건문
F#는 기본적인 수학 연산자와 비교 연산자를 제공하며, 조건문은 if B then X else Y
형식으로 사용한다. F#의 조건문은 표현식이므로 반드시 else
부분이 필요하며, 두 반환 값의 타입이 동일해야 한다.
let result = if 1 < 2 then "F#" else "C++"
함수 정의와 사용
함수 정의
F#에서 함수는 let
키워드를 사용하여 정의하며, 함수는 항상 표현식으로 작성된다. 반환 키워드가 없으며, 마지막 표현식의 결과가 함수의 반환값이 된다.
기본 함수 정의 예시:
let add x y = x + y
let squareAdd (x: int) (y: int) : int =
let s1 = x * x
let s2 = y * y
s1 + s2
재귀 함수
F#에서는 재귀가 반복 구조를 대신하며, let rec
키워드를 사용해 재귀 함수를 정의한다. 예를 들어 팩토리얼을 계산하는 함수는 다음과 같다.
let rec factorial n =
if n <= 1 then 1
else n * factorial (n - 1)
자료형과 데이터 구조
튜플과 리스트
F#는 튜플을 사용해 여러 값을 하나로 묶을 수 있다. 리스트는 같은 타입의 값을 포함하며, 여러 유용한 함수(List.length
, List.contains
등)를 제공한다.
튜플 예시:
let person = (25, "Alice", true)
let (age, name, _) = person
리스트 예시:
let numbers = [1; 2; 3]
let doubled = List.map (fun x -> x * 2) numbers
집합과 맵
F#는 Set
과 Map
모듈을 제공하여, 집합과 키-값 쌍 구조를 다룰 수 있다.
집합 예시:
let s1 = Set.add 1 Set.empty
let s2 = Set.union s1 (Set.ofList [2; 3])
맵 예시:
let map1 = Map.empty |> Map.add "a" 1 |> Map.add "b" 2
let value = Map.find "a" map1
고차 함수와 패턴 매칭
고차 함수
F#는 고차 함수를 지원하여 함수를 인자로 넘기거나 반환할 수 있다. 이를 통해 코드가 더욱 간결하고 유연해진다.
고차 함수 List.map
예시:
let increment x = x + 1
let incrementedList = List.map increment [1; 2; 3]
패턴 매칭
F#의 패턴 매칭은 조건 분기에서 매우 유용하다. 특히 유니온 타입과 함께 사용될 때 강력한 기능을 제공한다.
유니온 타입과 패턴 매칭 예시:
type Animal = Dog | Cat | Duck
let animalSound animal =
match animal with
| Dog -> "Bark"
| Cat -> "Meow"
| Duck -> "Quack"
F#의 고급 기능
예외 처리
F#는 try-with
구문을 통해 예외를 처리할 수 있다. 예외가 발생하면 예외가 던져지고, with
블록에서 특정 예외를 포착하여 처리할 수 있다.
let divide x y =
try x / y with
| :? System.DivideByZeroException -> 0
모듈과 네임스페이스
F#는 코드를 체계적으로 관리하기 위해 모듈과 네임스페이스를 사용한다. 모듈은 관련된 타입과 함수들을 모아두는 단위로, 객체 지향 언어의 클래스와 유사하지만 객체 개념이 없다.
module MathOperations =
let add x y = x + y
let subtract x y = x - y
F#는 이와 같이 함수형 프로그래밍의 장점을 활용해 코드의 가독성과 유지보수성을 높이며, 수학적 표현과 같은 직관적인 코드 작성을 가능하게 한다. 다양한 데이터 구조와 패턴 매칭, 고차 함수 등을 통해 F#는 복잡한 로직을 간결하게 표현할 수 있으며, 특히 언어 처리 및 데이터 분석 작업에 유리하다.
'Development' 카테고리의 다른 글
Vim과 PuTTY 손쉽게 사용하자! (0) | 2020.07.28 |
---|