Skip to content

Latest commit

 

History

History
218 lines (158 loc) · 7.64 KB

2.03.md

File metadata and controls

218 lines (158 loc) · 7.64 KB

2.03 Short Declaration Operator

프로그래밍 용어(programming terminology)에 대하여 살펴보도록 하자.

:=는 short variable declaration 라고 하며, 이는 값(value)을 변수(variable)에 할당(assign)할 때 사용한다. 예를 들면, 값(value) 42를 변수(variable) x에 대입 (assign)하면 아래와 같다.

package main

import (
	"fmt"
)

func main() {
	x := 42
	fmt.Println("Hello, playground")
}

Short declaraion은 코드 블록(code block)안에서만 사용할 수 있다. Go의 경우, 여러분들이 코드에서 생성한 변수는 반드시 사용하게끔 되어 있기 때문에, 위의 코드는 다음과 같은 에러 메시지를 발행한다: tmp/sandbox141801923/main.go:8: x declared and not used.

만약에 여러분이 x를 출력한다면, 더이상 위의 메시지를 표시하지 않을 것이다.
우리는 또한 short declaration operator를 이용하여 다른 타입의 데이터를 변수에 배정(assign)할 수 있다. 예를 들면, string 타입을 아래와 같이 사용 가능 하다.

package main

import (
	"fmt"
)

func main() {
	x := 42
	y := "James Bond"
	fmt.Println(x, y)
}

연산자(operators)와 피연산자(operands), statements, expressions 그리고 키워드(keywords)에 대하여 알아보자.

프로그래밍 언어는 예약어(reserved words) 라고 알려진 키워드(keywords) 를 포함하고 있다. 이것들은 프로그래밍 언어가 사용하는 단어(words)라고 하며, 변수명(variable names)으로써 사용할 수 없다. 예를 들면, 고 언어에서, 단어(word)인 "package"는 예약어(reserved word)이기 때문에 유저가 변수 명으로 사용할 수 없다.

만약 여러분들이 "package"라는 단어(word)를 하나의 변수명(a variable name)으로서 사용하면, 다음과 같은 에러를 얻게 될 것이다: tmp/sandbox916074896/main.go:8: syntax error: unexpected package, expecting }

package main

import (
	"fmt"
)

func main() {
	package := 42
	y := "James Bond"
	fmt.Println(package, y)
}

그러나, 단어를 변형(variations)한 "packages"와 같은 이름은 사용할 수 있다. "package"와 같은, 언어에서 정의하는 예약어와 정확히 일치하는 이름만 예약어(reserved word) 로서 사용되기 때문이다.

package main

import (
	"fmt"
)

func main() {
	packages := 42
	y := "James Bond"
	fmt.Println(packages, y)
}

Go Keywords

break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var

Operators and Delimiters

+    &     +=    &=     &&    ==    !=    (    )
-    |     -=    |=     ||    <     <=    [    ]
*    ^     *=    ^=     <-    >     >=    {    }
/    <<    /=    <<=    ++    =     :=    ,    ;
%    >>    %=    >>=    --    !     ...   .    :
     &^          &^=

여러분들은 여기서 :=을 하나의 연산자로서 정의되어 있음을 확인할 수 있다. 구문(statement)으로 정의할 수 있는 x := 42 + 7와 같은 경우, + 또한 연산자(operator, 여기서는 덧셈 연산자)로 사용되고 있음을 알 수 있다. 427는 피연산자(operands)이다.

statementsexpressions에 대해서 다루어 보도록 하자. 예를 들어 설명하면, 42 + 7는 expression 이라고 할 수 있다. Expressions는 어떤 것(something)을 평가(evaluate)하고, statement의 경우는 그 어떤 것(something)을 수행하는 일련의 코드(a line of code)라고 할 수 있다. Statements는 일반적으로 한 라인의 코드, 전(entire) 부분을 차지(occupy)한다고 생각하면 된다. 그리고, expression을 여러 개 포함할 수 있다. 그러므로, x := 42 + 7는 statement라고 할 수 있다.

