GoLang - 변수와 상수 ( var, const )

dev_swan·2022년 11월 16일

Golang

목록 보기
2/9
post-thumbnail

Hello World

새로운 언어를 배울때 가장 기본이라 할 수 있는 Hello World를 출력해보도록 하겠습니다.

package main

func main() {
  println("Hello World")
}
  • package main
    • 첫 라인은 소속된 패키지명(main)을 지정합니다.
  • func main
    • 메인 함수를 정의한 것으로 Go는 패키지 내의 Entry Pointmain() 함수를 찾아 프로그램을 실행합니다.

터미널에서 Go 프로그램을 실행시켜보도록 하겠습니다.

  • go run hello.go
    • hellog.go 파일의 main packagemain 함수를 실행합니다.

Var ( 변수 )

Go 언어에서의 변수를 사용하는 여러가지 방법을 알아보도록 하겠습니다.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	var message string  
	message = "Hello, Go!"

	fmt.Println(message, reflect.TypeOf(message))

	var hi string = "Hi!"

	fmt.Println(hi ,reflect.TypeOf(hi))

	var who = "Who R U"

	fmt.Println(who, reflect.TypeOf(who))

	goodBye := "GoodBye"

	fmt.Println(goodBye, reflect.TypeOf(goodBye))
}

Import (fmk, reflect) 부분은 추후에 알아보도록 하겠습니다.

변수를 할당하는 방법으로는, var키워드를 사용하여 변수를 먼저 선언하고 후에 값을 할당하기, 선언과 할당을 함께하기, 자료형을 생략하고 선언과 할당을 함께하기, 그리고 마지막으로 가장 많이 쓰이는 단축 변수 선언까지 있습니다.

타입이 명시되지 않은 경우에는 컴파일시 자동으로 타입을 추론합니다. var를 사용하여 변수를 할당없이 선언만 할 때는 자료형을 생략할 수 없습니다. 단축 변수 선언 구문을 사용할 때에는 :=를 사용함을 주의해야합니다.


전역에서 변수 선언

전역 스코프에서 변수를 선언할 때 주의할 점은 단축 변수 선언 구문을 사영하면 문법에러가 발생하며 변수를 선언하고 따로 할당하는 것도 전역 스코프에서는 불가능합니다.

전역 스코프에서 변수를 선언하며 사용법을 익혀봅시다.

package main

import (
	"fmt"
	"reflect"
)

var message string

var hi string = "Hi"

var who = "Who R U"

/**
	-> Error
	goodBye := "GoodBye"
*/

func main() {
	message = "Hello, Go!"

	fmt.Println(message, reflect.TypeOf(message))

	fmt.Println(hi, reflect.TypeOf(hi))

	fmt.Println(who, reflect.TypeOf(who))
}

여러개의 변수 선언

Go 언어에서 여러개의 변수를 선언할 때는 아래와 같은 방법으로 선언할 수 있습니다.

package main

func main() {
  message, hi, who, goodBye := "Hello, Go!", "Hi", "Who R U", "GoodBye"
}

변수를 여러개 선언하고 값을 할당할 때는 반드시 선언하는 변수와 할당하는 값의 개수가 같아야 하며 타입은 같지 않아도 괜찮습니다.

package main

import (
	"fmt"
	"reflect"
)

func main() {
  golang, javascript := "Good", false
  
  fmt.Println(golang, reflect.TypeOf(golang))
  fmt.Println(javascript, reflect.TypeOf(javascript))
}

var를 사용하여 변수를 선언할 때는 아래와 같은 방법으로도 선언할 수 있습니다.

package main

var (
	message string
  hi string
  who string
  goodBye string
  golang true
)

변수 재할당과 선언

Go 언어에서 변수를 재할당과 재선언을 하는 행위는 아래와 같이 다소 특이하게 동작합니다.

package main

import "fmt"

func main() {
  message := "Hello, Go!"
  message, javascript := "Awesome", false

  /** -> Awesome, false */
  fmt.Println(message, javascript)
}

/** Another file */

func main() {
  message := "Hello, Go!"
  /**
  	Error ->
  	message := "Awesome"
  	True ->
		message = "Awesome"
  */
}

첫번째 main 함수를 살펴보면 코드를 살펴보면, message라는 변수를 재선언하고 값이 바뀐 것을 확인할 수 있습니다.

하지만, 두번째 main 함수를 살펴보면 에러가 발생한 것을 확인할 수 있습니다.

단축 변수 선언을 통해 여러개의 변수를 함께 선언할 때, 하나라도 새로운 변수가 있으면 이는 단축 변수 선언 문법을 사용하더라도 기존 변수에 대해서는 재할당으로 처리됩니다.

첫번째 main 함수에서 에러가 발생하지 않은것은 이 같은 이유 때문입니다.


이름 쉐도잉 ( Name Shadowing )

Go 언어에서는 패키지, 타입과 똑같은 이름의 변수를 선언해도 에러가 발생하지 않습니다.

package main

import (
	"fmt"
	"reflect"
)

func main() {
	string := 10

  /** -> 10 int */
	fmt.Println(string,reflect.TypeOf(string))

  /**
  	Error ->
    var message string = "Hello, Go!"
  */
}

var를 사용하여 변수 string을 만들었고, messagestring 타입으로 할당하려고 하면 Error를 뱉으니 주의하여야 합니다. ( 가급적 패키지명이나 타입으로는 이름을 짓지 맙시다.. )


제로 값 ( Zero Value )

제로 값은 변수를 선언만 하고 값을 할당하지 않은 상태에서의 Default Value를 의미하는데, 예를 들어 Int 타입같은 경우에는 0이 제로 값입니다.

package main

import "fmt"

var (
	myInt int
	myFloat float64
	myString string
	myBool bool
)

func main() {
  /** -> 0, 0, "", false */
  fmt.Printf("%#v %#v %#v %#v", myInt, myFloat, myString, myBool)
}

Const ( 상수 )

상수는 변수와 비슷하지만 한 번 선언하고 값을 할당하면 값을 변경할 수 없습니다. 선언과 할당을 따로 할 수는 없으며 const 키워드를 사용하여 상수를 선언할 수 있습니다.

자료형 명시는 컴파일러가 알아서 추론해주기 때문에 선택적으로 해주면 됩니다. 또한 전역 스코프, 지역 스코프 상수 모두 컴파일 타임에 초기화 됩니다.

package main

import "fmt"

func main() {
	const MAX_SIZE int = 10
	/**
		Error ->
		MAX_SIZE = 20
	*/
	
  /** -> 10 */
	fmt.Println(MAX_SIZE)
}

여러개의 상수 선언하기

변수와 마찬가지로 상수도 여러개를 함께 선언할 수 있습니다.

package main

func main() {
  const MAX_SIZE, LANG = 10, "Golang"
}

변수와 마찬가지로 다른 형태로도 여러개의 상수를 선언할 수 있습니다. 하지만, 이렇게 할 경우 할당까지 같이 해주어야 합니다.

package main

import "fmt"

const (
	MAX_SIZE int = 10
	LANG string = "Golang"
)

func main() {
  /** -> 10, Golang */
	fmt.Println(MAX_SIZE, LANG)
}

참고자료

Go 언어를 공부하기 위한 자료 및 문서 정리


Go 언어 공부 GoGo~~! 엌ㅋㅋㅋㅋㅋㅋㅋ

0개의 댓글