값이 필요한 위치에는 표현식을 사용합니다. 산술·비교 연산과 함수 호출은 값을 생성합니다. if와 match 구문 역시 값을 생성할 수 있습니다. 반면 대입은 역할이 다릅니다. 대입은 기존 가변 위치의 상태를 변경하는 문장이므로, 다른 표현식의 평가 값으로 사용할 수 없습니다.
결과가 보이는 프로그램부터 시작하기
다음 코드를 operators-expressions.tpz로 저장하세요.
function 점수(기준: int, 보너스: int) -> int {
let 두배 = 기준 * 2
if 보너스 > 0 { 두배 + 보너스 } else { 두배 }
}
let 결과 = 점수(20, 2)
let 정확 = 결과 == 42
let 다름 = 결과 != 41
print("{결과} {정확} {다름}")검사 후 실행합니다.
topaz check operators-expressions.tpz
topaz run operators-expressions.tpz출력 결과는 다음과 같습니다.
42 true true기준 * 2 연산을 + 보너스보다 먼저 수행합니다. 선택된 if 분기의 평가 값이 함수의 반환값입니다. == 연산자는 비교 가능한 두 값이 동등한지 검사하며, != 연산자는 두 값이 서로 다른지 검사합니다. 두 연산자 모두 기존 바인딩을 변경하지 않습니다.
하려는 일에 맞는 연산자 고르기
| 필요한 일 | 표기 | 구별할 점 |
|---|---|---|
| 산술 | +, -, *, /, %, ** | 숫자 피연산자는 동일한 int 또는 float 영역에 위치해야 함 |
| 순서·동등 비교 | <, <=, >, >=, ==, != | 비교 가능한 타입에만 적용 |
| 포함 여부 | value in collection | Map은 값 자체가 아니라 키를 기준으로 검색 |
| 조건부 계산 | left && right, left || right | 필요할 때만 우항을 평가 |
| 값이 없을 때 기본값 | value ?? fallback | nullable 값이나 Option을 합침 |
| Result 전파 | 후위 value? | 둘러싼 함수에서 Err를 반환하며 ??와 동작 방식이 다름 |
| 왼쪽에서 오른쪽으로 흐르기 | value |> next | 일반 이항 산술이 아니라 파이프라인 규칙 적용 |
| 변경 | target = value, +=, ??= | 값을 생성하는 표현식이 아니라 문장으로 동작 |
&& 연산자는 좌항이 true일 때만 우항을 평가합니다. || 연산자는 좌항이 false일 때만 우항을 평가합니다. 선행 조건이 성립해야만 수행할 수 있는 작업을 보호할 때 이러한 단락 평가가 유용합니다. ?? 연산자 역시 좌항에 값이 존재하면 기본값 평가를 건너뜁니다. 반면 후위 ? 연산자는 적용 범위가 다릅니다. Null·Option·결과·fault에서 둘러싼 함수로 실패를 전파하는 규칙을 확인하세요.
숫자와 동등성의 경계
int는 부호 있는 64비트 정수 타입입니다. 정수 나눗셈은 소수점을 0 방향으로 버립니다. 나머지 연산 결과는 피나눗수의 부호를 따릅니다. 정수 범위를 초과하거나 0으로 나누면 실행 오류가 발생합니다. 런타임에 결정되는 음수 정수 지수 연산도 실행 오류를 일으킵니다. 동일한 오류를 상수 식에서 확인하면 정적 오류가 됩니다. float는 IEEE-754 binary64 표준을 따릅니다. 부동소수점의 0 나눗셈과 NaN 역시 해당 모델을 따릅니다. int와 float 사이의 암묵적 변환은 지원하지 않습니다.
기본 타입 값·호환 레코드·Array·Option·Result·명목 값은 내부 타입이 비교 가능할 때만 비교할 수 있습니다. Array 동등성은 배열의 길이와 원소 순서를 기준으로 판단합니다. Map·Set 값·함수·리소스·템플릿 값은 동등 비교를 수행할 수 없습니다. 명목 동등성 비교는 필드를 검사하기 전에 동일한 enum·record·newtype 정체성인지 먼저 확인합니다.
연산자 우선순위는 호출·멤버 접근, 거듭제곱, 단항 연산, 곱셈, 덧셈, 범위, 비교, &&, ||, ??, 합성, 마지막으로 |> 순으로 낮아집니다. 전체 표를 외울 필요는 없으며, 결합 관계를 명확히 전달하는 것이 중요하다면 소괄호로 드러내세요.
흔한 실수 고치기
count++·count--·count **= 2는 토파즈 표기법이 아닙니다. 가변 바인딩의 값을 변경할 때는 count = count + 1처럼 직접 대입하세요. 동등 비교에 =를 사용하지 마세요. = 연산자는 가변 타깃을 변경하고, == 연산자는 불리언 값을 만듭니다.
비트 연산자·암묵적 숫자 승격·부동소수점 나머지 연산자·연산자 오버로딩·사용자 정의 연산자는 현재 영역 외입니다. 함수 합성은 명세에 포함되어 있으나, 본 문서의 일반 예제에서는 명명된 함수나 |>를 사용합니다.
연산자가 다루는 값은 타입 문서에서, 값을 생성하는 분기는 패턴과 제어 흐름 문서에서, |>의 정확한 흐름은 파이프라인과 플레이스홀더 문서에서 확인하세요.