Visual Studio Code에서 F# 시작하기
Visual Studio Code에서 F# 시작하기
여러분은 Visual Studio Code에서 Ionide 플러그인과 함께 F#을 작성할 수 있어요. 이 조합은 크로스 플랫폼이면서 가벼운 통합 개발 환경(IDE) 경험을 제공하고, IntelliSense와 코드 리팩터링 기능까지 쓸 수 있게 해 줘요. 플러그인에 대해 더 알고 싶다면 Ionide.io를 방문해 보세요.
출처: https://learn.microsoft.com/en-us/dotnet/fsharp/get-started/get-started-vscode
본문
참고: 시작하기 전에 F#과 Ionide 플러그인을 모두 설치했는지 확인해 주세요.
스크립트와 REPL로 F# 탐색하기
F#을 쓰기 시작하는 가장 빠른 방법은 스크립트 파일(.fsx)과 F# Interactive(FSI)를 이용하는 거예요. 프로젝트 파일이나 빌드 설정이 필요 없어요. 그냥 파일 하나 만들고 코드를 쓰면 되는데, Python이나 셸 스크립트를 쓰는 방식과 비슷하다고 보면 돼요.
스크립트 만들고 실행하기
터미널을 열고 다음을 실행해 보세요:
touch hello.fsx
code hello.fsx
파일에 다음 코드를 추가해 주세요:
printfn "Hello from F# Interactive!"
let square x = x * x
[ 1 .. 10 ]
|> List.map square
|> printfn "Squares: %A"
터미널에서 스크립트를 바로 실행해 봐요:
dotnet fsi hello.fsx
다음과 같은 결과가 나올 거예요:
Hello from F# Interactive!
Squares: [1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
VS Code에서 대화형 REPL 사용하기
스크립트는 Ionide의 FSI 통합과 함께 쓸 때 특히 강력해져요. MyFirstScript.fsx라는 새 파일을 만들고 다음 코드를 추가해 보세요:
let toPigLatin (word: string) =
let isVowel (c: char) =
match c with
| 'a' | 'e' | 'i' | 'o' | 'u'
| 'A' | 'E' | 'I' | 'O' | 'U' -> true
|_ -> false
if isVowel word[0] then
word + "yay"
else
word[1..] + string(word[0]) + "ay"
이 함수는 단어를 Pig Latin의 한 형태로 변환해 줘요. 다음 단계는 이 함수를 F# Interactive(FSI)로 평가하는 거예요.
함수 전체(총 11줄)를 선택하세요. 선택한 상태에서 Alt 키를 누른 채 Enter를 누르면, 화면 아래쪽에 터미널 창이 나타나는 걸 볼 수 있어요. 대략 이런 모양이에요:
이때 다음 세 가지가 일어나요:
- FSI 프로세스를 시작했어요.
- 선택한 코드를 FSI 프로세스로 보냈어요.
- FSI 프로세스가 보낸 코드를 평가했어요.
보낸 게 함수였으니, 이제 FSI에서 그 함수를 호출할 수 있어요! 대화형 창에 다음을 입력해 보세요:
toPigLatin "banana";;
다음과 같은 결과가 나올 거예요:
val it: string = "ananabay"
이번엔 첫 글자가 모음인 단어로 해볼게요. 다음을 입력해 보세요:
toPigLatin "apple";;
다음과 같은 결과가 나올 거예요:
val it: string = "appleyay"
함수가 기대한 대로 동작하는 것 같죠? 축하해요, 여러분은 Visual Studio Code에서 첫 F# 함수를 작성하고 FSI로 평가해 봤어요!
참고: 아마 눈치채셨겠지만, FSI에서 줄은
;;로 끝나요. FSI는 여러 줄 입력을 허용하기 때문인데, 마지막의;;는 FSI에게 코드 입력이 끝났다는 걸 알려주는 표시예요.
스크립트는 언제 쓸까요?
스크립트는 아이디어 탐색, 프로토타이핑, 데이터 분석, 자동화 작업에 딱 좋아요. 스크립트에서 #r "nuget: PackageName" 형태로 NuGet 패키지를 직접 참조할 수도 있는데, 이때도 프로젝트 파일이 필요 없어요.
코드가 한 파일을 넘어서 커지거나, 컴파일해서 배포할 필요가 생기면 완전한 프로젝트로 넘어가야 해요. 다음 절에서 그 방법을 보여드릴게요.
Ionide로 첫 프로젝트 만들기
더 큰 프로그램, 컴파일된 라이브러리, 애플리케이션으로 배포할 코드는 .NET 프로젝트를 사용해요. 새 F# 프로젝트를 만들려면 명령줄을 열고 .NET CLI로 새 프로젝트를 생성해 주세요:
dotnet new console -lang "F#" -o FirstIonideProject
완료되면 프로젝트 디렉터리로 이동해 Visual Studio Code를 열어요:
cd FirstIonideProject
code .
Visual Studio Code에서 프로젝트가 로드되면 창 왼쪽에 F# Solution Explorer(솔루션 탐색기) 패널이 열리는 걸 볼 수 있어요. 이건 Ionide가 방금 만든 프로젝트를 성공적으로 로드했다는 뜻이에요. 그 전에도 편집기에서 코드를 작성할 수는 있지만, 이 시점이 되면 모든 것이 로드된 거예요.
코드 설명
코드가 실제로 뭘 하는지 잘 모르겠다면, 여기 단계별 설명이 있어요.
보시다시피 toPigLatin은 단어를 입력으로 받아 그 단어를 Pig-Latin 표현으로 변환하는 함수예요. 규칙은 다음과 같아요.
단어의 첫 글자가 모음이면 단어 끝에 "yay"를 붙여요. 모음으로 시작하지 않으면 그 첫 글자를 단어 끝으로 옮기고 "ay"를 붙여요.
FSI에서 다음처럼 보이는 걸 확인하셨을 거예요:
val toPigLatin: word: string -> string
이건 toPigLatin이 string을 입력으로 받고(입력 이름은 word), 또 다른 string을 반환하는 함수라는 뜻이에요. 이걸 함수의 타입 시그니처라고 하는데, F# 코드를 이해하는 데 핵심이 되는 근본적인 개념이에요. Visual Studio Code에서 함수 위에 마우스를 올려도 같은 내용을 볼 수 있어요.
함수 본문에는 두 가지 부분이 보여요:
isVowel이라는 내부 함수예요. 주어진 문자(c)가 제공된 패턴 중 하나와 일치하는지 패턴 매칭으로 확인해서 모음인지 판별해요:
let isVowel (c: char) =
match c with
| 'a' | 'e' | 'i' | 'o' | 'u'
| 'A' | 'E' | 'I' | 'O' | 'U' -> true
|_ -> false
if..then..else식이에요. 첫 글자가 모음인지 확인하고, 첫 글자가 모음인지 여부에 따라 입력 문자들로 반환 값을 구성해요:
if isVowel word[0] then
word + "yay"
else
word[1..] + string(word[0]) + "ay"
toPigLatin의 흐름은 이렇게 돼요.
입력 단어의 첫 글자가 모음인지 확인해요. 모음이면 단어 끝에 "yay"를 붙이고, 모음이 아니면 그 첫 글자를 단어 끝으로 옮긴 뒤 "ay"를 붙여요.
마지막으로 눈여겨볼 게 하나 있어요. F#에는 함수에서 명시적으로 return하라는 지시가 없어요. F#은 표현식 기반 언어라서, 함수 본문에서 마지막으로 평가된 표현식이 그 함수의 반환 값을 결정해요. if..then..else가 그 자체로 하나의 표현식이기 때문에, then 블록 본문이나 else 블록 본문의 평가 결과가 바로 toPigLatin 함수가 반환하는 값이 되는 거예요.
콘솔 앱을 Pig Latin 생성기로 만들기
이 글의 앞부분에서는 F# 코드를 쓰는 흔한 첫 단계를 보여드렸어요. 초기 함수를 작성하고 FSI로 대화형으로 실행하는 것까지요. 이걸 REPL 중심 개발이라고 하는데, REPL은 "Read-Evaluate-Print Loop"의 약자예요. 원하는 기능이 동작할 때까지 실험해 보기 좋은 방법이에요.
REPL 중심 개발의 다음 단계는 동작하는 코드를 F# 구현 파일로 옮기는 거예요. 그러면 F# 컴파일러가 그 코드를 실행 가능한 어셈블리로 컴파일할 수 있어요.
먼저 아까 .NET CLI로 만든 Program.fs 파일을 열어 보세요. 이미 코드가 조금 들어 있는 걸 알 수 있을 거예요.
그다음 PigLatin이라는 새 module을 만들고, 아까 만든 toPigLatin 함수를 다음과 같이 그 안에 복사해 주세요:
module PigLatin =
let toPigLatin (word: string) =
let isVowel (c: char) =
match c with
| 'a' | 'e' | 'i' | 'o' | 'u'
| 'A' | 'E' | 'I' | 'O' | 'U' -> true
|_ -> false
if isVowel word[0] then
word + "yay"
else
word[1..] + string word[0] + "ay"
이 모듈은 main 함수 위쪽, open System 선언 아래에 있어야 해요. F#에서는 선언 순서가 중요하니까, 파일 안에서 함수를 호출하기 전에 먼저 정의해야 해요.
이제 main 함수에서 인자들에 여러분의 Pig Latin 생성 함수를 호출해 보세요:
[<EntryPoint>]
let main args =
for arg in args do
let newArg = PigLatin.toPigLatin arg
printfn "%s in Pig Latin is: %s" arg newArg
0
이제 명령줄에서 콘솔 앱을 실행할 수 있어요:
dotnet run apple banana
그러면 스크립트 파일과 같은 결과가 나오는 걸 볼 수 있어요. 다만 이번에는 실행 중인 프로그램으로 나온답니다!
Ionide 문제 해결하기
여기 겪을 수 있는 문제를 해결하는 몇 가지 방법을 소개할게요.
- Ionide의 코드 편집 기능을 쓰려면 F# 파일이 디스크에 저장되어 있고, Visual Studio Code 작업 영역에서 열려 있는 폴더 안에 있어야 해요.
- 시스템에 변경이 있었거나 Visual Studio Code가 열린 상태에서 Ionide 선행 조건을 설치했다면, Visual Studio Code를 다시 시작해 보세요.
- 프로젝트 디렉터리에 잘못된 문자가 있으면 Ionide가 동작하지 않을 수 있어요. 그렇다면 프로젝트 디렉터리 이름을 바꿔 보세요.
- Ionide 명령이 하나도 동작하지 않으면 Visual Studio Code 키 바인딩을 확인해서 실수로 덮어쓰진 않았는지 살펴보세요.
- Ionide가 고장 났는데 위 방법으로도 해결되지 않으면, 머신의
ionide-fsharp디렉터리를 제거하고 플러그인 스위트를 다시 설치해 보세요. - 프로젝트 로드에 실패했다면(F# Solution Explorer에 표시됨), 그 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 See details를 눌러 진단 정보를 더 확인해 보세요.
Ionide는 F# 커뮤니티 구성원들이 만들고 유지 관리하는 오픈 소스 프로젝트예요. 문제를 보고하거나 기여하고 싶다면 ionide-vscode-fsharp GitHub 저장소를 이용해 주세요.
Ionide 개발자와 F# 커뮤니티의 추가 도움은 Ionide Gitter 채널에서 구할 수 있어요.
다음 단계
F#과 이 언어의 기능을 더 배우고 싶다면 Tour of F#을 확인해 보세요.
더 알아보기 (Learn more)
- Tour of F# — F# 언어의 주요 기능 둘러보기
- Ionide.io — Ionide 플러그인 공식 사이트
- Type signatures (F# for Fun and Profit) — F# 타입 시그니처 이해하기
- Pig Latin (Wikipedia) — Pig Latin이란?
- Visual Studio Code — 공식 편집기
- Ionide-fsharp (Visual Studio Marketplace) — Ionide 플러그인 설치