갈루아의 반서재

정말 유용한 프로그램을 만들기 위해서는 2가지 새로운 컨셉인 변수와 제어흐름문에 대해 알아야 한다. 먼저 변수에 대해 살펴보자. 

변수는 특별한 타입과 연관된 이름을 갖는 저장소 위치이다. 앞서 챕터 2에서 만들었던 프로그램을 변수를 사용하도록 고쳐보자. 

1
2
3
4
5
6
7
8
package main
 
import "fmt"
 
func main() {
    var x string = "Hello World"
    fmt.Println(x)
}
cs

실행하면 다음과 같은 결과를 나타냅니다.

1
2
3
~/go/src/golang-book/chapter2# go run main.go
Hello World
 
cs

원 프로그램의 문자열 리터럴은 그대로 존재를 합니다만, 기존처럼 직접적으로 Println 함수로 보내지는 것이 아니라, 대신 그것을 변수에 할당을 하게 됩니다. Go 에서 변수는 var 키워드를 통해서 생성이 됩니다. 그리고 변수 이름 (여기서는 x) 과 타입(string)을 정하고, 해당 변수에 값 (Hello World)를 할당합니다. 다음과 같이 작성할 수도 있습니다.

1
2
3
4
5
6
7
8
9
package main
 
import "fmt"
 
func main() {
    var x string
    x = "Hello World"
    fmt.Println(x)
}
cs

Go 의 변수와 대수의 변수는 비슷하지만, 미묘한 차이가 있습니다. 

우선, 우리는 = 기호에 대해 보통 “x 는 문자열 Hello World 와 같다” 와 같이 읽는 경향이 있습니다. 그렇게 읽는 것이 잘못된 것은 아니지만, 다음과 같이 읽는 편이 낫습니다. “x 는 Hello World 라는 문자열을 가진다” 또는 “x 에는 Hello World 라는 문자열이 할당되었다”. 이러한 구별은 중요한데, 변수는 그 값을 변경할수 있기 때문이다. 

1
2
3
4
5
6
7
8
9
10
11
package main
 
import "fmt"
 
func main() {
    var x string
    x = "first"
    fmt.Println(x)
    x= "second"
    fmt.Println(x)
}
cs


1
2
3
~/go/src/golang-book/chapter2# go run main.go
first
second
cs

x = x + "second" 는, 변수 x 의 값과 문자열 리터럴 second 를 결합하여 변수 x 에 할당한다고 읽어야 한다. = 의 우측이 먼저 이루어지고, 그 결과가 = 좌측으로 할당되는 것이다. 

1
2
3
4
5
6
7
8
9
10
11
package main
 
import "fmt"
 
func main() {
    var x string
    x = "first"
    fmt.Println(x)
    x= x + "second"
    fmt.Println(x)
}
cs


1
2
3
4
~/go/src/golang-book/chapter2# go run main.go
first
firstsecond
 
cs

x = x + y 형태는 프로그래밍에서 흔한 것으로, Go 는 이를 위해 += 라는 특별한 할당문을 가지고 있다. 앞선 x = x + "second" 를 x += "second" 와 같이 작성할 수 있으며, 실행결과 역시 동일하다. 

Go 와 대수의 또 다른 점은 비교를 위해서 == 라는 다른 기호를 사용한다는 점이다. 

예를 들면, 

1
2
3
4
5
6
7
8
9
package main
 
import "fmt"
 
func main() {
    var x string = "hello"
    var y string = "world"
    fmt.Println(x == y)
}
cs

hello 는 world 와 같지 않으므로 이 프로그램은 false 를 출력해야 한다. 

1
2
3
4
5
6
7
8
9
package main
 
import "fmt"
 
func main() {
    var x string = "hello"
    var y string = "hello"
    fmt.Println(x == y)
}
cs

그리고 이 프로그램은 true 를 출력해야 한다. 

기본값을 주고 변수를 생성하는 경우가 많아 다음과 같은 축약된 형태도 가능하다. 

1
2
:= "Hello World"
 
cs

= 앞에 : 이 위치하고, 타입이 선언되지 않았다. Go 컴파일러가 변수에 할당한 리터럴값으로부터 그 타입을 추론하기 때문에 타입 선언이 반드시 필요한 것은 아니다. 

1
var x = "Hello World"
cs

다른 타입에 대해서도 마찬가지다.

1
2
3
:= 5
 
fmt.Println(x)
cs


Constants

상수 역시 변수이다. 다만 그 값이 바뀌지 않을 뿐이다. 변수와 마찬가지 방식으로 생성할 수 있으며, var 키워드를 쓰는 대신 const 키워드를 사용한다는 점이 다르다.

1
2
3
4
5
6
7
8
9
10
package main
 
import "fmt"
 
func main() {
  const x string = "Hello World"
  fmt.Println(x)
}
 
 
cs

실행하면 다음과 같다.

1
2
3
~/go/src/golang-book/chapter2# go run main.go
Hello World
 
cs

다음과 같이 라인 7에서 x 에 또 다른 값을 할당하면 아래에서 보듯이 cannot assign to x 에러가 발생한다. 

1
2
3
4
5
6
7
8
9
package main
 
import "fmt"
 
func main() {
  const x string = "Hello World"
  x = "Some other string"
  fmt.Println(x)
cs


1
2
3
4
~/go/src/golang-book/chapter2# go run main.go
# command-line-arguments
./main.go:7:5: cannot assign to x
 
cs

상수는 공통적으로 사용하는 값을 재사용하는 측면에서 좋은 기술방법이라고 할 수 있다.


Defining Multiple Variables

여러 개의 변수는 다음과 같이 정의할 수 있다.

1
2
3
4
5
var (
  a = 5
  b = 10
  c = 15
)
cs

var 또는 const 키워드 다음 ( ) 안에 한 줄에 하나의 변수를 넣으면 된다. 


예제

아래 예제는 수를 입력하면 입력된 수의 2배를 출력해주는 프로그램이다. 

1
2
3
4
5
6
7
8
9
10
11
package main
 
import "fmt"
 
func main() {
  fmt.Print("Enter a number: ")
  var input float64
  fmt.Scanf("%f"&input)
  output := input * 2
  fmt.Println(output)
}
cs

사용자의 입력을 읽어내기 위해 fmt 패키지에서 Scanf 함수를 사용했다. &input 에 대해서는 향후 설명할 예정이다. 

실행하면 다음과 같다. 

1
2
3
4
~/go/src/golang-book/chapter2# go run main.go
Enter a number: 1115
2230
 
cs