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 파일들을 생성하면 하면 hello 와 extra는 폴더가 다르기 때문에, 서로 다른 패키지로 취급이 됩니다.
이것을 통해 이야기 하고 싶은 부분은
폴더가 다르면 패키지도 달라집니다.
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 코드를 기계어로 변환하여 실행 파일을 만듭니다.
이 때, GOOS와 GOARCH 환경변수를 통해 운영체제와 아키텍처에서 실행되는 실행 파일을 만들 수 있습니다.
ex)
GOOS=linux GOARCH=amd64 go build5번 - 실행
마지막으로 생성된 바이너리 실행 파일을 실행해주면 됩니다.
./바이너리 파일 이름이제 이전에 만든 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 언어의 특징과 동작 과정을 간단하게 알아보았습니다.
감사합니다.
'개발 > Go' 카테고리의 다른 글
| [Go 언어 학습기 #4] Go 언어(Golang) 의 함수 (0) | 2025.12.02 |
|---|---|
| [Go 언어 학습기 #3] Go 언어(Golang) 의 변수가 갖는 속성과 사용법 알아보기 (0) | 2025.11.30 |
| [Go 언어 학습기 #1] Go 언어(Golang) 시작하기: 설치, 환경 설정, 그리고 첫 번째 'Hello, World! (0) | 2025.11.25 |