Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.
상수
- 변하지 않는 값
- 상수는 초기화된 값이 변하지 않음
- 정수, 실수, 문자열, 불리언, 룬(rune), 복소수 만 기본 타입값들만 상수로 선언될 수 있음
- 구조체, 배열 등 기본타입(Primitive)이 아닌 타입(Complex)에는 상수를 사용할 수 없음
- 상수는 첫 번째로 변하면 안되는 값에 사용하고, 두 번째로 코드 값을 통해서 숫자에 의미를 부여할 때 사용
상수 선언
- 상수를 뜻하는 Constant의 약자인 const를 사용하여 선언
- 상수는 한 번 선언되면, 그 값을 바꿀 수 없음
- 상수는 값으로만 동작하기 때문에 대입문의 좌변에 올 수 없음
const ConstValue int = x
- const: 상수 선언 키워드
- ConstValue: 상수명
- int: 타입
- x: 값
package main
import "fmt"
func main() {
const pi1 float64 = 3.141592653589793238 // 상수
var pi2 float64 = 3.141592653589793238 // 변수
// pi1 = 3
pi2 = 4
fmt.Printf("원주율: %f\n", pi1)
fmt.Printf("원주율: %f\n", pi2)
}
// 결과
원주율: 3.141593
원주율: 4.000000
pi1 = 3으로 변경하려고 하면, "cannot assign to pi1 (declared const)" 라고 뜨며 오류가 발생
코드 값으로 사용하기
- 코드 값이란, 어떤 숫자에 의미를 부여하는 것을 의미
package main
import "fmt"
const pig int = 0
const cow int = 1
const chicken int = 2
func PrintAnimal(animal int) {
if animal == pig {
fmt.Println("꿀꿀")
} else if animal == cow {
fmt.Println("음메")
} else if animal == chicken {
fmt.Println("꼬끼오")
} else {
fmt.Println("...")
}
}
func main() {
PrintAnimal(pig)
PrintAnimal(cow)
PrintAnimal(chicken)
}
// 결과
꿀꿀
음메
꼬끼오
iota로 열거 값 사용
- 코드 값으로 사용하기 때문에 1,2,3 ... 처럼 1씩 증가하도록 정의할 때 iota 키워드를 사용하면 편리함.
* iota는 그리스 알파벳의 9번째 글자로, 아주 작은 양을 뜻함.
package main
const (
red int = iota
blue int = iota
green int = iota
)
func main() {
println(red)
println(blue)
println(green)
}
// 결과
0
1
2
- 만약 첫 번째 값과 똑같은 규칙이 계속 적용된다면 타입과 iota를 생략할 수 있음.
package main
const (
c1 uint = iota + 1 // 1 = 0 + 1
c2 // 2 = 1 + 1
c3 // 3 = 2 + 1
)
func main() {
println(c1)
println(c2)
println(c3)
}
// 결과
1
2
3
타입이 없는 상수
- 상수 선언 시, 타입을 명시하지 않을 수 있음
- 타입을 정하지 않으면, 상수 값의 타입은 상수 값이 쓰일 때 결정 됨
package main
import "fmt"
const PI = 3.14
const FloatPI float64 = 3.14
func main() {
var a int = PI * 100
var b int = FloatPI * 100
fmt.Println(a)
fmt.Println(b)
}
// 결과
var b int = FloatPI * 100 로 인해 오류 발생
const PI = 3.14
- 타입 값이 없기 때문에 숫자 그대로 3.14로 동작
const FloatPI float64 = 3.14
- FloatPI는 float64 타입의 상수이며, 값은 3.14
var a int = PI * 100
- PI * 100은 3.14 * 100으로 치환되어 계산 결과는 314
var b int = FloatPI * 100
- Go에서는 모든 연산의 양변(피연산자)들이 모두 같은 타입이어야 하는데, 좌변은 int 우변은 float64이기에 오류 발생
✓ 타입이 없는 상수는 리터럴(literal) 문자 형태라고 볼 수 있음
→ 리터럴이란 고정된 값, 값 자체로 쓰인 문구라고 볼 수 있음
✓ Go에서 상수는 리터럴과 같이 취급하여, 컴파일될 때 상수는 리터럴로 변환되어 실행 파일에 쓰임
✓ 상수 표현식은 컴파일 타임에 실제 결괏값 리터럴로 변환하기 때문에 상수 표현식 계산에 CPU 자원을 사용하지 않음
✓ 상수의 메모리 주솟값에 접근할 수 없는 이유도 컴파일 타임에 리터럴로 전환되어 실행 파일에 값 형태로 쓰이기 때문,
그래서 동적 할당 메모리 영역을 사용하지 않음.
상수는 좌변으로 사용할 수 없다!
L-value (메모리 공간) = R-value (값)
값을 공간에 카피하라는 것이 대입인데 ,상수는 항상 값(우측)으로만 사용되어야 함.
'Language > Golang' 카테고리의 다른 글
Golang (Go언어) Switch문 (조건문) (4) | 2024.10.31 |
---|---|
Golang (Go언어) IF문 (조건문) (4) | 2024.10.30 |
Golang (Go언어) 함수(Function) (2) | 2024.10.30 |
Golang (Go언어) 연산자(Operator) (0) | 2024.10.26 |
Golang (Go언어) fmt 패키지 (3) | 2024.10.26 |