IMCAT.DEV
로그인 가입
Go 중급 자료구조

Go 타입 시스템 (Type System)

Go 타입 시스템 (Type System) — 중급

타입 시스템 (Type System)

1. 도입 (왜 배워야 하는가)

Go 언어의 타입 시스템은 프로그래밍의 기초를 형성하는 중요한 요소입니다. 타입 시스템은 데이터의 종류와 그 데이터가 수행할 수 있는 작업을 정의합니다. 이 개념을 이해하지 못하면 코드에서 발생하는 오류를 사전에 예방하기 어려워지며, 이는 개발 과정에서 시간과 비용을 낭비하게 만듭니다. 예를 들어, 숫자와 문자열을 잘못 사용하면 프로그램이 예기치 않게 종료될 수 있습니다. 따라서 타입 시스템을 이해하고 활용하는 것은 안정적이고 유지보수가 용이한 코드를 작성하는 데 필수적입니다.

2. 핵심 개념 설명

2.1 기본 타입

  • 정수형 (int): 수치 데이터를 표현합니다. 예를 들어, 나이, 수량 등.
  • 부동 소수점형 (float64): 소수점을 포함한 숫자를 표현합니다. 예를 들어, 가격, 온도 등.
  • 문자열 (string): 문자들의 집합으로, 텍스트 데이터를 표현합니다.
  • 2.2 사용자 정의 타입

    Go에서는 사용자 정의 타입을 만들 수 있습니다. 이는 특정 용도에 맞는 타입을 정의하여 코드의 가독성을 높이고, 타입의 안전성을 강화합니다.

    타입설명
    int정수형
    float64부동 소수점형
    string문자열
    struct사용자 정의 복합 타입
    interface메서드 집합을 정의하는 타입

    3. 기본 코드 예제

    아래는 Go의 타입 시스템을 활용한 간단한 예제입니다.

    package main
    
    import "fmt"
    
    func main() {
        var age int = 30          // 정수형 변수 age 선언 및 초기화
        var price float64 = 19.99 // 부동 소수점형 변수 price 선언 및 초기화
        var name string = "Alice" // 문자열 변수 name 선언 및 초기화
    
        fmt.Println(name, "is", age, "years old and costs", price) // 변수 출력
    }

    실행 결과:

    Alice is 30 years old and costs 19.99
  • var age int = 30: age라는 이름의 정수형 변수를 선언하고 30으로 초기화합니다.
  • var price float64 = 19.99: price라는 이름의 부동 소수점형 변수를 선언하고 19.99로 초기화합니다.
  • var name string = "Alice": name이라는 이름의 문자열 변수를 선언하고 "Alice"로 초기화합니다.
  • fmt.Println(...): 세 개의 변수를 출력하여 결과를 보여줍니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰에서 장바구니 구현

    package main
    
    import "fmt"
    
    type Product struct {
        Name  string
        Price float64
    }
    
    type Cart struct {
        Items []Product
    }
    
    func (c Cart) AddProduct(p Product) {
        c.Items = append(c.Items, p) // 장바구니에 제품 추가
    }
    
    func (c Cart) TotalPrice() float64 {
        total := 0.0
        for _, item := range c.Items {
            total += item.Price // 모든 제품 가격의 합계
        }
        return total
    }
    
    func main() {
        cart := Cart{}
        cart.AddProduct(Product{"Laptop", 999.99})
        cart.AddProduct(Product{"Mouse", 25.50})
    
        fmt.Printf("Total Price: %.2f\n", cart.TotalPrice())
    }

    상황 설명: 쇼핑몰에서 고객이 장바구니에 제품을 추가하고, 총 가격을 계산하는 기능을 구현했습니다.

    예제 2: 학생 정보 관리

    package main
    
    import "fmt"
    
    type Student struct {
        Name  string
        Grade int
    }
    
    func main() {
        students := []Student{
            {"John", 90},
            {"Jane", 85},
        }
    
        for _, student := range students {
            fmt.Printf("%s scored %d\n", student.Name, student.Grade)
        }
    }

    상황 설명: 학생의 이름과 성적을 관리하는 시스템을 구현했습니다. 각 학생의 정보를 출력합니다.

    5. 흔한 실수와 주의사항

    실수 1: 타입 혼용

    var a int = 5
    var b float64 = 10.5
    // fmt.Println(a + b) // 오류 발생
  • 올바른 코드:
  • fmt.Println(float64(a) + b) // 타입 변환 후 덧셈

    실수 2: 초기화 누락

    var name string
    fmt.Println(name) // 빈 문자열 출력
  • 올바른 코드:
  • var name string = "Unknown"
    fmt.Println(name) // "Unknown" 출력

    6. 정리

    1. Go의 타입 시스템은 데이터의 종류를 정의하고 코드의 안전성을 강화합니다.
    2. 기본 타입과 사용자 정의 타입을 통해 다양한 데이터 구조를 생성할 수 있습니다.
    3. 실전에서 유용한 예제들을 통해 타입 시스템을 효과적으로 활용할 수 있습니다.
    4. 타입 혼용과 초기화 누락 등 흔한 실수를 피해야 합니다.
    5. 다음 학습 주제 추천

    6. Go의 인터페이스와 다형성
    7. 고루틴과 채널을 이용한 동시성 프로그래밍
    8. 에러 처리 및 패닉에 관한 심화 학습