2024. 11. 11. 21:37 ㆍ개발 이야기/Golang
Go 언어, 흔히 고(Golang)라고 불리는 이 언어는 2007년에 Google에서 개발을 시작해 2009년에 오픈 소스로 공개된 언어입니다. 고는 간결하고 명료한 문법과 함께 높은 성능과 병행성을 제공하는 것이 큰 특징입니다. 이번 포스팅에서는 고 언어의 특징과 그것을 코드레벨에서 어떻게 활용할 수 있는지 구체적으로 알아보겠습니다.
1. 간결하고 명료한 문법
Go의 가장 큰 장점 중 하나는 간결함입니다. 복잡한 구조보다는 직관적인 코드 작성을 지향하기 때문에 개발자가 쉽게 익히고 빠르게 작업할 수 있습니다. 아래는 간단한 "Hello, World!" 예제입니다.
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
여기서 import 키워드는 다른 패키지를 가져오는 데 사용되며, fmt는 기본적으로 포함된 포맷팅 패키지로, 표준 출력 같은 간단한 작업을 수행할 수 있습니다.
2. 병행성 지원 (Goroutine)
고 언어는 병행성을 매우 쉽게 구현할 수 있도록 goroutine이라는 경량 스레드를 지원합니다. goroutine은 고의 주요 특징 중 하나로, 일반적인 스레드보다 훨씬 가볍습니다. 이 덕분에 많은 수의 작업을 병렬로 처리하는 프로그램을 쉽게 작성할 수 있습니다.
아래는 간단한 goroutine 예제입니다.
package main
import (
"fmt"
"time"
)
func printMessage(message string) {
for i := 0; i < 5; i++ {
fmt.Println(message)
time.Sleep(1 * time.Second)
}
}
func main() {
go printMessage("Hello from goroutine")
printMessage("Hello from main")
}
이 코드는 두 개의 printMessage 호출을 동시에 실행합니다. go 키워드를 사용하면 goroutine으로 해당 함수를 비동기 실행할 수 있습니다.
3. 채널(Channel)을 통한 통신
고 언어는 goroutine 간의 통신을 위해 채널(Channel)을 제공합니다. 채널을 사용하면 여러 goroutine이 서로 데이터를 주고받을 수 있습니다. 이는 병행 프로그래밍에서 상태를 공유하지 않고 통신하는, Go의 CSP(Communicating Sequential Processes) 모델에 기반합니다.
package main
import "fmt"
func main() {
messages := make(chan string)
go func() {
messages <- "ping"
}()
msg := <-messages
fmt.Println(msg)
}
이 예제에서 make(chan string)을 통해 문자열을 주고받을 수 있는 채널을 생성하고, goroutine에서 messages 채널에 "ping" 메시지를 보냅니다. main 함수는 채널에서 메시지를 수신하고 이를 출력합니다.
4. 정적 타입 시스템
고 언어는 정적 타입 언어로, 컴파일 타임에 타입을 확인하여 오류를 방지합니다. 하지만 타입 추론을 지원하기 때문에 코드의 간결함을 유지할 수 있습니다. 예를 들어:
package main
import "fmt"
func main() {
var a int = 10
b := 20 // 타입 추론으로 int로 처리됨
fmt.Println(a + b)
}
b := 20에서는 타입을 명시적으로 지정하지 않았지만, 컴파일러가 이를 정수로 추론합니다. 이러한 타입 추론 기능은 코드 작성 시 편리함을 제공합니다.
5. 내장된 메모리 관리와 Garbage Collection
고 언어는 C와 같은 언어와는 달리 자동 메모리 관리를 지원합니다. 가비지 컬렉터(Garbage Collector)가 포함되어 있어 개발자가 수동으로 메모리를 할당하거나 해제할 필요가 없습니다. 따라서 메모리 관리로 인한 오류를 줄일 수 있습니다.
6. 인터페이스와 다형성
고 언어의 인터페이스는 객체 지향의 핵심인 다형성을 쉽게 구현할 수 있는 수단입니다. Go에서 인터페이스는 특정 메서드의 집합을 정의하며, 이를 통해 여러 타입이 동일한 메서드를 구현하도록 합니다.
type Speaker interface {
Speak() string
}
type Person struct {}
func (p Person) Speak() string {
return "Hello, I am a person"
}
type Dog struct {}
func (d Dog) Speak() string {
return "Woof!"
}
func makeSpeak(s Speaker) {
fmt.Println(s.Speak())
}
func main() {
p := Person{}
d := Dog{}
makeSpeak(p)
makeSpeak(d)
}
여기서 Speaker 인터페이스는 Speak 메서드를 요구하며, Person과 Dog는 각각 Speak 메서드를 구현했습니다. makeSpeak 함수는 Speaker 타입을 받아 다형성을 구현합니다.
7. 패키지 관리와 의존성
고 언어는 go modules를 사용해 의존성을 관리합니다. 이는 Go 프로젝트의 패키지와 버전을 쉽게 관리할 수 있게 해줍니다.
go mod init example.com/myproject
go get github.com/gin-gonic/gin
위 명령어는 새로운 모듈을 초기화하고 Gin 웹 프레임워크를 프로젝트에 추가하는 예시입니다. Go의 모듈 시스템 덕분에 프로젝트의 버전 관리와 의존성 관리가 수월해집니다.
결론
고 언어는 간결한 문법, 병행성 처리의 용이성, 그리고 강력한 타입 시스템과 자동 메모리 관리로 현대적인 애플리케이션 개발에 적합합니다. 특히 서버 개발, 클라우드 네이티브 애플리케이션, 그리고 시스템 프로그래밍에서 많은 개발자들이 고를 선호합니다. 고 언어의 이러한 특징들은 모두 실제 코드 레벨에서 매우 직관적이고 활용 가능하기 때문에, 빠르게 변화하는 개발 환경에서 생산성을 높이기에 적합한 언어입니다.
이 포스팅이 고 언어의 특징을 이해하고 실제 코드에서 활용하는 데 도움이 되었길 바랍니다. 이제 Go를 사용하여 간단한 프로젝트를 만들어 보거나, goroutine을 활용한 병행성 프로그램을 작성해 보는 건 어떨까요?
'개발 이야기 > Golang' 카테고리의 다른 글
# Opentracing Jaeger-client golang/JAVA applicaion에 적용하기[Golang 편] (0) | 2020.08.23 |
---|---|
# Opentracing Jaeger-client golang/JAVA applicaion에 적용하기[JAVA 편] (0) | 2020.08.23 |
# Kubernetes(쿠버네티스) 환경에서 GO 어플리케이션 디버깅 환경 구성 (0) | 2020.08.05 |
#6 Golang gomail을 이용해 SMTP 연동하기 (0) | 2020.01.27 |
#5 Golang bcrypt로 비밀번호 해싱 및 검증하기 (0) | 2019.12.30 |