들어가며
sizeof는 일반적인 +, -, /, * 와 달리 함수 처럼 생긴 연산자로 유명하다.
연산자에 대한 글을 작성하다 sizeof에 대한 이야기를 해야 하는데 막상 필자도 sizeof는 연산자라는게 당연하다고만 생각했지 왜라는 의문은 한번도 가지지 않았다는 것을 깨닫고 이번 기회에 이유를 찾아 정리하게 되었다.
이런 개념은 몰라도 크게 지장은 없지만 면접 보거나 심심풀 주제로 좋으므로 흥미 삼아 읽어 보도록 하자.
C++ 연산자란
C++ 연산자(operator)란, 하나 이상의 피연산자(operand)에 대해 특정 연산을 수행하는 기호 또는 키워드를 말한다.
예를 들어 :
- 산술 연산자 : +, -, *, /
- 비교 연산자 : ==, !=, <, >
- 논리 연산자 : &&, ||, !
- 대입 연산자 : =
와 같은 다양한 연산자들이 있으며, 외에도 객체의 멤버에 접근 및 호출하는 연산자 등이 있으며 객체의 크기를 계산해 주는 sizoeof도 연산자에 포함된다.
sizeof도 연산자인가?
결론 부터 말하자면 그렇다. sizeof는 함수 처럼 괄호를 사용하지만 실제로는 컴파일러가 특별 처리하는 예약된 연산자다.
함수(Function)
- 명시적으로 정의 되며, 호출 시 스택 프레임이 만들어짐
- 인자 평가 후 '런타임'에 동작(일반 함수)
- 예 : std::max(a, b), std::sqrt(x)
연산자(operator)
- C++ 언어 레벨에서 문법적으로 특별하게 정의 된 '구문 단위'
- 일부는 컴파일 타임에 처리 됨
- 피연산자 수와 우선순위를 가지며, 오버로딩 가능한 경우가 많음
- 예 : +, -, sizeof, typeid, dynamic_cast 등
sizeof는?
함수는 입력 -> 출력의 일반적인 흐름을 따르지만 sizeof 연산자는 컴파일러가 특별한 문맥에서 처리하며, 일반적인 함수 호출 규칙으로는 불가능한 동작을 수행한다.
- 컴파일 타임에 평가 되어 타입 또는 식(expression)의 바이트 크기를 반환
- 함수는 런타임에 평가 되므로 컴파일 타임에 타입 크기를 알 수 없음.
마치며
sizeof가 함수 처럼 보이는 것은 단지 문법적 편의성을 위해 괄호를 사용한다는 것 뿐이며, 본질은 컴파일러가 특별히 해석하는 연산자다.
sizeof 연산자와 비슷한 케이스로 typeid, static_cast dynamic_cast, reinterpret_cast, const_cast 와 같은 연산자들이 있다.
부록 1. 같이 읽으면 좋은 글