본문 바로가기
Language/Golang

Golang (Go언어) 상수(Constant)

by HeeWorld 2024. 10. 30.

Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.

 

Golang 마스코트 Gopher(고퍼)

 

상수

- 변하지 않는 값

- 상수는 초기화된 값이 변하지 않음

- 정수, 실수, 문자열, 불리언, 룬(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