Notice
Recent Posts
Recent Comments
Link
250x250
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 사이버 보안
- Neo4j
- 프로그래밍
- go
- IT보안
- 공부
- 정보보안
- neo4j성능
- 랜섬웨어
- 보안
- 사이버보안
- 데이터모델링
- graph
- security
- 보안솔루션
- 보안 분석
- 정보보안기사
- 그래프 데이터베이스
- concurrency
- 위협 탐지
- 시험
- 해킹
- 그래프데이터베이스
- SQLD
- 자격증
- Database
- Golang
- GraphDB
- 정리
- cypher
Archives
- Today
- Total
Jamie the programmer
[Golang] 기본적으로 알아야할 기초 지식 part1 본문
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
반응형
'programming > golang' 카테고리의 다른 글
Go에서 Throttling과 Debouncing? 요청은 줄이고 효율은 높이자! (0) | 2025.03.10 |
---|---|
고루틴도 편히 쉬어야 한다! Go에서 Graceful Shutdown 구현하기 (0) | 2025.03.10 |
Go 언어, 이렇게 쓰면 GOAT 된다 - 실전 꿀팁 12개! (0) | 2025.03.10 |
Go 코드에서 UML 다이어그램 뽑아내기 – 개발자 생산성 200% UP! (0) | 2025.03.07 |
[Golang] 기본적으로 알아야할 기초 지식 part2 (0) | 2023.06.25 |