그룹 표현식
그룹 표현식 (Grouped Expressions)
표현식 안에서 괄호로 묶인 부분을 그룹 표현식이라고 불러요. 단순해 보이지만, 연산자 우선순위를 바꾸거나 장소 표현식(place expression)의 성격을 유지하는 데 꽤 중요한 역할을 해요. 이 글에서 그 규칙을 정리해 볼게요.
출처: Rust Reference
본문
구문 (Syntax)
괄호로 묶인 표현식은 단일 표현식을 감싸서, 그 표현식으로 평가돼요. 구문은 (, 그리고 감싸인 피연산자(enclosed operand)라고 부르는 표현식 하나, 마지막으로 ) 로 구성돼요.
GroupedExpression → ( Expression )
평가 규칙
괄호로 묶인 표현식은 감싸인 피연산자의 값으로 평가돼요.
장소 표현식인가 값 표현식인가
괄호로 묶인 표현식은 감싸인 피연산자가 장소 표현식이면 장소 표현식이 되고, 값 표현식이면 값 표현식이 돼요. 즉 괄호가 표현식의 '종류'를 바꾸지 않는 거죠.
우선순위 바꾸기
괄호는 표현식 안의 하위 표현식들의 우선순위를 명시적으로 바꾸는 데 사용될 수 있어요. 다음 예시를 볼게요.
#![allow(unused)]
fn main() {
let x: i32 = 2 + 3 * 4; // not parenthesized
let y: i32 = (2 + 3) * 4; // parenthesized
assert_eq!(x, 14);
assert_eq!(y, 20);
}
x는 곱셈이 먼저라 2 + 12 = 14가 되고, y는 괄호로 덧셈을 먼저 묶어서 5 * 4 = 20이 돼요.
괄호가 반드시 필요한 경우
괄호가 필수적인 대표적인 경우가 하나 있는데, 바로 구조체의 멤버인 함수 포인터를 호출할 때예요. 다음 예시를 볼게요.
#![allow(unused)]
fn main() {
struct A {
f: fn() -> &'static str
}
impl A {
fn f(&self) -> &'static str {
"The method f"
}
}
let a = A{f: || "The field f"};
assert_eq!( a.f (), "The method f");
assert_eq!((a.f)(), "The field f");
}
a.f()는 f가 메서드로 해석되어 "The method f"를 반환하고, (a.f)()는 f가 필드(함수 포인터)로 해석되어 "The field f"를 반환해요. 여기서 괄호를 빼면 필드인 함수 포인터를 호출할 방법이 없어지죠.
더 알아보기 (Learn more)
- 표현식 (Expressions) — 표현식의 전체 구조와 종류
- 호출 표현식 (Call expressions) — 함수 호출의 규칙
- 장소 표현식과 값 표현식 — 두 표현식 종류의 차이