타입 단언
Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨 — 68개 중 17번째.
인터페이스 변수를 다룰 때, 그 안에 저장된 실제 구체적인 값에 접근해야 하는 경우가 많습니다. 이때 타입 단언(type assertions)이 필요합니다. 타입 단언을 사용하면 내부에 저장된 값을 안전하게 추출하고 사용할 수 있습니다.
타입 단언(type assertion)은 다음 구문을 사용합니다: value, ok := interfaceVariable.(Type). 첫 번째 반환 값은 지정된 타입으로 추출된 값이며, 두 번째는 단언의 성공 여부를 알려주는 불리언(boolean) 값입니다.
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}ok 변수는 안전을 위해 매우 중요합니다. 잘못된 타입을 단언(assert)하려고 하면, ok는 false가 되고, value는 해당 타입의 제로 값(zero value)이 됩니다. ok를 확인하지 않으면, 타입 단언 실패 시 프로그램이 패닉(panic) 상태에 빠질 수 있습니다.
interface{} 값을 다룰 때 타입 단언(Type assertions)은 필수적이며, 이를 통해 제네릭 인터페이스를 특정 타입으로 다시 변환하여 해당 타입의 메서드와 연산을 사용할 수 있습니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움이 챌린지에서는 타입 단언(type assertions)을 사용하여 인터페이스 변수에서 구체적인 값을 안전하게 추출하고 작업하는 연습을 합니다. 빈 인터페이스에 저장된 다양한 유형의 값을 처리하는 데이터 분석기를 만들게 됩니다.
두 개의 입력을 받게 됩니다:
- 확인할 데이터 타입을 나타내는 문자열 (예:
"int","string", 또는"bool") - 실제 값을 나타내는 문자열 (예:
"42","hello", 또는"true")
수행할 작업은 다음과 같습니다:
- 값 문자열을 적절한 Go 타입으로 변환하고
interface{}변수에 저장합니다:"int"의 경우: 정수로 변환"string"의 경우: 문자열로 사용"bool"의 경우: 불리언으로 변환
- 타입 단언을 사용하여 인터페이스 변수가 첫 번째 입력에서 지정된 예상 타입을 포함하고 있는지 확인합니다.
- 타입 단언에 성공하면 다음을 출력합니다:
"Success: [value] is a [type]" - 타입 단언에 실패하면 다음을 출력합니다:
"Failed: value is not a [type]"
단언이 성공했는지 확인하려면 ok 변수와 함께 안전한 타입 단언 구문을 사용해야 합니다. 이 챌린지는 프로그램이 패닉(panic)을 일으키지 않고 인터페이스 변수에서 구체적인 값을 안전하게 추출하는 방법을 이해하고 있는지 테스트합니다.
불리언 변환의 경우, "true"는 true로 변환되어야 하며 그 외의 다른 문자열은 false로 변환되어야 합니다. 문자열을 정수로 변환하려면 strconv 패키지를 사용하세요.
치트 시트
타입 단언(Type assertions)을 사용하면 value, ok := interfaceVariable.(Type) 구문을 사용하여 인터페이스 변수에서 구체적인 값을 추출할 수 있습니다:
var data interface{} = 42
number, ok := data.(int)
if ok {
fmt.Println("It's an integer:", number)
} else {
fmt.Println("Not an integer")
}ok 변수는 단언이 성공했는지 여부를 나타냅니다. 만약 false라면, value는 해당 타입의 제로 값(zero value)이 됩니다. 실패한 단언으로 인한 패닉(panic)을 방지하기 위해 항상 ok를 확인하세요.
직접 해보기
package main
import (
"fmt"
"strconv"
)
func main() {
// 입력 읽기
var dataType string
var valueStr string
fmt.Scanln(&dataType)
fmt.Scanln(&valueStr)
// 인터페이스 값을 저장할 변수
var interfaceValue interface{}
// TODO: 아래에 코드를 작성하세요
// 1. dataType에 따라 valueStr을 적절한 타입으로 변환하고 interfaceValue에 저장합니다.
// 2. 타입 단언(type assertion)을 사용하여 interfaceValue에 예상되는 타입이 포함되어 있는지 확인합니다.
// 3. 적절한 성공 또는 실패 메시지를 출력합니다.
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.