본문 바로가기
프로그래밍/기타

[Go] Java 개발자의 GoLang 튜토리얼 - 데이터 타입과 타입 변환 (Conversion)

by 사바라다 2023. 9. 4.

개요

안녕하세요. Java를 이미 배운 상태에서 새로운 언어인 GoLang을 처음부터 배우는건 귀찮고 힘듭니다. 그래도 배워야한다면 이미 배운 지식인 Java를 이용해서 비교해가면서 배워보는건 어떨까요 ? 저는 이러한 방법으로 Go 언어를 배웠습니다. 그랬더니 조금은 덜 지루했던것 같아요.

오늘은 Java와 비교하며 Go 언어의 문법적인 내용을 살펴보도록 하겠습니다.

데이터 타입

제일 처음 알아볼 Go 언어에 대한 내용은 DataType에 대한 내용입니다. DataType은 프로그램을 구성하는 가장 기본적인 메모리 구조에 대한 정의입니다. 어떤 DataType을 선택하느냐에 따라서 최적화된 프로그래밍이 가능합니다.

DataType은 변수의 값이 메모리에 할당되는 사이즈를 정의할 수 있고 Type을 정의할 수 있습니다. Go는 Java와 동일하게 정적타입 언어입니다. 즉 변수를 선언할 때 특정 타입을 선언해야한다는것을 의미하고 javascript와 같은 동적타입 언어와는 다르게 DataType의 변경을 도중에 허용하지 않는다는것을 의미합니다.

Go의 DataType은 크게 보았을 때 3가지 타입으로 나뉘어집니다.

  • bool : boolean 값을 표현하는 Type으로 true 또는 false를 나타냅니다.
  • numeric(숫자) : 숫자 값을 표현하는 Type 입니다. Integer Type, Floating Point Type, 그리고 Complex 타입을 나타냅니다.
  • string(문자) : 문자열을 표현하는 Type 입니다.

실제 코드로 사용한다면 아래처럼 사용할 수 있습니다. var 키워드는 변수를 사용할 때 사용하는 keyword 입니다. 아래의 예제에서는 type을 명시해주었습니다. 하지만 이러한 type은 선언과 동시에 초기화 된다면 생략해주어도 무관합니다.

package main

import "fmt"

func main() {
    var a bool = true    // Boolean
    var b int = 5        // Integer
    var c float32 = 3.14 // Floating point number
    var d string = "Hi!" // String
    var e = 5        // Integer 생략

    fmt.Println("Boolean: ", a)
    fmt.Println("Integer: ", b)
    fmt.Println("Float:   ", c)
    fmt.Println("String:  ", d)
    fmt.Println("Integer 생략 : ", e)
}
Boolean:  true
Integer:  5
Float:    3.14
String:   Hi!
Integer 생략 : 5

Integer Data Types

Java에서는 정수형 타입이라고하면 int, long 타입 등 정수를 표현할 수 있는 signed type을 제공하고 있습니다. go는 여기에 c나 c++를 배우셨으면 알수도 있는 0과 양의 정수만을 표현할 수 있는 unsigned type을 지원합니다. Java에서는 unsigned를 지원하지 않아서 아쉬웠는데 go에서는 지원해서 반갑게 느껴졌었어요. :)

  • Signed integers : 양수와 음수 그리고 0을 모두 표현할 수 있는 Type
  • Unsigned integers - 양수와 0만을 표현하고 음수는 표현할 수 없는 Type

 

사용할 수 있는 세부 Signed Integer의 타입은 아래와 같습니다.

타입(Type) 크기(Size) 범위(Range)
int 32bit os : 4 byte
64bit os : 8 byte
32 bit os : -2147483648 ~ 2147483647
64 bit os : -9223372036854775808 ~ 9223372036854775807
int8 1 byte -128 to 127
int16 2 byte -128 to 127
int32 4 byte -2147483648 to 2147483647
int64 8 byte -9223372036854775808 to 9223372036854775807

 

그리고 사용할 수 있는 세부 UnSigned Integer의 타입은 아래와 같습니다.

타입(Type) 크기(Size) 범위(Range)
uint 32bit os : 4 byte
64bit os : 8 byte
32 bit os : 0 ~ 4294967295
64 bit os : 0 ~ 18446744073709551615
uint8 1 byte 0 to 255
uint16 2 byte 0 to 65535
uint32 4 byte 0 to 4294967295
uint64 8 byte 0 to 9223372036854775807

