더북(TheBook)

3.2.4 숫자 연산

숫자 연산(산술 연산, 비교 연산)은 타입이 같은 숫자끼리만 할 수 있다. 타입이 다른 숫자끼리 연산하려면 반드시 타입을 변환해주어야 한다. 타입 변환 코드는 다음과 같다.

타입명(값)

타입이 다른 숫자끼리 연산하려고 하면 컴파일 에러가 발생한다.


i := 100000
j := int16(10000)
k := uint8(100)
 
fmt.Println(i + j)  // 컴파일 에러
fmt.Println(i + k)  // 컴파일 에러
fm t.Println(j > k) // 컴파일 에러

실행 결과

invalid operation: i + j (mismatched types int and int16)
invalid operation: i + k (mismatched types int and uint8)
invalid operation: j > k (mismatched types int16 and uint8)

반드시 같은 타입으로 변환한 후에 연산해야 한다.

i := 100000
j := int16(10000)
k := uint8(100)
 
fmt.Println(i + int(j)) // 110000
fmt.Println(i + int(k)) // 100100

타입 변환 연산은 오류를 발생시키지 않는다. 원래 값보다 작은 범위를 다루는 타입으로 변환할 때 변환은 성공하지만, 실제 변환된 값은 기대했던 결과와 다를 수 있다.

i := 100000
                 
fmt.Println(int16(i)) // -31072
fmt.Println(uint8(i)) // 160

안전하게 타입을 변환하려면 변환할 수 있는 값인지 먼저 점검한 후에 변환해야 한다.


package main
 
import (
    "fmt"
    "math"
)
 
func main() {
    fmt.Println(intToUint8(100))
    fmt.Println(intToUint8(1000))
}
 
func intToUint8(i int) (uint8, error) {
    if 0 <= i && i <= math.MaxUint8 {
        return uint8(i), nil
    }
    return 0, fmt.Errorf("%d cannot convert to uint8 type", i)
}

실행 결과

100 <nil>

0 1000 cannot convert to uint8 type

intToUint8() 함수는 int 값을 받아 그 값이 uint8 범위에 있으면 uint8로 변환한 값과 nil을 반환하고, 범위에 없으면 0error를 반환한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.