산술 연산자(F#)
이 항목에서는 F# 언어에 사용할 수 있는 산술 연산자를 설명합니다.
이항 산술 연산자 요약
다음 표에는 unboxing된 정수 및 부동 소수점 형식에 사용할 수 있는 이항 산술 연산자가 요약 정리되어 있습니다.
이항 연산자 |
참고 |
---|---|
+(더하기) |
선택하지 않은 상태. 숫자를 함께 더했을 때 그 합이 해당 형식에서 지원하는 최대 절대값을 초과하면 오버플로 상태가 발생할 수 있습니다. |
-(빼기) |
선택하지 않은 상태. 부호 없는 형식을 뺀 경우 또는 부동 소수점 값이 너무 작아서 해당 형식으로 표현할 수 없는 경우 언더플로 상태가 발생할 수 있습니다. |
*(곱하기) |
선택하지 않은 상태. 숫자를 곱했을 때 그 곱이 해당 형식에서 지원하는 최대 절대값을 초과하면 오버플로 상태가 발생할 수 있습니다. |
/(나누기) |
정수 형식의 경우 0으로 나누면 DivideByZeroException이 발생합니다. 부동 소수점 형식의 경우 0으로 나누면 특수 부동 소수점 값인 +Infinity 또는 -Infinity를 구할 수 있습니다. 부동 소수점 숫자가 너무 작아서 해당 형식으로 표현할 수 없는 경우 언더플로 상태가 발생할 수도 있습니다. |
%(모듈러스) |
나누기 연산의 나머지를 반환합니다. 결과 값의 부호는 첫째 피연산자의 부호와 동일합니다. |
**(지수, 거듭제곱) |
결과가 해당 형식의 최대 절대값을 초과하면 오버플로 상태가 발생할 수 있습니다. 지수 연산자는 부동 소수점 형식에만 사용할 수 있습니다. |
단항 산술 연산자 요약
다음 표에는 정수 및 부동 소수점 형식에 사용할 수 있는 단항 산술 연산자가 요약 정리되어 있습니다.
단항 연산자 |
참고 |
---|---|
+(양수) |
모든 산술 식에 적용할 수 있습니다. 값의 부호를 변경하지 않습니다. |
-(부정, 음수) |
모든 산술 식에 적용할 수 있습니다. 값의 부호를 변경합니다. |
정수 형식에 대한 오버플로 또는 언더플로 상태에서는 래핑 동작이 이루어집니다. 따라서 결과가 올바르지 않게 될 수 있습니다. 정수 오버플로는 이를 처리하도록 소프트웨어를 작성하지 않은 경우 보안과 관련하여 매우 심각한 문제를 야기할 수 있습니다. 이러한 문제가 응용 프로그램에 큰 영향을 줄 수 있다면 Microsoft.FSharp.Core.Operators.Checked에 checked 연산자를 사용하는 것도 고려해 볼 수 있습니다.
이항 비교 연산자 요약
다음 표에는 정수 및 부동 소수점 형식에 사용할 수 있는 이항 비교 연산자가 요약 정리되어 있습니다. 이들 연산자는 bool 형식의 값을 반환합니다.
부동 소수점 숫자는 값이 같은지 여부를 직접 비교할 수 없습니다. IEEE 부동 소수점 표현은 완전히 같음 연산을 지원하지 않기 때문입니다. 코드를 조사하여 서로 같은 것으로 손쉽게 확인할 수 있는 두 숫자가 실제로는 해당 비트 표현이 서로 다를 수 있습니다.
Operator |
참고 |
---|---|
=(같음) |
이는 할당 연산자가 아닙니다. 이 연산자는 비교에만 사용됩니다. 이는 제네릭 연산자입니다. |
>(보다 큼) |
이는 제네릭 연산자입니다. |
<(보다 작음) |
이는 제네릭 연산자입니다. |
>=(크거나 같음) |
이는 제네릭 연산자입니다. |
<=(작거나 같음) |
이는 제네릭 연산자입니다. |
<>(같지 않음) |
이는 제네릭 연산자입니다. |
오버로드 및 제네릭 연산자
이 항목에서 설명하는 연산자는 모두 Microsoft.FSharp.Core.Operators 네임스페이스에서 정의됩니다. 일부 연산자는 정적으로 확인된 형식 매개 변수를 사용하여 정의됩니다. 즉, 해당 연산자에 사용할 수 있는 특정 형식 각각에 대해 개별 정의가 있습니다. 단항 및 이항 산술 연산자와 비트 연산자가 모두 이 범주에 속합니다. 비교 연산자는 제네릭 연산자이므로 기본 산술 형식뿐 아니라 모든 형식에 사용할 수 있습니다. 구별된 공용 구조체 및 레코드 형식에는 F# 컴파일러를 통해 생성되는 고유한 사용자 지정 구현이 있습니다. 클래스 형식에는 Equals 메서드가 사용됩니다.
제네릭 연산자는 사용자 지정할 수 있습니다. 비교 함수를 사용자 지정하려면 Equals를 재정의하여 고유한 사용자 지정 같음 비교를 제공한 다음 IComparable을 구현합니다. IComparable 인터페이스에는 CompareTo라는 메서드 한 개가 있습니다.
연산자 및 형식 유추
식에 연산자를 사용하면 해당 연산자를 기준으로 형식 유추가 제한됩니다. 또한 연산자를 사용하면 자동 일반화가 이루어지지 않습니다. 연산자를 사용한다는 것은 산술 형식을 전제로 하기 때문입니다. 다른 어떠한 정보도 없으면 F# 컴파일러는 산술 식의 형식으로 int를 유추합니다. 다른 형식을 지정하여 이 동작을 재정의할 수 있습니다. 따라서 다음 코드에서 function1의 인수 형식과 반환 형식은 int로 유추되지만 function2의 형식은 float로 유추됩니다.
// x, y and return value inferred to be int
// function1: int -> int -> int
let function1 x y = x + y
// x, y and return value inferred to be float
// function2: float -> float -> float
let function2 (x: float) y = x + y