5.1. 프로그램언어 고(Go)에서의 기본 데이터 타입

프로그램언어 고(Go)의 정수형 데이터 타입

프로그램언어 고(Go)에서는 정수형 데이터를 저장하기 위해 uint8, uint16, uint32, uint64와 같은 부호없는 정수형과 int8, int16, int32, int64와 같은 부호있는 정수형이 있습니다.


package main

import "fmt"

func main() {

    // 부호없는 정수형
    var u8 uint8 = 255 // 0부터 255까지의 값 저장
    var u16 uint16 = 65535 // 0부터 65535까지의 값 저장

    // 부호있는 정수형 
    var i8 int8 = -128 // -128부터 127까지의 값 저장 
    var i16 int16 = -32768 // -32768부터 32767까지의 값 저장

    fmt.Println(u8, u16)
    fmt.Println(i8, i16) 
}

uint8은 0부터 255까지의 값을, uint16은 0부터 65535까지의 값을 저장할 수 있는 부호없는 정수형 입니다.

반대로 int8은 -128부터 127까지, int16은 -32768부터 32767까지의 값을 저장할 수 있는 부호있는 정수형입니다.

정수형은 이처럼 데이터의 크기와 범위가 제한되어 있어 오버플로우(overflow)가 발생할 수 있습니다. 그래서 문제의 정수 범위를 파악하고 적절한 크기의 정수형을 사용하는 것이 중요합니다.

고(Go)의 정수형은 아키텍처에 따라 크기가 달라지는데, 64비트 시스템에서는 int와 int64가 같은 크기입니다. 실행 환경을 고려하여 타입을 선택하는 것이 좋습니다.

프로그램언어 고(Go)의 실수형 데이터 타입

고(Go) 프로그램 언어의 실수형 데이터 타입을 설명드리겠습니다.

고(Go)언어에서는 float32와 float64 두 가지 실수형 데이터 타입을 제공합니다.

var f1 float32 = 1.234
var f2 float64 = 5.678

위의 예제코드에서 보이는 것처럼 float32는 32비트 실수형 데이터를, float64는 64비트 실수형 데이터를 저장합니다.

float32은 소수점 이하 7자리까지의 정밀도를 가지며, float64는 소수점 이하 15자리까지의 높은 정밀도를 가집니다.

따라서 고성능 계산이 필요한 과학/공학적 계산을 위해서는 float64 타입을 주로 사용하고, 메모리 사용이 제약적이거나 정밀도가 그다지 중요치 않은 경우에 float32을 사용합니다.

var f3 float32 = 1.2
var f4 float64 = 1.23456789123456789

fmt.Println(f3) // 1.2
fmt.Println(f4) // 1.234567891234568

위의 예제코드를 보면 float32 타입 변수 f3은 선언된대로 1.2가 출력되지만,

float64 타입 변수 f4는 소수점 이하 15자리를 초과하는 값이라

정밀도의 한계로 인해 원래 값과 다르게 출력됨을 확인할 수 있습니다.

이처럼 고(Go)의 실수형 데이터 타입은 사용 목적과 필요한 정밀도에 따라
적절히 float32 나 float64 를 선택하여 사용할 수 있습니다.

더 자세한 내용이 궁금하다면 고(Go)언어 문서나 참고서를 참고하시기 바랍니다.

프로그램언어 고(Go)의 문자열 데이터 타입

프로그램언어 고(Go)에서 문자열은 UTF-8로 인코딩된 텍스트 데이터를 나타내는 데 사용되는 데이터 타입입니다.


package main

import "fmt"

func main() {

    // 문자열 리터럴을 사용하여 문자열 변수 선언
    var str string = "Hello World"

    // 문자열 포맷팅
    name := "John"
    greetings := fmt.Sprintf("Hello %s", name)

    // 문자열 연결
    str2 := str + " " + greetings

    fmt.Println(str)
    fmt.Println(greetings)
    fmt.Println(str2)
}

위의 예제코드에서 보다시피Go 언어에서는 문자열 리터럴을 ” (큰따옴표)로 감싸서 표현합니다.
그리고 + 연산자를 사용하여 문자열을 서로 연결할 수 있습니다.

또한 fmt 패키지의 Sprintf() 함수를 사용하여 문자열을 포맷팅할 수도 있습니다.

%s와 같은 서식 지정자를 사용하여 변수를 문자열에 삽입할 수 있습니다.

