Yummy Story

Go 알아보기 - 개념/키워드 본문

Development/Go

Go 알아보기 - 개념/키워드

꿀맛규동 2025. 1. 22. 14:05

안녕하세요. 꿀맛규동 정동규입니다.

 

본래 Java를 주언어로 개발하던 상황이었지만 아래의 이유로 Go라는 언어에 흥미를 가져 학습을 시작하게 되었는데요!

    • 백엔드 진영에서의 서브 언어 학습 목표
    • "비동기"와 "고루틴(goroutine)"에 대한 궁금증
    • "경량 서버"와 "별도 런타임이 필요없는 실행환경"에 대한 궁금증
    • "오픈소스"에 대한 흥미

평소에는 Java로 개발을 해왔고 하고 있기 때문에 메인 언어로서 학습하고 옮기기보다는 비정기적으로 Go를 학습하고 학습한 내용을 공유드리려 합니다.

아마 주위에 동일하게 개념이나 사용법에 대한 글들이 많음에도 작성하는 이유는 저만의 학습 정리를 위해서이니 가볍게 읽으시거나 참고용으로 읽어주시면 좋을 것 같습니다.

부족한 부분이나 잘못된 부분이 있다면 가감없이 피드백 주시면 너무 감사드릴 것 같습니다!

 


Go 언어

Go는 구글에서 다른 언어의 긍정적인 특징들을 유지하면서 공통이 되는 문제들을 해결할 새로운 프로그래밍 언어를 설계하기 위해 아래와 같은 기조로 만들어낸 오픈 소스 프로그래밍 언어입니다.

(대체로 문법적으로 C 언어와 유사하다고 알려져있습니다.)

  • 정적 타이핑 및 대형 시스템 확장이 가능한 언어
  • 불필요하게 잦은 키워드 반복 없이 생산적이며 가독성이 좋은 언어
  • 통합 개발 환경이 필요하지 않지만 지원도 가능한 유연한 언어
  • 네트워킹 및 다중 처리, 병렬 처리가 가능한 언어

더불어 공식문서에서 Go 언어에 대해 다음과 같이 설명했습니다.

Go is expressive, concise, clean, and efficient. Its concurrency mechanisms make it easy to write programs that get the most out of multicore and networked machines, while its novel type system enables flexible and modular program construction. Go compiles quickly to machine code yet has the convenience of garbage collection and the power of run-time reflection. It's a fast, statically typed, compiled language that feels like a dynamically typed, interpreted language.

 

요약하자면 표현력이 있으면서 간결하고 깔끔한, 그리고 효율적인 언어로서 동시성 메커니즘에 특화되어 멀티코어 & 네트워크 머신을 최대한 활용하면서도 새로운 유형의 시스템으로서 유연하고 모듈화된프로그램을 쉽게 만들어낼 수 있다고 합니다.

또한 기계어로 빠르게 컴파일이 되고 더나아가 GC의 편리성, 런타임 처리의 장점까지 가지고 있다고 합니다.

덕분에 Go는 빠르고 정적 타입의 컴파일 언어이면서도 동적 타입/인터프리터 언어와 같이 느껴지는 언어라고 전합니다.

 

즉, 정적 언어의 "효율성"과 동적 언어의 "직관성", "유연성"의 장점을 모두 흡수하고자 만들어진 언어라고 볼 수 있습니다.

간단하게 장단점만 짚고 넘어가도록 하겠습니다.

장점

  • 컴파일 언어인만큼 실행 시 좋은 효율성, 성능
  • 간결하게 코드를 작성할 수 있고 풍부한 라이브러리 제공 → 쉽게 기능 구현 가능
  • Goroutine 비동기 메커니즘 제공 → 동시성(concurrency) 프로그램 구축 용이 (Event 기반 처리, 병렬 프로그래밍에 적합)
  • 기존 멀티스레드 응용 메커니즘에 비해 매우 간단한 동기화 메커니즘

단점

  • 타입 상속, 제너릭, 표명(assertion), 메서드 오버로딩, 포인터 연산에 대한 적극적인 지원은 하지 않음 (Generic : 1.18부터 지원)
  • 동기화 문제는 프로그래머가 직접 다뤄야 함 (프로그램이 비정상 종료될 가능성 존재)
  • Binary 컴파일러 사용 → 서로 다른 머신 플랫폼 대상 배포 시, 맞춤 환경 변수를 적용해 여러 버전의 컴파일 배포 필요
  • 단순성과의 Trade-Off (Null Pointer나 Type Casting으로 인한 문제에 취약)

 

 

문법

우선 들어가기 앞서 Go 설치는 이 링크를 통해 설치하시면 됩니다.

Go가 단순함과 실용성을 지향하는 언어인만큼 keyword는 25개로 많지 않은 편입니다.

`defer`, `go`, `chan`, `select`등과 같은 생소한 몇 가지 키워드에 대해서는 추후에 자세히 알아볼 예정입니다.

(대부분의 키워드는 여러 언어들에서 통상적으로 사용되는 키워드들도 많아 이해하기에 어렵지 않습니다.)

  • var : 변수 선언
  • const : 상수 선언
  • for : 반복문 (Go 반복문 `for` 하나)
    • range : Collection에서 각 element의 index & value 반환
    •  
    • break : `for` / `switch` / `select` 문 종료 
    • continue
  • switch
    • case (Go 컴파일러가 자동으로 각 case 블럭 마지막에 break 추가 → 따로 break 명시 없이도 case 조건 만족 시, 종료)
    • default
    • fallthrough : case를 만족해도 이후의 case들 실행
  • if
    • else
  • func : 함수 선언
    • return
    • defer : 함수 내에서 제일 마지막에 실행
  • package (`main` package : 실행 프로그램 / 그 외 package : 공유 패키지/라이브러리)
    • import
  • type : 새로운 타입 정의
    • struct : 변수 집합체 → 새로운 자료형 정의 (Custom Data Type)
    • interfaces : 메서드 집합체
  • map : 해시 테이블 구현 자료구조
  • go : goroutine 실행
  • chan : Channel 선언
    • select : 다중 Channel에서 대기 후 값 수신하면 실행 
      (JS로 비유하자면 각 채널 간 await 호출과 유사한 구조인 것 같습니다.)
  • goto : 특정 레이블 이동
break
default
func
interface
select
case
defer
go
map
struct
chan
else
goto
package
switch
const
fallthrough
if
range
type
continue
for
import
return
var

 


간단하게 Go의 개념과 문법 구조를 알아봤습니다.

추후에 Go 학습을 거듭하면서 활용방법, 심화 문법과 서버 어플리케이션으로서의 기능과 구현 방법을 살펴보고 공유드리겠습니다.

 

감사합니다.

 


참고