상수 사용 이유
- 변하지 않을 값을 담을 때 사용
- 절대로 변경되면 안되는 값의 변경을 막아 안전하게 사용
상수 선언
-
올 수 있는 타입 : 기본 타입 (구조체, 배열 등 불가) ;불리언, 정수, 룬, 실수, 복소수, 문자열
```
const ConstValue int = 10
```
-
변수를 뜻하는 var 대신 상수를 뜻하는 const 키워드 사용
-
상수명 규칙은 변수명과 같습니다. ; 함수명도 동일
-
함수외부에 선언되어 있고 첫 글자가 대문자인 상수는 패키지 외부로 공개되는 상수이다.
-
값으로만 동작하기 때문에 대입문의 좌변에 올 수 없다.
상수 선언의 규칙을 지키지 않을 경우 아래 코드의 경우 처럼 오류가 발생한다.
package main
import "fmt"
func main() {
const C int = 10
var b int = C * 20
C = 20
fmt.Println(&C)
}
- cannot assign to C (constant 10 of type int) ; 상수 C에는 할당될 수 없다
- invalid operation: cannot take address of C (constant 10 of type int) ; 상수 C의 주소값을 가져올 수 없다. '&' 연산자를 사용하면 그 변수의 메모리 주솟값을 반환한다. 상수는 값으로만 동작하며 그에따라 접근할 수 있는 메모리 주솟값이 없기때문에 이를 출력시 다음과 같은 에러가 발생한다.
+ 부연설명
- 상수는 컴파일 타임에 리터럴로 전환되어 실행파일에 값 형태로 쓰이기 때문에 메모리 주솟값에 접근할 수 없는 것이다. 리터럴이란 고정된 값, 값 자체로 쓰인 문구를 말하는데 Go언어에서 상수를 이러한 리터럴과 같이 취급한다. 그래서 컴파일될 때 상수는 리터럴로 변환되어 실행파일에 쓰인다. 동적 할당 메모리 영역또한 사용하지 않는다.
한번더 정리!
- 상수는 값으로만 동작한다. 따라서 변수가 값, 이름, 타입, 메모리주소 4가지 속성을 가지는 반면 상수는 값, 이름, 타입 이렇게 3가지 속성만을 갖는다.