1. 상수
상수란 값이 변하지 않는수를 말한다.
상수는 다음과 같이 선언 할수 있다.
const ConstValue int = 10
const : 상수 선언 키워드
ConstValue : 상수명
int : 타입
10 : 값
상수는 값이 변하지 않기 때문에 한번 선언을 하면 값을 바꿀수 없다.
즉 ConstValue = 10 에서 다른수로 바꿀수 없다.
예제)
package main
import "fmt"
func main(){
const pi1 float64 = 3.141592653589793228 //상수
var pi2 float64 = 3.141592653589793228
pi1 = 3
pi2 = 4
fmt.Printf("원주율: %f\n",pi1)
fmt.Printf("원주율: %f\n",pi2)
}
//pi1의 값을 변경해서 실행이 되지 않는다.
//원주율 3.141593
//원주율 4.000000
pi1은 상수로 선언했기 때문에 값을 바꿔주면 오류가 나서 실행이 되지 않는다.
2. 코드값으로 사용
코드란 숫자에 의미를 부여하는 것이다.
그 예로 아스키코드, UNICODE, UTF-8 등이 있다.
컴퓨터는 일반적으로 문자를 읽어낼수 없다. 따라서 문자들을 숫자로 바꿔서 읽는다.
65란 숫자가 오면 A와 같은 모양을 출력한다라고 설정을 해놓으면 A를 쓰고 싶을때 65를 컴퓨터에 보내주면 된다.
코드형태를 쓸때 상수값을 쓰기도 한다.
const Acode = 65
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(Cow)
PrintAnimal(Pig)
PrintAnimal(7)
}
//음메
//꿀꿀
//...
0에 Pig라는 의미를 부여하여 상수를 만들었다.
3. iota로 열거값 사용
상수선언을 많이 하기 때문에 간편하게 iota를 이용하여 선언할수 있다.
const(
Red int = iota //0
Blue int = iota //1
Green int = iota //2
)
iota는 0으로 시작해서 1씩 늘어난다. 여기서 더 코드를 줄일수 있는데 줄여보게 되면
const(
C1 uint = iota +1 // 1 = 0 + 1
C2 // 2 = 1 + 1
C3 // 3 = 2 + 1
)
첫줄에만 타입, 값들을 입력하면 두번째 줄부터는 똑같은 타입과 값이 들어간다.
4. iota응용
비트플래그
const (
BitFlag1 uint = 1<< iota // 1= 1<< 0 0000 0001
BitFlag2 // 2 = 1 <<1 0000 0010
BitFlag3 // 4 = 1 <<2 0000 0100
BitFlag4 // 8 = 1 <<3 0000 1000
)
예제 : 각 방에 불켜기
package main
import "fmt"
const (
MasterRoom uint8 = 1 << iota
LivingRoom
BathRoom
SmallRoom
)
func SetLight(rooms, room uint8) uint8 {
return rooms | room
}
func ResetLight(rooms, room uint8) uint8 {
return rooms &^ room
}
func IsLightOn(rooms, room uint8) bool {
return rooms&room == room
}
func TurnLights(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
rooms = SetLight(rooms, MasterRoom)
rooms = SetLight(rooms, BathRoom)
rooms = SetLight(rooms, SmallRoom)
rooms = ResetLight(rooms, SmallRoom)
TurnLights(rooms)
}
//안방에 불을켠다
//화장실에 불을켠다
비트플래그를 사용하지 않으면 변수를 많이 사용해줘야한다.
변수를 많이 사용하면 그만큼 메모리를 많이 사용한다.
5. 타입이 없는 상수
package main
import "fmt"
const PI = 3.14 //타입 없는 상수
const FloatPI float64 = 3.14 // float64 타입 상수
func main(){
var a int = PI * 100 //오류가 발생하지 않는다.
var b int = FloatPI * 100 // 타입 오류 발생
fmt.Println(a)
fmt.Println(b)
}
상수는 타입을 정하지 않아도 된다.
타입을 정하지 않으면 상수값이 쓰일때 타입이 자동으로 정해진다.
5. 상수 깊이 보기
동적메모리
프로그램을 실행하면 os가 그 프로그램을 위한 메모리공간을 만든다. 그리고 그 메모리 공간을 사용한다.
이를 동적메모리라고 하는데 상수는 동적메모리 공간을 사용하지 않고 코드에 박혀있다고 보면 된다.
L-value = R-value
L-value 에는 메모리 공간이 들어가고 R-value에는 값이 들어간다.
상수는 메모리공간을 사용하지 않기 때문에 좌변으로 사용할수 없다.
'개발 > Go' 카테고리의 다른 글
[Go] switch문 (0) | 2022.08.16 |
---|---|
[Go] if 문 (0) | 2022.08.15 |
[Go] 함수(function) (0) | 2022.08.10 |
[Go] 연산자 (0) | 2022.08.10 |
[Go] Golang fmt 패키지 (0) | 2022.08.03 |