F# 타입

F# 타입 (F# Types)

이 문서에서는 F#에서 사용되는 타입이 무엇인지, 그리고 F# 타입이 어떻게 이름 붙고 설명되는지 살펴볼게요.

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

본문

F# 타입 한눈에 보기

어떤 타입들은 **기본 타입(primitive type)**으로 분류돼요. 불리언 타입 bool, 그리고 크기가 서로 다른 여러 정수 타입과 부동 소수점 타입이 여기 속하는데, 바이트와 문자를 나타내는 타입도 포함돼요. 이런 타입들에 대한 설명은 [Primitive Types] 문서에서 자세히 다뤄요.

언어에 내장된 다른 타입으로는 튜플(tuple), 리스트(list), 배열(array), 시퀀스(sequence), 레코드(record), 판별 공용체(discriminated union)가 있어요. 다른 .NET 언어를 쓰다가 F#을 막 배우기 시작한 분이라면 이 타입들을 각각 다루는 문서를 차례로 읽어 보길 권해요. 이 F# 고유 타입들은 함수형 프로그래밍 언어에서 흔히 쓰는 프로그래밍 스타일을 지원하거든요. 그리고 대부분 이 타입들에는 공통 연산을 지원하는 모듈이 F# 라이브러리에 함께 딸려 있어요.

함수의 타입에는 매개변수 타입과 반환 타입에 대한 정보가 담겨요.

객체 타입(object type), 인터페이스 타입, 대리자 타입(delegate type) 같은 것들은 .NET Framework에서 비롯돼요. 다른 .NET 언어에서와 마찬가지로 여러분이 직접 객체 타입을 정의할 수도 있어요.

또 F# 코드에서는 별칭(alias), 즉 이름 붙인 타입 약어(type abbreviation)를 정의해서 타입을 다른 이름으로 가리킬 수 있어요. 타입이 나중에 바뀔 가능성이 생겨서, 그 타입에 의존하는 코드를 전부 고치기 싫을 때 타입 약어가 유용하죠. 아니면 타입에 친근한 이름을 붙여서 코드를 더 읽고 이해하기 쉽게 만들 때도 사용해요.

F#은 함수형 프로그래밍을 염두에 두고 설계된 유용한 컬렉션 타입도 제공해요. 이 컬렉션 타입을 쓰면 더 함수형 스타일의 코드를 작성하기 쉬워져요. 자세한 내용은 [F# Collection Types] 문서를 참고하세요.

타입 구문 (Syntax for Types)

F# 코드를 작성하다 보면 타입 이름을 직접 써야 할 일이 자주 생겨요. 모든 타입은 저마다 **문법적 형태(syntactic form)**를 갖고 있고, 이 형태를 타입 주석(type annotation), 추상 메서드 선언, 대리자 선언, 시그니처 등 여러 곳에서 사용해요. 인터프리터에서 새 프로그램 구문을 선언할 때마다 인터프리터가 그 구문의 이름과 타입 구문을 함께 출력해 주는데, 그 구문은 사용자 정의 타입의 경우 식별자 하나에 그칠 수도 있고 int, string 같은 내장 식별자일 수도 있어요. 다만 타입이 복잡해지면 그만큼 구문도 복잡해지죠.

아래 표는 F# 타입 구문의 여러 측면을 보여줘요.

타입 타입 구문 예시
기본 타입 (primitive type) type-name int float string
집계 타입 — 클래스(class), 구조체(struct), 공용체(union), 레코드(record), 열거형(enum) 등 type-name System.DateTime Color
타입 약어 (type abbreviation) type-abbreviation-name bigint
정규화된 타입 (fully qualified type) namespaces.type-name 또는 modules.type-name 또는 namespaces.modules.type-name System.IO.StreamWriter
배열 (array) type-name [] 또는 type-name array int[] array<int> int array
2차원 배열 type-name [,] int[,] float[,]
3차원 배열 type-name [,,] float[,,]
튜플 (tuple) type-name1 * type-name2 ... 예를 들어 (1,'b',3)의 타입은 int * char * int
제네릭 타입 (generic type) type-parameter generic-type-name 또는 generic-type-name < type-parameter-list > 'a list list<'a> Dictionary<'key, 'value>
구성 타입 — 구체적인 타입 인자를 받은 제네릭 타입 type-argument generic-type-name 또는 generic-type-name < type-argument-list > int option string list int ref option<int> list<string> ref<int> Dictionary<int, string>
매개변수가 하나인 함수 타입 parameter-type1 -> return-type int를 받아 string을 반환하는 함수의 타입은 int -> string
매개변수가 여러 개인 함수 타입 parameter-type1 -> parameter-type2 -> ... -> return-type intfloat를 받아 string을 반환하는 함수의 타입은 int -> float -> string
고차 함수를 매개변수로 받는 경우 ( function-type ) List.map의 타입은 ('a -> 'b) -> 'a list -> 'b list
대리자 (delegate) delegate of function-type delegate of unit -> int
유연 타입 (flexible type) # type-name #System.Windows.Forms.Control #seq<int>
주제 설명
[Primitive Types] 정수 타입, 불리언 타입, 문자 타입 같은 내장 단순 타입을 설명해요.
[Unit Type] 값이 하나뿐이고 ()로 표시되는 unit 타입을 설명해요. C#의 void, Visual Basic의 Nothing에 해당해요.
[Tuples] 임의의 타입 값들이 쌍, 삼중, 사중 등으로 묶인 튜플 타입을 설명해요.
[Options] 값을 갖거나 비어 있을 수 있는 option 타입을 설명해요.
[Lists] 같은 타입의 요소들로 이루어진, 순서가 있고 변경 불가능한 리스트를 설명해요.
[Arrays] 메모리의 연속된 블록을 차지하고 크기가 고정된, 같은 타입의 변경 가능한 요소 집합인 배열을 설명해요.
[Sequences] 논리적인 값의 나열을 나타내는 시퀀스 타입을 설명해요. 개별 값은 필요할 때만 계산돼요.
[Records] 이름 붙은 값들의 작은 묶음인 레코드 타입을 설명해요.
[Discriminated Unions] 값이 여러 가능한 타입 중 하나가 될 수 있는 판별 공용체 타입을 설명해요.
[Functions] 함수 값을 설명해요.
[Classes] .NET 참조 타입(reference type)에 해당하는 객체 타입인 클래스 타입을 설명해요. 클래스 타입은 멤버, 속성, 구현한 인터페이스, 기본 타입을 가질 수 있어요.
[Structs] .NET 값 타입(value type)에 해당하는 객체 타입인 구조체 타입을 설명해요. 보통 작은 데이터 묶음을 나타내죠.
[Interfaces] 특정 기능을 제공하는 멤버들의 집합을 나타내되 데이터는 갖지 않는 인터페이스 타입을 설명해요. 유용하려면 객체 타입이 인터페이스 타입을 구현해야 해요.
[Delegates] 함수를 객체로 나타내는 대리자 타입을 설명해요.
[Enumerations] 값이 이름 붙은 값들의 집합에 속하는 열거형 타입을 설명해요.
[Attributes] 다른 타입에 대한 메타데이터를 지정하는 데 쓰는 특성(attribute)을 설명해요.
[Exception Types] 오류 정보를 나타내는 예외를 설명해요.

더 알아보기 (Learn more)