"한 statement는 실행할 행동(action)을 표현하고 있는, 가장 작은 최소한의 독립적인 원소(the smallest standalone element)이다."

"한 expression은 프로그래밍 언어가 번역(interpret)하는 하나 혹은 여러개의 명시적인(explicit) 값(values), 상수(constants), 변수(variables), 연산자(operators), 그리고 함수(functions)의 조합이라고 할 수 있으며, expression의 식에 의한 계산 혹은 연산은 또 다른 값을 생성 할 수 있다."

(역주: 예를 들어, 위의 설명에서 사용된 statementx := 42 + 7를 살펴보면 42 + 7expression이라고 할 수 있으며, 프로그래밍 언어가 이 expression을 컴파일러를 통하여 기계어로 번역하여 CPU에 의하여 해당 expression을 연산하여 결과 값인 49를 얻어 낼 수 있을 것이다.)

이 세션에서의 요점은, short declaration operator인 :=는 일반적으로 변수에 값을 할당할 때 사용한다는 것이다. 또한, 우리는 :=을 오직 코드 블록(code block: 중괄호인 {}안의 구역)내부에서만 사용할 수 있다.

위와 같은 이유로, 아래의 코드는 올바르게 작동하지 않는다:

package main

import (
	"fmt"
)

x := 42

func main() {
	y := "James Bond"
	fmt.Println(x, y)
}

위 코드를 실행한 결과는 아래와 같다:

prog.go:7:1: syntax error: non-declaration statement outside function body

Go build failed.

범위(scope)는 오직 함수 내에 국한되기 때문에, x := 42의 선언부 이후, 에러(prog.go:7:1: syntax error: non-declaration statement outside function body)를 야기 할 것이다. 왜냐하면, xy가 선언(declared)되지 않았기 때문이다.

아래의 코드:

package main

import (
	"fmt"
)

func main() {
	fmt.Println(x, y)  /* x and y are not yet declared */
	x := 42
	y := "James Bond"
	fmt.Println(x, y)
}

를 실행하면:

prog.go:8:14: undefined: x
prog.go:8:17: undefined: y

Go build failed.

와 같은 결과를 얻게 되고,
아래의 코드를 실행하면:

package main

import (
	"fmt"
)

func main() {
	x := 42 + 7
	y := "James Bond"
	fmt.Println(x)
	fmt.Println(y)
	x := 50
	fmt.Println(x)
}

아래와 같은 에러를 얻게 된다:

prog.go:12:4: no new variables on left side of :=

Go build failed.

위의 메시지가 의미하는 것은, x가 이미 존재한다는 것이다. 만약 12번째 라인의 x := 50x = 50으로 변경한다면, 문제없이 위의 코드가 실행될 것이다.

package main

import (
	"fmt"
)

func main() {
	x := 42 + 7
	y := "James Bond"
	fmt.Println(x)
	fmt.Println(y)
	x = 50
	fmt.Println(x)
}

아래와 같이 에러 없는 실행 결과를 얻을 수 있다:

49
James Bond
50

Program exited.

그러므로, 우리는 short declaration operator가 의미하는 것에 대하여 살펴보았다. :=는 새로운 변수(a new variable)에 값(a value)를 할당(assign)하는 목적으로 사용할 수 있다. 새로운 변수에 새로운 값을 :=을 사용하여 할당한 이후, 우리는 해당 변수에 저장된 값을 =를 사용하여 변경(mutate)할 수 있다. 또한, 우리는 expressions과 statements와 같은 용어에 대하여서도 다루었다.

다음 강의에서는, 우리는 변수에 값을 할당하는 다른 방법들에 대하여 살펴 볼 것이며 또한 코드 블록(code block)외부에 변수를 선언하는 방법에 대하여 알아 볼 것이다.