[Go] Conversion vs Casting

김무연·2025년 1월 21일

Go는 Type casting을 지원하지 않고 Type conversion을 지원한다.

Type conversion happens when we assign the value of one data type to another. Statically typed languages like
C / C++, Java, provide the support for Implicit Type Conversion but Golang is different, as it doesn’t support the Automatic Type Conversion or Implicit Type Conversion even if the data types are compatible. The reason for this is the Strong Type System of the Golang which doesn’t allow to do this. For type conversion, you must perform explicit conversion.
As per Golang Specification, there is no typecasting word or terminology in Golang. If you will try to search Type Casting in Golang Specifications or Documentation, you will find nothing like this. There is only Type Conversion. In Other programming languages, typecasting is also termed as the type conversion.

형변환(type conversion)은 값을 다른 데이터 타입으로 할당할 때 발생합니다. C / C++, Java와 같은 정적 타입 언어들은 암시적 형변환을 지원하지만 Go언어는 그렇지 않습니다. 데이터 타입이 호환되더라도 자동 형변환이나 암시적 형변환을 지원하지 않습니다. 그 이유는 Go언어의 강타입 시스템에서는 허용하지 않기 때문입니다. 형변환을 하기 위해서는 반드시 명시적 형변환으로 수행해야 합니다.
Go언어 스펙을 보면 Type casting이라는 용어가 없습니다. Type casting이란 단어를 스펙이나 문서에서 찾아 볼 수 없고 오직 Type conversion만 존재하며, 다른 프로그래밍 언어에서는 Type casting을 Type Conversion과 혼용하기도 합니다.
출처: GeeksforGeeks

Casting vs Conversion

Casting

타입 캐스팅의 경우 프로그램 설계 중에 프로그래머가 해당 언어의 캐스팅 연산자를 사용하여 기존 데이터 유형을 다른 데이터 유형으로 의도적으로 변환하는 작업

Conversion

타입 컨버젼의 경우 데이터 타입이 컴파일러 또는 인터프리터 등을 통해 컴파일러타임, 런타임을 통해 다른 데이터 타입으로 변환되는 작업. 그렇기에 대상 데이터 타입은 변경되는 타입보다 작을 수 없으므로 확장 변환(widening conversion)이라고도 한다. 그리고 가장 중요한 점은 서로 호환이 가능한 데이터 타입에만 적용할 수 있다.

  • 명시적 타입 캐스팅: 주로 기본 데이터 타입 간의 변환을 다루며, C/C++ 등에서 자주 사용되는 용어이다.
  • 명시적 타입 컨버전: 보다 포괄적인 개념으로, 기본 타입과 사용자 정의 타입 간의 변환을 모두 포함하며, 다양한 언어에서 사용된다.

결론적으로, 두 용어는 비슷하게 사용될 수 있지만, 맥락에 따라 차이가 있으며, 특정 언어에서 어떤 용어가 더 일반적으로 사용되는지가 중요하다

var x int8 = 5
// int32 데이터 타입으로 변경
var y int32 = int32(x)
  • 항상 범위를 염두에 두고 형변환을 할것
  • int8 > int32 로 작은 범위에서 넓은 범위로 변환할 경우는 안전하지만, int8 > uint8로 변환 할 때는 음수 때문에 오버플로우 문제가 발생할 수 있다. int32 > int8과 같은 경우도 마찬가지

문자열형 컨버젼

문자형인 byte, rune는 문자열형으로 컨버젼 할때는 string함수를 쓰면 간단하게 된다. 허나 정수를 문자열형으로 타입 컨버젼하거나, 문자열형을 정수로 컨버젼 해야할 경우 strconv 패키지를 이용

  • int > string : strconv.Itoa(값 또는 변수)
  • string > int : strconv.Atoi
  • float64 > string : strconv.FormatFloat(값, 'f', -1, 64)
  • string > float64 : strconv.ParseFloat(값, 64)

포매팅

포매팅이란 원하는 형태로 출력하는 것

  1. 논리형 포매팅

    %t

  2. 문자열형 포매팅

    문자열의 길이를 지정해주려면 포맷 앞에 숫자 넣어주기, 만약 숫자 만큼의 자리수가 안되면 공백을 앞에 채워준다. 하지만 숫자만큼의 자리수가 이미 넘어간다면 글자 그대로 출력이 된다
    공백대신 0으로 채워주고 싶은 0을 써줌
    %03s

	a := "가나"

	fmt.Printf("%3s", a)
    // ' 가나'
    
    b := "가나다라마"
    fmt.Printf("%3s", b)
    // "가나다라마"
  1. 정수형 포매팅

    1. 2진수 > %b
    2. 8진수 > %o
    3. 15진수 > %x
      마찬가지로 공백대신 0을 채워주고 싶으면 0을써줌
  2. 실수형 포매팅

    기본 형태는 다음과 같다 %f

    1. 소수점 2자리만 출력하고 싶을때는 .(dot)뒤에 숫자를 써줌
      %.2f
    2. 원하는 자릴수로 출력하고 싶을때는 '.'(dot)앞에 숫자를 써줌
      %9.3f // 9자리 출력하는데, 소수점은 3자리까지만 출력
    3. 실수부와 지수부 나누어표현
      %e
      1230000 은 1.23 * 10^6 으로 변경되는데, 이를 1.230000e+06 으로 출력
    4. %f와 %e중 나은지 판단 후 자동출력
      %g
  3. 기타 포매팅

    %T, %v

    1. %T
    • 특정 변수가 값이 어떤 데이터 타입인지 알려줌
    1. %v
    • 특정 변수가 정수형인지 논리형인지 자동으로 판단해 값을 출력
profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글