
Go 자료형 시작하기를 시작하며
코딩을 처음 시작할 때 가장 당혹스러운 순간이 언제인지 아시나요? 분명히 숫자를 넣었는데 컴퓨터가 “이건 숫자가 아니에요”라고 화를 내거나, 정수와 실수를 섞어서 썼을 때 빨간 줄이 뜨며 실행조차 되지 않는 상황이에요. Go 언어를 처음 접하는 분들이 가장 먼저 마주하는 거대한 벽이 바로 이 자료형(Data Types) 문제예요.
다른 언어들은 눈치껏 알아서 숫자를 맞춰주기도 하지만, Go는 아주 엄격한 성격의 언어예요. 정수와 실수를 아주 철저하게 구분하고, 타입이 맞지 않으면 절대 그냥 넘어가지 않죠. 처음에는 이런 엄격함이 귀찮게 느껴질 수 있지만, 사실 이게 바로 Go가 가진 강력한 성능과 안전성의 비결이에요. 데이터가 메모리에 어떻게 저장되는지 명확히 규정하기 때문에, 예측 불가능한 오류를 미리 차단할 수 있거든요.
단순히 “정수는 int, 실수는 float”라고 암기하는 방식으로는 실무에서 살아남기 어려워요. 왜 어떤 상황에서는 int64를 써야 하고, 왜 문자열을 다룰 때 rune이라는 개념을 알아야 하는지 그 원리를 이해하는 것이 훨씬 중요해요. 이 기초가 탄탄하지 않으면 나중에 복잡한 구조체를 만들거나 대규모 시스템을 설계할 때 계속해서 타입 오류 때문에 밤을 지새우게 될지도 몰라요.
오늘 이 글에서는 Go 자료형 시작하기를 주제로, 입문자가 반드시 알아야 할 핵심 내용을 아주 쉽고 상세하게 풀어드릴게요. 이론만 나열하는 지루한 강의가 아니라, 실제 개발 현장에서 어떤 고민을 하는지를 중심으로 이야기를 나눠볼게요.
이 글에서 함께 배울 내용들
- Go 언어의 기본 자료형 종류와 각 타입이 메모리를 사용하는 방식
- 상황에 맞는 적절한 자료형을 선택하는 실전 판단 기준
- 자주 발생하는 타입 불일치 오류를 해결하는 형 변환 방법
- 실제 코드 예제를 통한 변수 선언과 활용법
사전 준비 — 기본 이해와 체크리스트
본격적으로 코드를 작성하기 전에, 우리가 어떤 도구를 가지고 어떤 규칙 위에서 놀게 될지 먼저 파악해야 해요. 무작정 코드부터 타이핑하기보다는, Go가 데이터를 다루는 철학을 먼저 이해하면 학습 속도가 몇 배는 빨라져요.
Go는 정적 타입(Static Typing) 언어예요. 코드를 실행하기 전, 컴파일 단계에서 이미 모든 변수의 타입을 확정 지어야 한다는 뜻이죠. 이는 실행 중에 갑자기 타입이 변해서 발생하는 버그를 원천 봉쇄할 수 있다는 아주 큰 장점이 있어요. 또한, Go는 제로 값(Zero Value)이라는 독특한 개념을 가지고 있어요. 변수를 선언만 하고 값을 넣지 않아도, Go는 해당 타입에 맞는 기본값을 자동으로 채워준답니다. 이 개념을 모르면 “왜 내가 값을 안 넣었는데 0이 들어있지?”라며 당황할 수 있어요.
학습을 시작하기 전, 여러분의 개발 환경이 준비되었는지 아래 체크리스트를 통해 확인해 보세요.
- Go 컴파일러가 최신 버전으로 설치되어 있나요?
- VS Code 또는 GoLand 같은 에디터에 Go 확장 프로그램이 설치되었나요?
- 터미널에서
go version명령어가 정상적으로 작동하나요?
또한, 자료형을 선택할 때는 단순히 “작동하니까 쓴다”가 아니라, 메모리 효율과 데이터의 범위를 고려해야 해요. 아래 표를 통해 주요 자료형의 특성을 미리 비교해 보세요.
| 자료형 분류 | 주요 타입 | 특징 및 용도 | 주의 사항 |
|---|---|---|---|
| 정수형 | int, uint, int64 | 소수점이 없는 숫자. 카운트, 인덱스 등에 사용 | 오버플로우(범위 초과) 주의 |
| 실수형 | float32, float64 | 소수점이 포함된 숫자. 계산, 통계 등에 사용 | 부동 소수점 정밀도 문제 고려 |
| 문자열 | string | 텍스트 데이터. 이름, 메시지 등에 사용 | 불변성(수정 불가) 특징 이해 |
| 논리형 | bool | true 또는 false 값. 조건문에 사용 | 연산 시 형 변환 불가 |
Go에서 자료형을 선택할 때 가장 기본이 되는 원칙은 플랫폼의 비트 수를 따르는 것이에요. 64비트 컴퓨터라면 일반적인
int는 64비트 크기를 갖게 되죠. 하지만 메모리가 매우 제한적인 환경이라면 더 작은 타입(int8 등)을 골라야 할 때도 있어요.핵심 구현 — 단계별 자료형 마스터하기
이제 본격적으로 코드를 통해 자료형을 직접 만져볼 시간이에요. 단순히 문법을 외우는 것이 아니라, 각 타입이 어떤 상황에서 빛을 발하는지 흐름을 따라가 보세요.
STEP 1. 정수형(Integer) 정복하기
정수는 소수점이 없는 숫자를 의미해요. Go에서는 정수를 매우 세밀하게 나누어 관리할 수 있어요. 크게 부호가 있는 signed integer와 부호가 없는 unsigned integer로 나뉘죠.
가장 많이 쓰는 타입은 int예요. 시스템 환경에 따라 32비트 또는 64비트 크기가 자동으로 결정되죠. 만약 여러분이 사용자의 나이, 게시글의 조회수, 리스트의 인덱스 등을 다룬다면 int가 가장 무난한 선택이에요. 하지만 숫자의 범위가 아주 크거나 아주 작다면 명시적인 타입을 지정해야 해요.
- int8, int16, int32, int64: 각각 8, 16, 32, 64비트 크기를 가지며, 음수부터 양수까지 표현해요.
- uint8, uint16, uint32, uint64: 부호가 없는 양수 전용이에요. 음수가 필요 없는 데이터(예: 메모리 주소, 파일 크기)를 다룰 때 메모리를 더 효율적으로 쓸 수 있어요.
주의할 점: 정수형을 다룰 때는 항상 오버플로우(Overflow)를 조심해야 해요. 예를 들어 int8의 최대값은 127인데, 여기에 1을 더하면 갑자기 -128이 되어버리는 마법이 일어나거든요. 데이터의 범위를 미리 예측하고 타입을 선택하는 습관이 필요해요.
STEP 2. 실수형(Floating-point)과 정밀도 관리
소수점이 있는 숫자는 float32와 float64 두 가지로 나뉘어요. 현대적인 프로그래밍에서는 대부분 float64를 기본으로 사용해요. 왜냐하면 float32는 정밀도가 낮아서 계산을 반복하다 보면 아주 미세한 오차가 누적될 수 있기 때문이에요.
예를 들어, 금융 관련 계산이나 정밀한 물리 시뮬레이션을 한다면 반드시 float64를 사용해야 해요. 하지만 그래픽 프로그래밍처럼 속도가 극도로 중요하고 정밀도가 조금 떨어져도 괜찮은 상황이라면 float32가 유리할 수 있죠. Go 자료형 시작하기 과정에서 실수형을 다룰 때 가장 중요한 것은 “정밀도와 성능 사이의 균형”을 잡는 것이에요.
STEP 3. 문자열(String)과 유니코드 룬(Rune)의 차이
Go에서 문자열은 아주 강력하면서도 독특해요. 문자열은 내부적으로 byte(uint8)의 슬라이스로 취급돼요. 즉, 텍스트를 그냥 글자의 나열이 아니라 메모리에 저장된 숫자들의 나열로 보는 거죠.
여기서 입문자들이 가장 많이 헷갈리는 것이 바로 rune(룬) 개념이에요. 영문자는 1바이트로 표현이 가능하지만, 한글 같은 유니코드 문자는 한 글자당 3~4바이트를 차지해요. 그래서 문자열의 길이를 len() 함수로 구하면 글자 수가 아니라 바이트 수가 나온다는 사실을 꼭 기억해야 해요!
한글 한 글자를 정확히 다루고 싶다면 문자열을
[]rune 타입으로 변환해서 처리하세요. 그러면 바이트 단위가 아닌, 눈에 보이는 글자 단위로 안전하게 루프를 돌며 작업할 수 있어요.STEP 4. 논리형(Boolean)과 제로 값(Zero Value) 활용
bool 타입은 오직 true와 false만 가질 수 있어요. 조건문(if)이나 반복문에서 흐름을 제어할 때 핵심적인 역할을 하죠. Go의 매력 중 하나는 모든 자료형에 기본값이 있다는 점이에요.
- 정수형의 제로 값은 0
- 실수형의 제로 값은 0.0
- 불리언의 제로 값은 false
- 문자열의 제로 값은 “” (빈 문자열)
이 제로 값 덕분에 우리는 변수를 초기화하는 데 드는 에너지를 아낄 수 있고, 코드가 더 깔끔해져요. 하지만 “값이 설정되지 않았음”과 “0임”을 구분해야 하는 로직을 짤 때는 주의가 필요해요.
STEP 5. 실전! 변수 선언과 할당하기
이제 배운 내용을 바탕으로 코드를 작성해 볼게요. Go에는 변수를 선언하는 두 가지 주요 방법이 있어요. var 키워드를 사용하는 방법과, 함수 내부에서 := 연산자를 사용하는 단축 선언 방식이에요.
아래는 우리가 지금까지 배운 내용을 종합한 간단한 예시 시나리오예요. 사용자의 프로필 정보를 담는 아주 기초적인 구조를 상상해 보세요.
package main
import "fmt"
func main() {
// 1. var를 이용한 명시적 선언 (타입 지정)
var age int = 25
var weight float64 = 68.5
var name string = "민수"
var isStudent bool = true
// 2. := 연산자를 이용한 단축 선언 (타입 추론)
score := 95 // 자동으로 int로 결정됨
grade := "A" // 자동으로 string으로 결정됨
fmt.Println("이름:", name)
fmt.Println("나이:", age)
fmt.Println("성적:", score, grade)
}
단축 선언(:=)은 코드를 간결하게 만들어주지만, 반드시 함수 내부에서만 사용할 수 있다는 제약이 있어요. 전역 변수를 선언할 때는 반드시 var를 사용해야 한다는 점, 잊지 마세요!
자주 하는 실수와 해결법
학습 과정에서 누구나 한 번쯤 겪게 되는 시행착오들을 모아봤어요. 이 부분만 잘 넘어가도 여러분은 상위 10%의 입문자가 될 수 있어요.
- ❌ 정수와 실수를 그냥 더하려고 할 때
왜 발생하는가: Go는 타입이 다르면 연산을 허용하지 않아요.int와float64를 직접 더하면 컴파일 에러가 발생하죠.
✅ 해결법: 한쪽 타입을 다른 쪽으로 명시적 형 변환(Type Conversion) 해주세요. 예:float64(myInt) + myFloat - ❌ 문자열 길이를 글자 수로 착각할 때
왜 발생하는가:len("한글")은 6을 반환해요. 한글은 한 글자당 3바이트를 차지하기 때문이에요.
✅ 해결법: 글자 수를 세고 싶다면len([]rune("한글"))을 사용하세요. - ❌ 단축 선언(
:=)을 전역 변수에 사용하려고 할 때
왜 발생하는가::=는 함수 안에서만 유효한 문법이에요.
✅ 해결법: 패키지 수준의 변수는 반드시var키워드를 사용하세요. - ❌ 큰 숫자를
int8에 담으려고 할 때
왜 발생하는가: 지정된 범위(127)를 벗어나면 값이 뒤집히는 오버플로우가 발생해요.
✅ 해결법: 데이터의 최대 예상 범위를 고려하여int32나int64를 선택하세요. - ❌ 변수를 선언만 하고 사용하지 않을 때
왜 발생하는가: Go는 사용하지 않는 변수가 있으면 컴파일을 거부해요. 매우 엄격하죠.
✅ 해결법: 변수를 즉시 사용하거나, 테스트 중이라면 임시로_ = myVar와 같이 빈 식별자를 사용해 처리하세요.
자주 묻는 질문
Q. int와 int64는 어떤 차이가 있나요?
int는 여러분의 컴퓨터 환경에 따라 크기가 변하는 유연한 타입이에요. 64비트 환경에서는 int64와 크기가 같지만, 32비트 환경에서는 int32와 같아지죠. 반면 int64는 어떤 환경에서도 항상 64비트 크기를 유지해요. 아주 큰 숫자를 다뤄야 한다면 안전하게 int64를 쓰는 것이 좋아요.
Q. Go에서 왜 형 변환을 이렇게 번거롭게 명시적으로 해야 하나요?
그게 바로 Go가 추구하는 안전성 때문이에요. 언어 차원에서 자동으로 타입을 바꿔주다 보면, 프로그래머가 의도하지 않은 데이터 손실(예: 소수점 버림)이 발생할 수 있거든요. 명시적 형 변환은 “내가 이 데이터의 성격이 변한다는 것을 알고 있다”라는 의도를 컴파일러에게 전달하는 과정이에요.
Q. float32를 쓰면 안 되나요?
써도 괜찮아요! 하지만 대부분의 경우 float64를 권장해요. 요즘 컴퓨터는 64비트 연산에 최적화되어 있어 성능 차이가 거의 없으면서도, 정밀도는 훨씬 높기 때문이죠. 아주 특수한 하드웨어 제어 상황이 아니라면 float64를 기본값으로 생각하세요.
Q. 제로 값(Zero Value)을 언제 활용하면 좋을까요?
구조체를 만들거나 여러 변수를 한꺼번에 초기화할 때 매우 유용해요. 예를 들어, 사용자 정보를 담는 구조체를 만들 때 모든 필드를 일일이 0이나 빈 문자열로 채울 필요 없이, 선언만 해두면 Go가 알아서 깨끗한 기본값으로 채워주거든요. 이를 통해 초기화 코드를 줄이고 실수를 방지할 수 있어요.
핵심 요약과 다음 단계
오늘 우리는 Go 자료형 시작하기를 통해 Go 언어의 기초 체력을 길러보았어요. 자료형은 단순히 데이터를 담는 그릇이 아니라, 프로그램의 성능과 안정성을 결정짓는 설계도와 같아요.
- 정수형은 상황에 맞는 비트 수(int8~64)를 선택하여 오버플로우를 방지하세요.
- 실수형은 정밀도를 위해 기본적으로
float64를 사용하는 것이 안전해요. - 문자열을 다룰 때는 바이트 단위와 글자 단위(rune)의 차이를 반드시 구분하세요.
- 변수를 선언하지 않고 사용하거나, 선언만 하고 사용하지 않으면 에러가 발생해요.
- 형 변환은 반드시 명시적으로 작성하여 데이터 손실을 방지하세요.
- 모든 자료형에는 Go가 정해둔 ‘제로 값’이 존재한다는 점을 기억하세요.
자, 이제 기초를 닦았으니 실전으로 나아갈 차례예요. 오늘 바로 해볼 수 있는 작은 과제를 드릴게요.
오늘 당장 실행해 보세요
- 터미널을 열고
go run명령어로 간단한 정수 계산 프로그램을 만들어 보세요. - 자신의 생년월일을
int로, 키를float64로 선언하고 출력해 보세요. - 한글 이름을 포함한 문자열을 만들고
len()함수를 써서 바이트 수를 확인해 보세요.
이 과정이 익숙해졌다면, 다음 주에는 변수를 더 복잡하게 묶어서 다루는 구조체(Struct)와 배열(Array)을 공부해보는 것을 추천해요. 기초가 탄탄해야 복잡한 구조물도 흔들리지 않고 세울 수 있으니까요.
공부하다가 막히는 부분이나 이해가 안 되는 타입이 있다면 언제든 댓글로 남겨 주세요. 함께 고민하고 답변해 드릴게요! 여러분의 Go 정복을 응원합니다.
함께 읽으면 좋은 글: Go 자료형 완전 정복 가이드