Menu

Golang 자료형: int, float64, string, bool, byte, rune

Go의 내장 타입: 정수 크기와 범위, float32와 float64, bool, string, byte와 rune, 복소수, 제로 값, 그리고 %T로 값의 타입을 출력하는 방법을 다룹니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

Go의 기본 타입은 숫자, 불리언, 문자열입니다. 모든 변수는 컴파일 타임에 고정되는 정확히 하나의 타입을 가지며, Go는 타입 사이를 절대 알아서 변환해 주지 않습니다. %T는 어떤 값이든 그 타입을 출력합니다:

'G'int32 타입의 71로 출력된다는 점에 주목하세요. 작은따옴표로 감싼 문자는 룬이고, 룬은 숫자(유니코드 코드 포인트)입니다. runeint32의 별칭(같은 타입에 붙은 두 번째 이름)이므로 %Tint32라고 보고합니다. 마찬가지로 byteuint8로 보고됩니다.

정수

타입크기범위
int88비트-128에서 127
int1616비트-32,768에서 32,767
int3232비트약 -21억에서 21억
int6464비트약 -922경에서 922경
uint8 (byte)8비트0에서 255
uint1616비트0에서 65,535
uint3232비트0에서 약 43억
uint6464비트0에서 약 1844경
int, uint32 또는 64비트플랫폼의 워드 크기
uintptr플랫폼 크기포인터 값을 담음, 저수준 코드용

기본적으로 int를 쓰세요. len()int를 반환하고, 슬라이스 인덱스도 int이며, 반복 카운터도 int입니다. 모든 64비트 플랫폼에서 int는 64비트입니다. 크기가 약속의 일부일 때 크기가 정해진 타입을 쓰세요. 바이너리 파일 형식의 int32, 원시 바이트의 uint8, 나노초 단위 유닉스 타임스탬프의 int64 같은 경우입니다.

개수처럼 "음수가 될 수 없는" 양에 부호 없는 타입을 쓰지 마세요. 0 아래로 빼면 잡아낼 수 있는 음수가 아니라 거대한 수로 순환합니다.

한계와 오버플로

math 패키지에는 모든 한계에 대한 상수가 있습니다. 런타임에 오버플로하는 정수 산술은 조용히 순환합니다:

패닉도 오류도 없습니다. 127 + 1-128이 됩니다. 컴파일 타임에 검사되는 것은 상수 표현식뿐입니다(var b int8 = 128은 컴파일되지 않습니다). 데이터에서 오버플로가 일어날 수 있다면 연산 전에 확인하거나 math/big을 쓰세요.

정수 리터럴

million := 1_000_000   // underscores for readability (Go 1.13+)
mask := 0xFF           // hexadecimal
perm := 0o755          // octal (also the older form 0755)
flags := 0b1010        // binary

부동소수점 수

타입크기정밀도
float3232비트유효 자릿수 약 6에서 9자리
float6464비트유효 자릿수 약 15에서 17자리

소수점이나 지수가 있는 리터럴(2.5, 1e6)은 기본적으로 float64이고, math 패키지도 float64를 받고 반환합니다. 큰 배열의 메모리가 중요한 경우가 아니라면 이것을 쓰세요.

부동소수점은 이진수이므로 대부분의 십진 소수는 근삿값입니다:

여기서 두 가지 규칙이 나옵니다. 산술을 거친 실수는 절대 ==로 비교하지 마세요. 그리고 돈을 실수로 저장하지 마세요. 센트 단위 정수나 십진수 라이브러리를 쓰세요.

실수를 0으로 나누면 패닉 대신 +Inf, -Inf, NaN이 나옵니다. 정수를 0으로 나누면 런타임에 패닉이 나고(runtime error: integer divide by zero), 상수 0으로 나누는 것은 컴파일 오류입니다.

불리언

booltruefalse를 담으며 제로 값은 false입니다. Go는 숫자, 빈 문자열, nil을 불리언으로 취급하지 않습니다. if count {}는 컴파일 오류이니 if count > 0 {}이라고 쓰세요. 연산자는 &&, ||, !이며, &&||는 단락 평가를 합니다.

문자열

string은 불변인 바이트의 나열이며 보통 UTF-8 텍스트입니다. len(s)는 문자가 아니라 바이트를 셉니다:

