Go에서 타입 변환(type conversion)은 어떻게 하나요?
_____A: Go에서 타입 변환은 한 타입의 값을 다른 타입으로 변환하는 과정을 말합니다. Go는 명시적인 타입 변환만 허용하며, 암시적 변환은 지원하지 않습니다.
Q: Go에서 타입 변환을 어떻게 하나요?
A: 타입 변환은 다음과 같이 `타입(값)` 형태로 명시적으로 수행합니다.
```go
var i int = 42
var f float64 = float64(i)
```
위 예제에서는 `int` 타입인 `i`를 `float64` 타입으로 변환했습니다.
Q: 모든 타입 간에 타입 변환이 가능한가요?
A: 아니요. 타입 변환은 타입이 표현하는 값이 호환될 수 있을 때만 가능합니다. 예를 들어, 정수(int)와 부동 소수(float64) 사이 변환은 가능하지만, 서로 완전히 다른 타입(예: int와 string) 사이에는 직접 변환할 수 없습니다.
Q: 사용자 정의 타입과 기본 타입 간에 타입 변환도 가능한가요?
A: 예, 가능합니다. 예를 들어,
```go
type MyInt int
var i int = 10
var m MyInt = MyInt(i) // int -> MyInt 변환
```
Q: 타입 변환 시 데이터 손실이 일어날 수 있나요?
A: 가능합니다. 예를 들어, `float64`에서 `int`로 변환 시 소수점 이하가 버려지며, 큰 값이 `int8` 등 작은 범위 타입으로 변환 시 오버플로우가 발생할 수 있습니다.
Q: 타입 변환할 때 문법 오류가 발생하는 대표적인 경우는?
A: 변환 대상과 변환 값이 호환되지 않는 경우입니다. 예를 들어,
```go
var s string = string(65) // 65는 rune(문자코드)로 변환은 되나, string과 int 직접 변환은 소재
var i int = int("123") // 오류: string -> int 직접 변환 불가
Q: `string`과 `[]byte`는 어떻게 변환하나요?
A:
- `string`을 `[]byte`로 변환: `[]byte(str)`
- `[]byte`를 `string`으로 변환: `string(bytes)`
예:
```go
str := "hello"
bytes := []byte(str)
str2 := string(bytes)
```
Q: 구조체 타입 간 변환은 가능한가요?
A: Go는 구조체 타입 간 자동 변환을 지원하지 않으며, 수동으로 필드별 값을 복사해야 합니다.
Q: 인터페이스 타입과 구체 타입 간 변환은 어떻게 하나요?
A: 인터페이스에서 구체 타입 변환은 타입 단언(type assertion)을 사용합니다.
```go
var i interface{} = 10
v := i.(int) // i가 int 타입일 경우 변환 성공, 아니면 런타임 패닉.
```
Q: 요약
- 타입 변환은 `타입(값)` 형태로 명시적으로 한다.
- 호환 가능한 타입 간에만 변환 가능.
- `string`과 `[]byte`는 특별하게 변환할 수 있음.
- 사용자 정의 타입과 기본 타입 간 변환도 가능.
- 구조체 간 자동 변환은 불가.
- 인터페이스는 타입 단언 활용.
Go는 정적 타입 언어이기 때문에, 변수의 타입은 선언 시에 결정되며, 타입 간의 변환이 필요할 때 명시적으로 수행해야 합니다.
타입 변환은 주로 두 가지 경우에 사용됩니다: 기본 타입 간의 변환과 사용자 정의 타입 간의 변환입니다.
기본 타입 간의 변환 Go에서는 기본 데이터 타입 간의 변환이 가능합니다.
예를 들어, `int`를 `float64`로 변환하거나, `string`을 `[]byte`로 변환하는 등의 작업을 수행할 수 있습니다.
기본 타입 간의 변환은 다음과 같은 형식으로 이루어집니다: ```go var a int = 42 var b float64 = float64(a) // int를 float64로 변환 var c string = "123" var d int fmt.Sscanf(c, "%d", &d) // string을 int로 변환 ``` 위의 예제에서 `float64(a)`는 `int` 타입의 변수 `a`를 `float64` 타입으로 변환합니다.
또한, `fmt.Sscanf` 함수를 사용하여 문자열을 정수로 변환하는 방법도 보여줍니다.
사용자 정의 타입 간의 변환 Go에서는 사용자 정의 타입 간의 변환도 지원합니다.
사용자 정의 타입은 기본 타입을 기반으로 하여 새로운 타입을 정의하는 것입니다.
예를 들어, `type` 키워드를 사용하여 새로운 타입을 정의할 수 있습니다.
```go type Celsius float64 type Fahrenheit float64 func CelsiusToFahrenheit(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 3
2) } func main() { var tempC Celsius = 25 var tempF Fahrenheit = CelsiusToFahrenheit(tempC) // 사용자 정의 타입 간의 변환 fmt.Println(tempF) // 출력: 77 } ``` 위의 예제에서 `Celsius`와 `Fahrenheit`는 각각 `float64`를 기반으로 한 사용자 정의 타입입니다.
`CelsiusToFahrenheit` 함수는 `Celsius` 타입의 값을 받아 `Fahrenheit` 타입으로 변환합니다.
주의사항 1. 타입 안전성 : Go는 타입 안전성을 보장하기 때문에, 서로 다른 타입 간의 변환은 명시적으로 수행해야 합니다.
예를 들어, `int`와 `float64`는 서로 다른 타입이므로, 직접적으로 대입할 수 없습니다.
2. 변환 불가능한 타입 : 모든 타입이 서로 변환 가능한 것은 아닙니다.
예를 들어, 구조체 타입 간의 변환은 직접적으로 지원되지 않으며, 변환을 위해서는 별도의 로직을 구현해야 합니다.
3. 정밀도 손실 : 기본 타입 간의 변환 시, 정밀도 손실이 발생할 수 있습니다.
예를 들어, `float64`를 `int`로 변환할 경우 소수점 이하의 값이 버려지게 됩니다.
결론 Go에서 타입 변환은 매우 중요한 개념이며, 이를 통해 다양한 데이터 타입을 유연하게 다룰 수 있습니다.
기본 타입 간의 변환과 사용자 정의 타입 간의 변환을 이해하고 적절히 활용하는 것이 Go 프로그래밍에서 중요한 요소입니다.
타입 변환을 사용할 때는 항상 타입 안전성과 정밀도 손실에 유의해야 합니다.
작성자:
정지우 [비회원]
| 작성일자: 1년 전
2024-09-19 01:50:29
조회수: 132 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 132 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.