Jamie the programmer

[Golang] 기본적으로 알아야할 기초 지식 part1 본문

programming/golang

[Golang] 기본적으로 알아야할 기초 지식 part1

jamie91 2023. 6. 24. 23:27
Contents 접기
반응형

 

◎ 실전 Go 프로젝트에 투입되기 전에 사전에 알아야할 Go 언어의 기본 및 필수 개념을 설명해 드립니다.

 

¶ 이번 글에서 다룰 내용은 다음과 같습니다.

1. GOROOT
2. GOPATH
3. GOMODULE
4. 패키지
5. 포인터
6. 타입별 "zero value"
7. 인스턴스

 

이어지는 다음글 [Golang] 기본적으로 알아야할 기초 지식 part2 에서는 문자열, 구조체, 함수, 메서드 를 다루겠습니다.

 

 


 

1. GOROOT

- go sdk를 설치한 디렉토리를 나타냅니다.
- 자바에 비유를 들자면 JAVA_HOME 에 해당한다고 볼 수 있을 것 같습니다.

 

 

 

 

2. GOPATH

- Go 프로젝트의 import 위치를 잡아줍니다.
- 소스코드를 찾는 위치 결정 뿐만 아니라 모듈을 다운로드 하는 장소도 결정해 줍니다.

 

 

 

 

3. Go Module

3.1. Go에서 모듈이란?

- Go 모듈은 Go 패키지들을 모아 놓은 Go 프로젝트 단위입니다.
- Go 1.16 버전부터 Go 모듈 사용이 기본이 됐습니다.

- 이전 버전에서는 Go 모듈 사용이 선택 사항 이었으며,
  Go 모듈을 만들지 않는 Go 코드는 모두 GOPATH/src 폴더 아래 있어야 했지만
  Go 모듈이 기본이 되면서 모든 Go 코드는 Go 모듈 아래 있어야 합니다.

- go build를 하려면 반드시 Go 모듈 루트 폴더에 go.mod 파일이 있어야 합니다.
- Go 모듈은 go mod init [패키지명] 명령어를 통해 만들 수 있습니다.

 

 

 

 

4. 패키지

4.1. 패키지란?

- Go 언어에서 코드를 묶는 가장 큰 단위입니다.
- 다른 언어에서는 네임스페이스(namespace)라는 키워드를 사용해서 코드 영역을 분리하기도 하지만,
  Go 언어에서는 다른 언어와 같은 네임스페이스를 지원하지 않고 패키지를 사용합니다.
- 함수로 코드 블록을, 구조체로 데이터를, 패키지로 함수와 구조체와 그외 코드를 묶습니다.
- 프로그램은 main 패키지(필수 요소) 하나와 여러 외부 패키지(선택 요소)로 구성됩니다.

 

4.2. main 패키지란?

- main 패키지는 특별한 패키지로 프로그램 시작점을 포함한 패키지 입니다.
- 프로그램 시작점인 main() 함수를 포함한 패키지가 main 패키지입니다.

 

4.2.1. 프로그램 시작점이란?

- 프로그램 시작점이란 main() 함수를 의미합니다.
- 프로그램이 실행되면 (대부분) 운영체제는 프로그램을 메모리로 올립니다.
- 이것을 로그(Load)라고 합니다.그런 다음 프로그램 시작점부터 한 줄씩 코드를 실행합니다.
- 바로 이 프로그램 시작점이 main() 함수입니다.

 

 

4.3. 패키지 당 init 함수 1개 권장

동일 패키지에서 init 함수가 여러개인 경우, go 파일의 파일명 알파벳순으로 init 함수가 순차적으로 실행됨

 

4.3.1. 예시

아래 예시 실행 순서:    a → main → z

 

main.go

package main
​
import "fmt"
​
var _ int64 = s()
​
func s() int64 {
	fmt.Println("calling s() in sandbox.go")
	return 1
}
​
func init() {
	fmt.Println("init in sandbox.go")
}
​
func main() {
	fmt.Println("main")
}

 

a.go

package main
​
import "fmt"
​
var _ int64 = a()
​
func init() {
	fmt.Println("init in a.go")
}
func a() int64 {
	fmt.Println("calling a() in a.go")
	return 2
}

 

z.go