é는 UTF-8에서 2바이트를 차지하므로, 다섯 글자인데 len은 6을 보고합니다. 큰따옴표 문자열은 \n 같은 이스케이프를 처리하고, 백쿼트로 감싼 원시 문자열은 처리하지 않으며 여러 줄에 걸칠 수 있습니다. strings 패키지는 문자열 페이지에서, UTF-8은 rune과 byte 페이지에서 깊이 다룹니다.

byte와 rune

별칭같은 타입담는 것
byteuint8원시 데이터 1바이트
runeint32유니코드 코드 포인트 하나

새 타입이 아니라 별칭입니다. byteuint8은 변환 없이 서로 바꿔 쓸 수 있습니다. 이름은 그 숫자가 무엇을 뜻하는지 알려 줍니다.

복소수

Go에는 내장 복소수 타입 complex64complex128이 있고, real, imag, math/cmplx 패키지를 함께 씁니다:

필요한 프로그램은 드물지만, 신호 처리와 일부 수치 코드에서는 씁니다.

복합 타입과 참조 타입

기본 타입은 합쳐져서 복합 타입이 됩니다. 각각 별도 페이지가 있습니다:

타입예시제로 값
배열[3]int0 세 개
슬라이스[]intnil
map[string]intnil
구조체struct{ X, Y int }모든 필드가 제로 값
포인터*intnil
함수func(int) intnil
채널chan intnil
인터페이스error, anynil

any는 (Go 1.18부터) interface{}의 별칭이며 어떤 타입의 값이든 담을 수 있습니다.

이름 있는 타입

기존 타입으로 새 타입을 정의할 수 있습니다. 표현은 같지만 별개의 타입이며, 메서드를 가질 수 있습니다:

type Celsius float64
type UserID int64

var t Celsius = 21.5
var f float64 = t // compile error: cannot use t (variable of float64 type Celsius) as float64 value in variable declaration

이 엄격함이 핵심입니다. OrderID가 필요한 곳에 실수로 UserID를 넘길 수 없습니다. 의도했다면 명시적으로 변환하세요: float64(t). 규칙은 타입 변환 페이지를, 숫자와 문자열 사이의 변환은 strconv 함수들을 참고하세요.

제로 값

모든 타입에는 제로 값이 있으며, 아무것도 대입하기 전의 변수가 담고 있는 값입니다. 숫자는 0, boolfalse, 문자열은 "", 포인터, 슬라이스, 맵, 채널, 함수, 인터페이스는 nil입니다. Go에는 초기화되지 않은 변수가 없습니다.

자주 묻는 질문

Go에서 int의 크기는 얼마인가요?

intuint는 64비트 플랫폼(amd64, arm64)에서 64비트, 32비트 플랫폼에서 32비트입니다. 파일 형식이나 네트워크 프로토콜처럼 크기가 고정되어야 한다면 int32, int64, uint8 등을 쓰세요. 일반적인 카운터, 인덱스, 길이에는 int를 씁니다.

Go에서 변수의 타입을 출력하려면 어떻게 하나요?

%T 동사를 씁니다: fmt.Printf("%T\n", x)int, float64, []string, main.User 등을 출력합니다. 코드에서는 reflect.TypeOf(x)가 같은 정보를 살펴볼 수 있는 값으로 반환합니다.

Go에서 byte와 rune의 차이는 무엇인가요?

byteuint8의 별칭이며 원시 데이터 1바이트를 담습니다. runeint32의 별칭이며 유니코드 코드 포인트 하나를 담습니다. 문자열은 바이트의 나열이고, for range로 순회하면 룬으로 디코딩됩니다.

Go에서 float32와 float64 중 무엇을 써야 하나요?

특별한 이유가 없다면 float64를 쓰세요. 부동소수점 리터럴의 기본 타입이고, math 패키지가 다루는 타입이며, float32의 약 6에서 9자리에 비해 약 15에서 17자리의 유효 십진 자릿수를 가집니다. 큰 배열에서 메모리를 절반으로 줄이거나 외부 형식에 맞출 때만 float32를 고르세요.

Go에서 int의 최댓값은 얼마인가요?

math 패키지의 상수를 쓰세요: math.MaxInt(64비트 플랫폼에서 9223372036854775807), math.MinInt, math.MaxInt64, math.MaxUint32 등. 런타임에 한계를 넘는 산술은 패닉 없이 조용히 순환(wrap around)합니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기