본문 바로가기
STUDY/GoLang

[Go를 향한 여행] Basics :: 패키지와 변수, 함수

by 램플릿 2024. 9. 24.

A Tour of Go


A Tour of Go

https://go.dev/tour/welcome/1
Language-kor : https://go-tour-ko.appspot.com/welcome/1
go get golang.org/x/tour

 

 

패키지

모든 Go 프로그램은 패키지로 구성되며, 프로그램은 main 패키지에서부터 실행됩니다.

이 프로그램은 "fmt"  "math/rand" 경로의 패키지를 import하여 사용합니다.

패키지의 이름은 import 경로의 마지막 요소와 같습니다. 예를 들어 "math/rand" 패키지는 package rand 문으로 시작하는 파일들로 구성되어있습니다.

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	fmt.Println("My favorite number is", rand.Intn(10))
}

 

  • 일반적인 import문
import "fmt"
import "math"
  • "factored" import문 : (괄호)로 그룹지어 사용하는 발전된 형식
import (
	"fmt"
	"math"
)

 

 

변수

  • 패키지에서는 대문자로 시작하는 이름의 변수만 export됩니다. ex)math.Pi
  • export되지 않은 변수들은 패키지의 밖에서 접근할 수 없습니다.
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Pi)
}

 

  • var 문은 변수에 대한 목록을 선언합니다. Go 문법에서 변수의 자료형은 변수명 뒤에 적어줍니다.
  • var 문은 package나 함수 단에서 선언할 수 있습니다.
package main

import "fmt"

var c, python, java bool

func main() {
	var i int
	fmt.Println(i, c, python, java)
}
실행결과 : 0 false false false

💡Zero values
명시적인 초깃값 없이 선언된 변수는 zero value 가 주어집니다.
- 숫자 type :  0
- boolean type :  false
- string :  "" (빈 문자열)

 

 

  • 변수 선언은 한 변수 당 하나의 초깃값을 포함할 수 있습니다.
  • 만약 초깃값이 존재한다면, type은 생략될 수 있습니다. 이 경우, 변수는 초깃값의 type을 취합니다.
package main

import "fmt"

var i, j int = 1, 2

func main() {
	var c, python, java = true, false, "no!"
	fmt.Println(i, j, c, python, java)
}
실행결과 : 1 2 true false no!

 

  • 함수 내에서는 := 라는 짧은 변수 선언은 암시적 type으로 var 선언처럼 사용될 수 있습니다.
  • 함수 밖에서는 모든 선언이 키워드(var, func, 기타 등등)로 시작하므로 := 구문은 사용할 수 없습니다.
package main

import "fmt"

func main() {
	var i, j int = 1, 2
	k := 3
	c, python, java := true, false, "no!"

	fmt.Println(i, j, k, c, python, java)
}
실행결과 : 1 2 3 true false no!

 

 

상수

  • 상수는 변수처럼 선언되지만 const 키워드와 함께 선언됩니다.
  • 상수는 character 혹은 string, boolean, 숫자 값이 될 수 있습니다.
  • 상수는 := 를 통해 선언될 수 없습니다.

 

 

함수

순서대로 읽히는 Go구문

  • C는 나선형으로 읽히는 반면, Go는 문장이 왼쪽에서 오른쪽으로 읽히도록 작성되었습니다.
  • Go의 문법에서는 선언 시 함수/매개변수와 반환값을 헷갈리는 것을 방지하기 위해 func 함수이름(매개변수) 뒤에 반환값을 적어줍니다.       e.g.) func add(x int, y int) int { /* ... */}
  • 또한 매개변수의 자료형 역시 매개변수 이름 뒤에 type 이 온다는 것을 명심하세요.       e.g.) func add(x int, y intint { /* ... */}
  • 이러한 방법은 문장이 왼쪽에서 오른쪽으로 명확히 읽히게끔 합니다.
package main

import "fmt"

func add(x int, y int) int {
	return x + y
}

func main() {
	fmt.Println(add(42, 13))
}
  • 배열을 선언할 때에도 [괄호] 를 자료형 앞에 적습니다. 표현식에서는 변수명 뒤에 [괄호] 를 놓습니다.
var a []int
x = a[1]

 

  • 포인터를 선언할 때도 동일합니다. 하지만 표현식에서는 p*의 * 기호가 곱셈 연산자와 혼동될 수 있기 때문에,
    *p로 작성합니다.
var p *int
x = *p

 

 

[]int("hi")

 

위와 같은 내용을 포인터 모양으로 변환해서 본다면 아래와 같이 작성할 수 있습니다.

(*int)(nil)

포인터를 맨 앞에 표기하려면 괄호를 사용해 묶어주어야 합니다.

C의 기존 포인터 기호*를 사용하기 위해 불가피하게 괄호를 사용하지만, 그 대신 Go의 구문은 특히 복잡한 문장에서 C보다 더 이해하기 쉽게 구성되었습니다.

 

연속되는 동일한 매개변수타입 생략하기

  • Go 언어에서는 함수 매개변수의 자료형이 같을 경우, 한 번만 적어주면 됩니다.
func add(x, y int) int {
	return x + y
}
  • 예를 들어, func (x, y int) int와 같이 작성하면 x와 y 모두 int 타입임을 의미합니다. C 언어처럼 각각의 매개변수에 대해 자료형을 반복해서 명시할 필요가 없습니다.
  • 이런 방식은 코드의 간결함을 높여주고, 특히  func add(a,b,c,d,e,f,g int) 처럼 여러 매개변수의 자료형이 같을 때 유용합니다.
  • 만약 매개변수의 자료형이 다를 경우, 각 매개변수에 대해 자료형을 별도로 명시해야 합니다.

 

함수명, 매개변수명 생략하기

  • Go언어에서는 함수 또는 매개변수의 이름을 생략할 수 있습니다. 다음 두 블럭은 완전히 동일한 결과를 출력합니다.
sum := func(a, b int) int { return a+b } (3, 4)
func add(a,b int) int
{
	return a+b
}

sum := func add(3,4)

 

 

 

함수의 반환값

Go에서는 함수 하나가 여러개의 결과값을 반환할 수 있습니다.

package main

import "fmt"

func swap(x, y string) (string, string) {
	return y, x
}

func main() {
	a, b := swap("hello", "world")
	fmt.Println(a, b)
}

 swap 함수는 string y와, string x를 반환합니다.

 

 

네임드 반환값

package main

import "fmt"

func split(sum int) (int,int) {
	int x = sum * 4 / 9
	int y = sum - x
	return x, y
}

func main() {
	fmt.Println(split(17))
}

 

위 문장은 네임드 반환값을 사용하여 아래와 같이 작성할 수 있습니다. 내용은 완전히 동일합니다.

package main

import "fmt"

func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}

func main() {
	fmt.Println(split(17))
}

 

Go에서는 이름이 정해진 네임드 반환값을 사용할 수 있습니다. 그 경우, 함수의 맨 위에서 정의된 변수처럼 다뤄집니다. 인자가 없는 return 문은 이름이 주어진 반환 값을 반환합니다. 이것을 "naked" return 이라고 합니다.

 

naked return문은 이 예제에서처럼 짧은 함수에서만 사용되어야합니다. 긴 함수에서는 그것이 가독성을 떨어뜨릴 수 있습니다.

'STUDY > GoLang' 카테고리의 다른 글

Go, Visual Studio Code 설치하기  (0) 2024.09.23