개발/Go

[Go 언어 학습기 #2] Go 언어(Golang) 의 특징 및 동작 과정

황동리 2025. 11. 27. 15:21
반응형

Go 언어 특징

Go 언어의 핵심 특징은 아래와 같습니다.

"단순한 문법 + 내장된 동시성 + 빠른 컴파일 + 단일 바이너리 배포 + GC 언어"

그래서 다른 언어들과 비교를 해보자면,

기능 Go Java Python JavaScript C++
클래스(Class) ❌ 없음 (struct + method 조합) ⭕ 클래스 기반 OOP ⭕ 클래스 존재 ⭕ 클래스 문법 제공(프로토타입 기반) ⭕ 지원
상속(Inheritance) ❌ 없음 (Embedding 사용) ⭕ 단일 상속 ⭕ 다중 상속 ⭕ 단일 상속 ⭕ 다중 상속
메서드(Method) ⭕ struct에 메서드 바인딩 ⭕ 클래스 메서드 ⭕ 인스턴스/클래스 메서드 ⭕ prototype 기반 메서드 ⭕ 클래스/구조체 메서드
인터페이스(Interface) ⭕ 인터페이스(암묵적 구현) ⭕ 명시적 implements ⭕ 프로토콜/추상클래스 ❌ 없음 (TS에서 제공) ⭕ 순수 가상 함수
익명 함수(Anonymous Function) ⭕ 지원 (func(){}) ⭕ 람다 ⭕ 람다 ⭕ 람다 ⭕ 람다
가비지 컬렉터(GC) ⭕ 있음 ⭕ JVM GC ⭕ 있음 ⭕ 있음 ❌ 없음
포인터(Pointer) ⭕ 지원 (연산 제한적, 안전) ❌ 없음 ❌ 없음 ❌ 없음 ⭕ 포인터 완전 지원
제네릭(Generic) ⭕ 지원(Go 1.18+) ⭕ 강력한 제네릭 ⭕ TypeVar 기반, 제한적 ⭕ TS에서만 강력 ⭕ 템플릿 매우 강력
네임스페이스(Namespace) ❌ 네임스페이스는 제공하지 않지만, 모든 코드는 패키지 기반 단위로 분리 ⭕ 패키지/모듈 ⭕ 모듈 ⭕ ES 모듈 ⭕ namespace 키워드

이제 코드가 실행되는 과정을 알아보겠습니다.

코드 실행 과정

코드가 프로그램이 되어 실행되기까지 아래와 같이 5단계를 거칩니다.


1번 - 폴더 생성
2번 - .go 파일 생성 및 작성
3번 - Go 모듈 생성
4번 - 빌드
5번 - 실행


각 단계 별로 자세히 알아보자면,

1번 - 폴더 생성

앞서 Go 언어의 특징을 알아볼 때 네임스페이스 부분에서


Go 언어에서 모든 코드는 패키지 기반 단위로 작성이 된다고 하였습니다.
그래서 같은 폴더에 위치한 .go 파일은 모두 같은 패키지에 포함되고, 패키지명으로 폴더명을 사용합니다.


예시를 들어보자면, goproject/hello 폴더를 생성하고 hello 폴더 아래 여러 .go 파일을 생성하면, 모두 같은 hello 패키지에 포함이 됩니다.


그러면 goproject/hello/extra 폴더를 생성하고 extra 폴더 아래 또 .go 파일들을 생성하면 하면 helloextra는 폴더가 다르기 때문에, 서로 다른 패키지로 취급이 됩니다.


이것을 통해 이야기 하고 싶은 부분은

폴더가 다르면 패키지도 달라집니다.

2번 - .go 파일 생성 및 작성

Go 문법을 사용해서 Go 코드를 만드는 과정입니다.


이 때 확장자는 반드시 .go로 끝나야 합니다.

3번 - Go 모듈 생성

Go 1.16 버전 이후로 Go 모듈이 기본적으로 적용됩니다.


따라서 모든 Go 코드는 빌드하기 전에 모듈을 생성해야 합니다.


모듈 생성은 go mod init 명령으로 실행을 합니다.

ex)
go mod init goproject/hello

위 명령어로 Go 모듈을 생성하면 go.mod 파일이 생성됩니다.
해당 파일에는 모듈명과, Go 버전, 필요한 패키지 목록 정보가 담겨있습니다.

4번 - 빌드

go build 명령을 통해 Go 코드를 기계어로 변환하여 실행 파일을 만듭니다.


이 때, GOOSGOARCH 환경변수를 통해 운영체제와 아키텍처에서 실행되는 실행 파일을 만들 수 있습니다.

ex)
GOOS=linux GOARCH=amd64 go build

5번 - 실행

마지막으로 생성된 바이너리 실행 파일을 실행해주면 됩니다.

./바이너리 파일 이름


이제 이전에 만든 Hello Go World 코드를 뜯어보면서 좀 더 자세히 알아보겠습니다.

Hello Go World 코드 뜯어보기

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
  • package main

패키지 선언은 이 코드가 어떤 패키지에 속하는지 알려줍니다.


Go 언어의 모든 코드는 반드시 패키지 선언으로 시작해야 합니다.


실행 바이너리를 만들 때는 항상 package main 이어야 하고, 이 안에 main 함수가 있어야 합니다.

  • import "fmt"

fmt 패키지를 가져온다는 의미 입니다.
특정 패키지에서 제공하는 기능을 사용하고 싶을 때는 import로 해당 패키지를 불러와야 합니다.


여기서 fmt 패키지는 입출력 포맷팅을 제공하는 표준 라이브러리 입니다.

  • func main()

func 키워드는 함수(function) 를 정의할 때 사용 합니다.


따라서 여기서는 main() 함수를 선언하고 중괄호{} 시작해서 함수의 시작과 끝을 정의 합니다.


그리고 프로그램은 항상 main() 함수에서 시작이 됩니다.
즉, 모든 프로그램은 main() 함수로부터 시작되고 main() 함수가 종료되면 프로그램이 종료됩니다.

  • fmt.Println("Hello, World!")

앞서 언급했듯이 fmt는 입출력을 도와주는 패키지 입니다.


Println 는 fmt 패키지에 있는 함수 이름 입니다.
주된 내용은 내용을 출력하고 마지막에 줄바꿈을 붙여주는 함수 입니다.



이렇게 Go 언어의 특징과 동작 과정을 간단하게 알아보았습니다.


감사합니다.

반응형