변수와 상수
변수와 상수의 선언과 초기화를 해보자.
프로그램에서 선언이란
프로그램은 '값'
이 있어야 그 존재 가치가 있기 때문입니다. 값을 입력, 출력하고 연산하기 위해서는 꼭 메모리 공간이 필요합니다. 그래서 맨 처음에 해야하는 것이 어떤 형의 값을 저장할 공간을 선언하는 것입니다.
변수
Go언어에서의 변수 선언 방식은 var 변수이름 변수형
입니다. 그리고 변수를 선언한 곳에서 바로 초기값을 설정할 수 있습니다. 그리고 Go에서 변수를 선언할 때 가장 큰 특징은 'Short Assignment Statement'
라고 불리는 :=
입니다. 이를 사용하면 별다른 형 선언 없이 타입 추론이 가능합니다. 하지만 주의해야할 점은 이 용법은 함수(func)
내에서만 사용이 가능합니다. 따라서 함수 밖에서(전역 변수)
는 꼭 var 키워드
를 선언해줘야합니다.
var a int = 1
var b string = "Hello"
c := 1
d := "Hello"
다른 언어와 마찬가지로 Go언어도 동일한 형의 변수를 한 번에 여러개 선언할 수 있습니다. 이때 변수의 개수와 초기화하는 값의 개수가 동일해야합니다. 만약 초기화하지 않는다면 모든 값을 초기화 하지 않아야합니다.
package main
import "fmt"
func main() {
var a, b int = 10, 20
fmt.Println(a, b)
i, j, k := 1, 2, 3
fmt.Println(i, j, k)
}
Go언어는 이름이 먼저오고 그 다음에 타입이 옵니다. 이러한 선언 방식에 대해서는 인간의 언어에 좀 더 가깝게 하기 위해서인데, 예컨데 var a string은 “변수 a는 스트링이다.”라는 식으로 해석 할 수 있기 때문에 직관적입니다.
주의점
Go언어에서는 변수를 선언하고 초기값을 설정하지 않으면 'Zero value'
로 설정됩니다. bool 타입은 false
, 숫자 타입은 0
, string 타입은 ""(빈 문자열)
으로 입니다. 사실 변수의 선언 뿐만이 아니라 모든 선언에서 동일하게 적용됩니다. Go언어에서는 선언만 하고 쓰지 않았다면 에러를 발생하며 컴파일에 실패합니다. 이는 변수, 패키지, 함수 등 모든 선언에서 동일하게 적용됩니다.
상수
앞에서 배운 변수
는 초기화된 이후에 다른 값으로 수정될 수 있습니다. 그런데 '상수'
는 한 번 초기화되면 그 후에 수정될 수 없습니다. 상수는 다른 언어들과 동일하게 const
키워드로 선언하고 초기화합니다. 선언 형태는 const 상수이름 상수형
입니다. 상수형은 생략 가능하며 함수 밖에서도 동일한 용법이 적용됩니다. 초기화 후에 사용하지 않아도 에러가 발생하지 않습니다. 변수와 다르게 상수는 명시하는 것 자체에 의미가 있기 때문입니다. 상수는 var
키워드 대신에 const
키워드를 사용하고 생략할 수 없기 때문에 자연스럽게 :=
용법을 사용할 수 없습니다. 한번 선언 및 초기화되면 수정할 수 없기 때문에 꼭 선언과 동시에 초기화를 해야합니다. 선언만 한다면 에러가 발생합니다.
package main
import "fmt"
const username = "kim"
func main() {
const a int = 1
const b, d= 10, 20 //여러 값을 초기화
const c = "goorm"
fmt.Println(username)
}
그리고 상수는 변수와 다르게 괄호()를 이용해 여러 개의 값을 묶어서 초기화할 수 있으며, 다른 형이더라도 초기화할 수 있습니다.
const (
상수이름1 = 값1
상수이름2 = 값2
...
)
괄호로 같이 묶여있는 상수들은 다른 형으로 초기화될 수 있습니다. 각 상수들 사이에 콤마(,)
를 입력하면 안 됩니다. 입력하면 에러가 발생합니다. 묶어서 선언된 상수들 중에서 첫번째 값은 꼭 선언되어야 합니다. 선언되지 않은 값은 바로 전 상수의 값을 가집니다. iota
라는 식별자를 값으로 초기화하면 그 후에 초기화하지 않고 이어지는 상수들은 순서(index)
가 값으로 저장됩니다.
package main
import "fmt"
const (
c1 = 10 //첫 번째 값은 무조건 초기화해야 함
c2
c3
c4 = "goorm" //다른 형 선언 가능
c5
c6 = iota //c8까지 index값 저장
c7
c8
c9 = "earth"
c10
c11 = "End"
)
func main() {
fmt.Println(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11)
}