package main
​
import "fmt"
​
var _ int64 = z()
​
func init() {
	fmt.Println("init in z.go")
}
func z() int64 {
	fmt.Println("calling z() in z.go")
	return 3
}

 

 

4.4. 외부 패키지 사용 시 해당 패키지의 내부 패키지를 불러올 수 없는 경우

- 외부 패키지에서의 내부 패키지명이 internal, test 인 경우
- 패키지명이 _ 로 시작하는 경우

 

 

 

 

5. 포인터

5.1. 포인터 변수란?

- 메모리 주솟값을 변숫값으로 가질 수 있는 변수를 포인터 변수라고 합니다.
- 다른 변수처럼 포인터 변수도 값을 담는 메모리 공간이 있습니다.
- 다만 그 값으로 주소만 담을 수 있습니다.

 

 

5.2. 포인터 변수 선언

포인터 변수는 가리키는 데이터 타입 앞에 *을 붙여서 선언합니다.

 

 

var p *int
  • p 는 int 타입 데이터의 메모리 주소를 가리키는 포인터 변수입니다.

 

var a int
var p *int
p = &a
  • 변수 a의 메모리 주소를 포인터 변수 p에 값으로 대입합니다.
  • 이제 p를 이용해서 변수 a의 값을 변경할 수 있습니다.

 

*p = 20
  • 포인터 변수 앞에 *를 붙이면 그 포인터 변수가 가리키는 메모리 공간에 접근할 수 있습니다.
  • p가 가리키는 메모리 공간의 값을 20으로 변경합니다.
  • p가 변수 a의 메모리 공간을 가리키기 때문에 a값이 2으로 변경됩니다.

 

 

 

5.3. 포인터 변수도 메모리 주소를 가지고 있을까?

  • 포인터 변수도 메모리 주소를 각자 가지고 있습니다.
  • 초기화 하지 않았기 때문에 기본값으로 nil 입니다.

 

 

5.4. nil 이란?

- In Go, nil is the zero value for pointers, interfaces, maps, slices, channels and function types, representing an uninitialized value. 
명시적인 초기값 없이 선언된 변수는 zero value를 갖게 된다. 포인터, 인터페이스, 맵, 슬라이스, 채널, 함수 타입이 해당 됩니다.
- 이 값은 0이지만 정확한 의미로는 “유효하지 않는 메모리 주솟값” 즉 “어떤 메모리 공간도 가리키고 있지 않음”을 나타냅니다.
- 포인터 변숫값을 초기화하지 않으면 기본값은 nil 입니다.

 

 

6. 타입별 “zero value”

0 모든 number 타입 변수
false 모든 boolean 타입 변수
"" string 타입 변수
nil pointer 변수, struct 타입 변수

 

 

 

 

 

 

 

 

7.  인스턴스

 

7.1. 인스턴스란?

- 인스턴스는 메모리에 존재하는 데이터의 실체입니다.
- Data 타입값을 저장할 수 있는 메모리 공간을 할당합니다.
- 이렇게 할당된 메모리 공간의 실체를 인스턴스라고 부릅니다.

 

 

 

var data Data

 

Case 1

 

 

Case 2

 

 

7.2. 인스턴스는 언제 사라지나요?

“아무도 찾지 않는 데이터는 쓸모없는 데이터이다” 라고 볼 수 있으며,
가비지 컬렉터(Garbage Collector) 에 의해 일정 간격으로 메모리에서 쓸모없어진 데이터를 청소합니다.

 

 

7.3. 인스턴스 초기화

(1) &를 사용하는 초기화

 

p := &Data{}
  • new() 내장 함수와 달리 &를 사용하는 초기화 방식은 사용자 초기화가 가능합니다.
p := &Data{3, 4}

 

 

(2) new()를 사용하는 초기화

var p = new(Data)
  • new() 내장 함수는 인수로 타입을 받습니다.
  • 타입을 메모리에 할당하고 기본값으로 채워 그 주소를 반환합니다.
  • new를 이용해서 내부 필드값을 원하는 값으로 초기화할 수는 없습니다.

 

 

 

 

이어지는 다음글 [Golang] 기본적으로 알아야할 기초 지식 part2 에서는 문자열, 구조체, 함수, 메서드 를 다루겠습니다.

728x90
반응형