상수
상수 (Constants)
Go에서는 변수에 값을 담는 것만으로 끝나지 않아요. 일단 정해지면 프로그램이 끝날 때까지 바뀌지 않는 상수(constant) 라는 개념도 따로 있어요. 이번엔 상수가 어떤 종류로 나뉘는지, 값이 정확히 어디까지 보장되는지, 그리고 '타입이 없다'는 게 무슨 뜻인지를 하나씩 풀어볼게요.
출처: Go Specification
본문
상수에는 boolean 상수, rune 상수, integer 상수, floating-point 상수, complex 상수, 그리고 string 상수가 있어요. 이 중 rune, integer, floating-point, complex 상수를 묶어서 numeric 상수라고 불러요.
상수 값은 다음과 같은 것들로 표현돼요.
- rune, integer, floating-point, imaginary, string 리터럴(literal)
- 상수를 가리키는 식별자(identifier)
- 상수 표현식(constant expression)
- 결과가 상수인 변환(conversion)
- 상수 인자에 적용된 일부 내장 함수의 결과 값. 예를 들어
min이나max, 특정 값에 적용된unsafe.Sizeof, 어떤 표현식에 적용된cap이나len, complex 상수에 적용된real과imag, numeric 상수에 적용된complex같은 것들이죠.
boolean 참·거짓 값은 미리 선언된 상수 true와 false로 표현돼요. 그리고 미리 선언된 식별자 iota는 integer 상수를 나타내죠.
일반적으로 complex 상수는 상수 표현식의 한 형태라서, 그 자세한 내용은 상수 표현식 절에서 다루게 돼요.
numeric 상수는 임의의 정밀도로 정확한 값을 나타내며 오버플로우가 발생하지 않아요. 그래서 IEEE 754의 음의 영(negative zero), 무한대(infinity), 아닌 값(NaN)을 나타내는 상수는 존재하지 않아요.
상수는 타입이 있을 수도 있고 타입이 없을 수도(untyped) 있어요. 리터럴 상수, true, false, iota, 그리고 untyped 상수 피연산자만으로 이루어진 특정 상수 표현식은 untyped예요.
상수에게 타입은 크게 두 가지 경로로 주어져요. 하나는 상수 선언이나 변환을 통해 명시적으로 주는 것, 또 하나는 변수 선언, 대입문, 표현식의 피연산자로 사용될 때 암묵적으로 주어지는 거예요. 이때 상수 값이 해당 타입의 값으로 표현될 수 없다면 오류가 나요. 만약 타입이 타입 파라미터(type parameter)라면, 상수는 그 타입 파라미터의 비상수(non-constant) 값으로 변환돼요.
untyped 상수는 기본 타입(default type) 을 가져요. 이 기본 타입은 타입이 필요한 문맥에서 상수가 암묵적으로 변환되는 타입인데, 예를 들어 명시적 타입이 없는 짧은 변수 선언 i := 0 같은 경우에 쓰이죠. untyped 상수의 기본 타입은 상수가 boolean, rune, integer, floating-point, complex, string 중 어떤 것이냐에 따라 각각 bool, rune, int, float64, complex128, string이 돼요.
한 가지 구현 제약(implementation restriction)이 있어요. 언어 수준에서 numeric 상수는 임의의 정밀도를 갖지만, 컴파일러는 내부적으로 제한된 정밀도의 표현을 쓸 수 있어요. 다만 그렇게 하더라도 모든 구현은 다음을 반드시 지켜야 해요.
- integer 상수를 최소 256비트로 표현할 것.
- complex 상수의 각 부분을 포함한 floating-point 상수를, 최소 256비트의 가수(mantissa)와 최소 16비트의 부호 있는 이진 지수로 표현할 것.
- integer 상수를 정확히(precisely) 표현할 수 없으면 오류를 낼 것.
- 오버플로우 때문에 floating-point나 complex 상수를 표현할 수 없으면 오류를 낼 것.
- 정밀도 제한 때문에 floating-point나 complex 상수를 표현할 수 없으면 가장 가까운 표현 가능한 상수로 반올림할 것.
이 요구사항은 리터럴 상수뿐 아니라 상수 표현식을 평가한 결과에도 동일하게 적용돼요.
더 알아보기
- 상수를 다루는 문법과 규칙은 Go Specification - Constants 절에서 확인할 수 있어요.
iota를 이용한 상수 자동 증가 패턴은 Go Specification - Iota 문서를 참고해 보세요.- 상수끼리 연산할 때의 타입과 정밀도 규칙은 Go Specification - Constant expressions에서 다뤄요.