무지개곰
article thumbnail
반응형

변하지 않는 값을 사용하여야 할 때 상수로 값을 선언하여 프로그래밍합니다. 상수를 어떻게 선언하는지 어떻게 사용하는지 알아보겠습니다.

목차

상수 선언

상수 특징

상수 활용 (비트 플래그)


상수 선언

상수는 const라는 예약어를 사용하여 선언합니다.

const PI float = 3.14

이와 같이 const를 하나의 상수를 선언할 수 있고

const (
    Kilo = 1000
    Mega = 1000000
    Gega = 1000000000
)

소 괄호를 이용하여 한번에 많은 상수를 선언할 수 있습니다.

iota 활용

위와 같이 소 괄호를 이용한 방법도 편리하지만 Go를 배우며 계속 놀라는 점이 문법의 편의성입니다.

상수를 선언할 때 iota를 활용하여 순차적으로 1씩 증가시키며 선언할 수 있습니다.

const (
    Monday = iota  // 0
    Tuesday        // 1
    Wednesday      // 2
    Thursday       // 3
    Friday         // 4
    Saturday       // 5
    Sunday         // 6
)

iota는 0부터 시작하여 순차적으로 1씩 증가하며 상수에 값을 입력합니다.


상수 특징

다른 언어의 특징은 모르겠지만 Go를 배우며 타입이 있는 상수와 타입이 없는 상수가 존재한다는 특이한 특징이 있다는 것을 알았습니다.

package main

import "fmt"

const (
    testInt int = 8
    testNum = 8
)

func main() {
    var a uint16 = testInt * 10
    var b uint16 = testNum * 10
}

위와 같이 상수를 선언할 때 type을 지정하게 되면 testInt는 int타입이 되어 a를 선언 시 타입이 맞지 않아 오류가 발생합니다.

하지만 testNum과 같이 type을 지정하지 않고 선언을 하게 되면 type이 지정되어 있지 않기에 b를 선언 시 오류가 발생하지 않습니다.

타입까지 확실한 변수가 필요한 경우는 type을 선언하는 것이 중요할 것 같고 type이 자유롭게 적용되어야 하는 경우라면 type을 선언하지 않고 사용하여야 하는 등 상황에 맞게 유용하게 사용할 수 있을 것 같습니다.


상수 활용 (비트 플래그)

iota를 이용하여 상수를 선언하는 경우 비트플래그를 활용할 수 있습니다.

이전에 게임 개발을 공부하였던 분에게 들은 방식으로 게임 내의 상태이상을 편리하게? 관리하는 방법이라고 들었던 내용입니다.

package main

import "fmt"

const (
	Blind uint8 = 1 << iota  // 0000 0001
	Burn                     // 0000 0010
	Cold                     // 0000 0100
	Paralyze                 // 0000 1000
)

func SetState(states, state uint8) uint8{
    return states | state
}

func ResetState(states, state uint8) uint8{
    return states &^ state
}

func IsStateOn(states, state uint8) bool {
    return states & state == state
}

func CheckState (states uint8) {
    if IsStateOn(states, Blind) {
        fmt.Println("Blind 적용중")
    }
    if IsStateOn(states, Burn) {
        fmt.Println("Burn 적용중")
    }
    if IsStateOn(states, Cold) {
        fmt.Println("Cold 적용중")
    }
    if IsStateOn(states, Paralyze) {
        fmt.Println("Paralyze 적용중")
    }
}

func main () {
    var states uint8 = 0
    states = SetState(states, Blind)
    states = SetState(states, Slow)
    
    states = ResetState(states, Blind)
    
    CheckState(states)
}

예시가 길지만 비트 플래그를 통하여 위와 같이 상태를 관리할 수 있습니다.

iota를 활용하여 각 상태를 지정하고 2진으로 관리되는 비트의 자리 수를 활용한 비트 연산자의 계산으로 각 상태를 적용, 해제하기도 하며 확인도 할 수 있습니다.

Node를 활용하여 백엔드를 구축할 때 비트 플래그를 사용해 본 적은 없지만 특정 상황에 따라 유용할 것 같아 소개드렸습니다.

 

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!