Float Data Types

소수를 표기하는 DataType으로는 Float Type을 사용합니다. Java에서는 Float Type과 Double Type으로 나뉘어 Float 타입은 4byte, Double은 8Byte를 표기했었는데요. Go에서는 각각 float32, float64 타입으로 표기합니다. 각 크기와 범위는 아래와 같습니다.

타입(Type) 크기(Size) 범위(Range)
float32 4 byte -3.4e+38 ~ 3.4e+38
float64 8 byte -1.7e+308 to +1.7e+308

각 타입간의 변환

개발을 하다보면 타입의 변환은 자연스럽게 필요하게 됩니다. Http Request를 String으로 받은것을 각 포맷에 맞게 변환하는 등 말이지요. 오늘 마지막으로 타입의 변환에 대해서 알아보도록 하겠습니다.

int 와 uint의 타입 변환

int에서 uint로 타입변환을 진행할때 정상적으로 변환되는 케이스와 변환되지 않는 케이스가 있습니다.

아래 케이스는 정상적으로 변환되지 않는 케이스입니다.

  • 변환하고자 하는 DataType의 크기가 작다면 의도가 담긴 결과를 얻을 수 없을 수 있습니다.
    • 예: uint64 -> uint32의 경우 uint32 보다 큰 수를 변환하고자할 때..
  • int에서 unit로 변환할 때 음수를 변환하면 uint는 음수를 지원하지 않기때문에 의도가 담긴 결과를 얻을 수 없습니다.

이러한 케이스를 제외하고는 아래처럼으로 변환할 수 있습니다.

var b int = 5 // Integer

newInt := int64(b)
newInt2 := int(b)
newUint := uint32(b)
newUint2 := int64(newUint)

fmt.Println("newInt: ", newInt)
fmt.Println("newInt2: ", newInt2)
fmt.Println("newUint: ", newUint)
fmt.Println("newUint2: ", newUint2)

변환이 아주 간편한것을 알 수 있습니다. Java와 비교해보면 Java의 (int) b 와 유사한 형태로 변환되는것이라고도 할 수 있을것 같습니다. 위 코드의 출력결과는 아래와 같습니다.

newInt:  5
newInt2:  5
newUint:  5
newUint3:  5

string to int

string의 numeric Type으로의 변환에는 strconv package의 함수들을 사용할 수 있습니다.

var iString string = "5" // Integer

var i, _ = strconv.Atoi(iString) // 정수형 int 형으로 타입 변환
var i2, _ = strconv.ParseInt(iString, 0, 64) // 정수형 int64 형으로 타입 변환
var ui3, _ = strconv.ParseUint(iString, 0, 64) // 정수형 int64 형으로 타입 변환, 마지막 파라미터를 변경하는것으로 32, 16 bit로 변경할 수 있습니다.

fmt.Printf("i type : %T, value : %v \n", i, i)
fmt.Printf("i2 type : %T, value : %v \n", i2, i2)
fmt.Printf("i3 type : %T, value : %v \n", ui3, ui3)

이렇게 코드를 실행하면 아래와 같습니다.

i type : int, value : 5 
i2 type : int64, value : 5 
ui3 type : uint64, value : 5 

int to string

반대로 integer 값을 string으로 변경하는 방법에 대해서 알아보도록 하겠습니다. 위와 동일하게 strconv 패키지를 사용합니다.

이는 int64로 먼저 변환한 후 string으로 변경하는 과정을 거칩니다.

Atoi의 반대인 Itoa를 이용하면 string으로 int 타입을 간단하게 변경할 수 있습니다.

var iString string = "5" // Integer
var i, _ = strconv.Atoi(iString)

var str = strconv.FormatInt(int64(i), 10) // int64 타입을 string으로 변경
var str2 = strconv.Itoa(i) 

fmt.Println("str : ", str)
fmt.Println("str2 : ", str2)

결과는 아래와 같습니다.

str :  5
str2 :  5

마무리

오늘은 이렇게 GoLang의 DataType과 타입의 변환에 대해서 자세히 알아보는 시간을 가져보았습니다.

감사합니다.

참조

[1] https://go-tour-ko.appspot.com/list

[2] https://www.w3schools.com/go/go_data_types.php

댓글