We are Architect

상수(10) 본문

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) // 오류가 남.
}

 

 

*  상수 깊이 보기

  • 상수는 메모리 공간이 할당되지 않는다. 그냥 코드에 박혀있다.
  • 즉 동적 메모리 영역에 할당되지 않아서 좌변으로 사용할 수 없다. 왜냐 고정된 값이라 수정할 수 없기 때문.

'Programing > Go' 카테고리의 다른 글

Switch (12)  (0) 2025.01.12
if 문(11)  (0) 2025.01.11
함수(9)  (0) 2025.01.09
연산자(8)  (0) 2025.01.08
fmt 패키지를 통한 표준 입출력(7)  (0) 2025.01.06