엔트리 포인트

엔트리 포인트 (Entry Point)

F# 콘솔 애플리케이션의 진입점 구조를 이해해 보는 시간이에요. 실행이 어디서 시작되고, 명령줄 인자가 어떻게 전달되며, 종료 코드를 어떻게 돌려주는지 — 우리가 만든 프로그램이 실제로 '시작'되는 지점을 차근차근 살펴볼게요.

출처: https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/functions/entry-point

본문

이 페이지에서는 F# 콘솔 애플리케이션의 구조를 어떻게 잡는지 알려드려요. 크게 암시적(implicit) 엔트리 포인트명시적(explicit) 엔트리 포인트 두 가지 방식이 있는데, 하나씩 볼게요.

암시적 엔트리 포인트 (Implicit Entry Point)

기본적으로 F# 애플리케이션은 암시적 엔트리 포인트를 사용해요. 예를 들어 다음 프로그램은 엔트리 포인트가 명시되어 있지 않은 암시적 방식인데, 프로그램을 실행하면 코드가 첫 줄부터 마지막 줄까지 순서대로 실행돼요.

open System

let printSomeText() =
    let text = "Hello" + "World"
    printfn $"text = {text}"

let showCommandLineArgs() =
    for arg in Environment.GetCommandLineArgs() do
        printfn $"arg = {arg}"

printSomeText()
showCommandLineArgs()
exit 100

암시적 방식에서는 코드가 위에서 아래로 쭉 실행되다가 exit 100 같은 구문으로 종료 코드를 돌려줄 수 있어요.

명시적 엔트리 포인트 (Explicit Entry Point)

원한다면 명시적 엔트리 포인트를 쓸 수도 있어요. 보통은 다음 이유 중 하나(또는 전부) 때문에 명시적 방식을 선택해요.

  • 명령줄 인자를 System.Environment.GetCommandLineArgs()로 읽는 대신, 함수에 전달되는 인자로 접근하고 싶을 때
  • exit 대신 반환 결과로 오류 코드를 돌려주고 싶을 때
  • 콘솔 애플리케이션의 마지막 파일에 있는 코드를 단위 테스트하고 싶을 때

다음 예시는 명시적 엔트리 포인트를 가진 간단한 main 함수를 보여줘요.

[<EntryPoint>]
let main args =
    printfn "Arguments passed to function : %A" args
    // Return 0. This indicates success.
    0

이 코드를 EntryPoint.exe 1 2 3라는 명령줄로 실행하면 출력은 다음과 같이 나와요.

Arguments passed to function : [|"1"; "2"; "3"|]

args 배열에 명령줄 인자 "1", "2", "3"이 그대로 담겨 전달된 걸 볼 수 있죠.

구문 (Syntax)

명시적 엔트리 포인트의 구문은 이렇게 생겼어요.

[<EntryPoint>]
let-function-binding

설명 (Remarks)

앞의 구문에서 let-function-bindinglet 바인딩의 함수 정의를 말해요.

컴파일되어 실행 파일이 되는 프로그램의 진입점은 실행이 공식적으로 시작되는 지점이에요. F# 애플리케이션의 엔트리 포인트는 프로그램의 main 함수에 EntryPoint 특성(attribute)을 적용해서 지정해요. 이 함수(let 바인딩으로 만든 것)는 마지막으로 컴파일되는 파일의 마지막 함수여야 해요. 여기서 '마지막으로 컴파일되는 파일'이란 프로젝트의 마지막 파일 또는 명령줄에 전달된 마지막 파일을 말해요.

엔트리 포인트 함수의 타입은 string array -> int이에요. 명령줄에서 제공된 인자는 문자열 배열로 main 함수에 전달돼요. 배열의 첫 번째 요소가 첫 번째 인자이고, 일부 다른 언어에서처럼 실행 파일 이름은 배열에 포함되지 않아요. 반환 값은 프로세스의 종료 코드(exit code)로 사용돼요. 보통 0은 성공을, 0이 아닌 값은 오류를 나타내요. 다만 0이 아닌 반환 코드가 구체적으로 무엇을 뜻하는지에 대한 관례는 따로 없어요 — 그 의미는 애플리케이션마다 정해요.

더 알아보기 (Learn more)