Programing/Go
상수(10)
the best infra
2025. 1. 10. 14:44
* 상수 란?
- 변하지 않는 수를 상수 라고 한다. 값이 변하지 않는다.
- go에서는 상수를 const라고 선언해 준다.
- 선언된 값은 바뀌지 않는다.
# const : 상수 선언 키워드
# ConstValue : 상수명
# int : 타입
# 10 : 값
const ConstValue int = 10
* 상수 예제
package main
import (
"fmt"
)
func main () {
const pi1 float64 = 3.14159265389793228 // 상수
var pi2 float64 = 3.14159265389793228 // 변수
pi1 = 3
pi2 = 4
fmt.Printf("원주율: %f\n", pi1)
fmt.Printf("원주율: %f\n", pi2)
}
- 실행 결과
- pi1에 값을 할당할 수 없다고 뜬다.
* 상수의 용도
- 상수는 코드값으로 사용한다. 특정 코드를 주로 사용해야 할 때 상수에 문자값을 넣고 불러와서 사용한다.
- ex) const Acode = 65
- 여기서 문자값은 아스키코드를 의미한다.
- 잠깐의 상식은 UTF-8의 문자값은 1 ~ 3 byte 정도 되고 ANSI는 문자값이 1bye 정도 된다.
* 상수 예제
- 숫자값에 의미를 부여해서 사용. > 사람을 위해서 사
package main
import (
"fmt"
)
const Pig int = 0
const Cow int = 1
const Chinken int = 2
func PrinAnimal(animal int) {
if animal == Pig {
fmt.Println("꿀꿀")
} else if animal == Cow {
fmt.Println("음메")
} else if animal == Chinken {
fmt.Println("꼬끼오")
} else {
fmt.Println("...")
}
}
func main () {
PrinAnimal(Pig)
PrinAnimal(0)
}
- 출력 결과 값
- 0 이나 Pig 나 들어가 있는 게 똑같기 때문에 동일하게 사용.
* iota로 열거값 사용
- 상수를 여러 개 한 번에 선언하기 위해서 사용.
- 앞에 const를 생략할 수 있다.
- 상수에 들어가는 값을 iota 타고 선언하면 뒤에 순서대로 오는 값이 +1씩 증가한다.
const (
Red int = iota // 0
Blue int = iota // 1
Green int = iota // 2
)
const (
C1 uint = iota + 1 // 1 = 0 + 1
C2 // 2 = 1 + 1
C3 // 3 = 2 + 1
)
// 비트 플래그에 iota 를 적용한 예제
// 비트 플래그 는 각자리 마다 의미를 부여할수 있게 하는 용도이다.
const (
Bitflag1 uint = 1 << iota // 1 << 0
Bitflag2 // 2 << 1
Bitflag3 // 4 << 2
Bitflag4 // 8 << 3
)
* 비트 플래그 예제
package main
import "fmt"
const (
MasterRoom uint8 = 1 << iota // 0000 0001
LivingRoom // 0000 0010
BathRoom // 0000 0100
SmallRoom // 0000 1000
)
func turnOn(rooms, room uint8) uint8 {
return rooms | room
}
func turnOff(rooms, room uint8) uint8 {
return rooms &^ room // 비트 반전
}
func IsLightOn(rooms, room uint8) bool {
return rooms&room == room
}
func switchLights(rooms uint8) {
if IsLightOn(rooms, MasterRoom) {
fmt.Println("안방에 불을 킨다")
}
if IsLightOn(rooms, LivingRoom) {
fmt.Println("거실에 불을 킨다")
}
if IsLightOn(rooms, BathRoom) {
fmt.Println("화장실에 불을 킨다")
}
if IsLightOn(rooms, SmallRoom) {
fmt.Println("작은방에 불을 킨다")
}
}
func main() {
var rooms uint8 = 0 // 0000 0000
rooms = turnOn(rooms, MasterRoom)
rooms = turnOn(rooms, BathRoom)
rooms = turnOn(rooms, SmallRoom)
rooms = turnOff(rooms, SmallRoom)
switchLights(rooms)
}
- 결과 값 출력
* 타입이 없는 상수
- 상수는 타입을 정하지 않아도 된다.
package main
import "fmt"
const PI = 3.14 // 타입이 없는 상수는 문자형태이다.
const FloatPI float64 = 3.14
func main(){
var a int = PI * 100 // 그러나 상수는 타입이 지정되지 않아서 쓰일때 타입이 정해짐 > 현재는 int로 변환됨
var b int = FloatPI * 100
fmt.Println(a) // 오류가 나지 않음.
fmt.Println(b) // 오류가 남.
}
* 상수 깊이 보기
- 상수는 메모리 공간이 할당되지 않는다. 그냥 코드에 박혀있다.
- 즉 동적 메모리 영역에 할당되지 않아서 좌변으로 사용할 수 없다. 왜냐 고정된 값이라 수정할 수 없기 때문.