그룹 표현식

그룹 표현식 (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)