이외에도 strings, bytes 패키지 등을 사용하여 문자열을 조작하고 기능을 확장할 수 있습니다.

len() 함수로 문자열의 길이를 알 수 있고, 인덱스로 개별 문자에 접근할 수도 있습니다.

Go 언어의 문자열은 수정 불가능(immutable)한 값으로 취급되기 때문에 일반적으로 많은 언어와 다르게 유니코드 지원에 최적화되어 있습니다.

프로그램언어 고(Go)의 불린 데이터 타입

프로그램언어 고(Go)에서 불린(Boolean)은 true或false 두 가지 값만 가질 수 있는 논리형 데이터 타입입니다.

var b1 bool = true
var b2 bool = false

위의 예제코드에서 보다시피 변수 b1과 b2를 bool 타입으로 선언하고 각각 true와 false 값을 할당하고 있습니다.

부울값은 주로 조건문이나 반복문의 조건 표현식에서 사용됩니다. 예를 들어 다음과 같이 if문의 조건에 사용할 수 있습니다.

var isDone bool = false

if isDone {
   fmt.Println("작업 완료") 
} else {
   fmt.Println("작업 진행 중")
}

isDone 변수의 값에 따라 “작업 완료” или “작업 진행 중” 문자열을 출력하는 예제입니다.

또한 for문의 조건문에도 불린값을 활용할 수 있습니다.

for isDone == false {
    // do something
    isDone = true;
}

isDone이 false일 때 반복 실행하는 for문입니다.

이외에도 함수의 반환 값타입으로 bool을 사용하여 함수 실행 결과를 true/false로 반환할 수도 있습니다.

func isValid(s string) bool {
  // 문자열 s가 유효하면 true, 아니면 false 리턴 
  if validStr(s) {
    return true 
  } 
  return false
}

위 isValid 함수는 입력 문자열이 유효할 경우 true를, 그렇지 않으면 false를 반환하는 함수입니다.

이처럼 고(Go)에서는 bool 타입을 활용하여 논리적인 값을 표현하고 처리할 수 있습니다. 보다 복잡한 로직을 구현하는 데 있어서 bool값이 중요한 역할을 한다고 볼 수 있겠습니다.

지금까지 고(Go)언어의 불린(Boolean) 데이터 타입에 대해 간략히 설명해보았습니다. 더 궁금한 점이 있으시면 언제든지 문의 부탁드립니다.

프로그램언어 고(Go)의 에러 데이터 타입

프로그램언어 고(Go)에서는 에러를 처리하기 위해 error라는 인터페이스 타입을 제공합니다. error 인터페이스는 Error() 라는 메서드만 정의되어 있는 단순한 인터페이스입니다.

type error interface {
    Error() string
}

고(Go)에서 발생한 에러는 이 error 인터페이스를 구현한 타입의 값으로 표현됩니다. 예를 들어 다음과 같이 에러 처리를 할 수 있습니다.

func doSomething() error {
    // ...
    if err != nil {
        return err // 에러가 발생하면 error 타입 반환
    }
    return nil // 에러 없으면 nil 반환
}

func main() {
    if err := doSomething(); err != nil {
        fmt.Println(err) // 에러 처리
    }
}  

main() 함수에서 doSomething()을 호출하고 반환값 err을 확인합니다.
doSomething() 내부에서 에러가 발생했다면 error 타입의 객체가 반환되고, 이 객체의 Error() 메서드를 호출하면 에러에 대한 정보를 얻을 수 있습니다.

이러한 방식으로 고(Go)의 에러 처리는 간결하고 일관성 있게 처리할 수 있습니다.
custom 에러 타입을 정의할 수도 있습니다.

type ParseError struct {
    Filename string
    Line     int
}

func (e *ParseError) Error() string {
    return fmt.Sprintf("%s:%d: parsing error", e.Filename, e.Line) 
}

func parse(filename string) error {
    // 파싱 코드  
    // ...parsing...

    if parseError {
        return &ParseError{Filename: filename, Line: 10} 
    }

    return nil
}

이처럼 ParseError 타입을 정의하고 Error() 메서드를 구현하면 ParseError도 error 인터페이스를 만족하게 됩니다.
따라서 ParseError 타입을 반환하는 것도 가능합니다.

이를 통해 에러의 원인을 더 잘 표현할 수 있고 처리할 수 있습니다.
고(Go)의 error 타입은 인터페이스를 활용한 간결하고 유연한 에러 처리 체계를 제공합니다.

Leave a Comment