오퍼랜드
오퍼랜드 (Operands)
표현식이 아무리 복잡해져도 그 바닥에는 결국 하나의 값으로 평가되는 가장 작은 조각들이 있어요. 이 조각을 오퍼랜드(Operand) 라고 불러요. 표현식에서 기본이 되는 그 값, 즉 더 이상 쪼개지 않는 단위를 말하죠. 이번 글에서는 오퍼랜드가 정확히 어떤 것들로 구성되는지 하나씩 살펴볼게요.
출처: Go Specification
본문
오퍼랜드는 표현식 안에서 기본이 되는 값을 나타내요. 오퍼랜드가 될 수 있는 것은 크게 세 가지예요.
- 리터럴(literal) — 말 그대로 값을 직접 적어 놓은 것
- 비어 있지 않은 식별자(non-blank identifier) — 상수·변수·함수를 가리키는 이름. 여기에는 (점으로 구분된) 한정된(qualified) 식별자도 포함돼요
- 괄호로 감싼 표현식 —
(x + 1)처럼 괄호 안에 표현식이 들어 있는 형태
이 구조를 문법으로 표현하면 다음과 같아요.
Operand = Literal | OperandName [ TypeArgs ] | "(" Expression ")" .
Literal = BasicLit | CompositeLit | FunctionLit .
BasicLit = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .
OperandName = identifier | QualifiedIdent .
이 중 OperandName이 제네릭 함수(generic function) 를 가리킬 때는 그 뒤에 타입 인자(type argument) 목록을 붙일 수 있어요. 그렇게 만들어진 오퍼랜드는 인스턴스화된(instantiated) 함수가 돼요.
한 가지 꼭 기억할 규칙이 있어요. 빈 식별자(blank identifier, _) 는 오퍼랜드로 쓰일 때 대입문(assignment statement)의 왼쪽에서만 나타날 수 있어요. 다른 곳에서는 쓸 수 없죠.
마지막으로 구현 제한(implementation restriction) 도 하나 알아둘게요. 컴파일러는 오퍼랜드의 타입이 빈 타입 집합(empty type set) 을 가진 타입 파라미터일 때 굳이 오류를 보고하지 않아도 돼요. 다만 이런 타입 파라미터를 가진 함수는 인스턴스화할 수 없고, 인스턴스화하려는 시도는 그 자리에서 오류로 이어져요. 즉 에러가 '선언 시점'이 아니라 '인스턴스화 시점'에 나온다는 것이죠.
더 알아보기
- 오퍼랜드는 표현식의 가장 아래 단위예요. 더 큰 조각이 궁금하다면 Primary expressions 쪽을 봐요.
- 오퍼랜드 이름에 붙는 한정자(점 표기)는 Qualified identifiers에서, 타입 인자로 인스턴스화하는 건 Instantiations에서 다뤄요.
- 빈 식별자
_의 역할과 제약은 Blank identifier 에서 확인할 수 있어요.