데이터로 작업할 때 한 데이터 타입에서 다른 데이터 타입으로 변수를 변환해야 하는 경우가 종종 있습니다. 예를 들어 계산 결과를 표시하려면 플로트에서 스트링으로 변환해야 합니다.
Verse 내의 모든 타입 변환은 명시적이므로, 오브젝트를 다른 데이터 타입으로 변환하려면 ToString()
과 같은 함수를 사용하거나 곱하기(*
) 같은 연산자를 사용해야 합니다. 한 타입을 다른 타입으로 명시적으로 변환하는 것을 타입 캐스팅 이라고도 합니다.
플로트를 인티저로 변환하기
플로트에서 인티저로 변환하려면 부동 소수점 수에서 정수로 변환하는 방법을 명시적으로 지정하는 함수가 필요합니다. 다음 함수들은 모두 변환을 처리하지만 작동 방식은 각기 다릅니다. 주어진 상황에 어떤 것이 가장 적합한지 결정하는 것은 사용자의 몫입니다.
이 예시에서는 서로 다른 함수가 4개의 float
리터럴 값을 int
값으로 변환합니다. 그런 다음 set
이 int
타입 변수에 값을 할당합니다. if
표현식은 이러한 실패 가능 함수에 대한 실패 컨텍스트를 생성합니다.
var WoodCollected:int = 0
var StoneCollected:int = 0
var GoldCollected:int = 0
var FoodCollected:int = 0
if:
# 이제 'WoodCollected'는 2입니다.
set WoodCollected = Round[1.5]
# 이제 'StoneCollected'는 1입니다.
set StoneCollected = Floor[1.9]
# 이제 'GoldCollected'는 2입니다.
set GoldCollected = Ceil[1.2]
# 이제 'FoodCollected'는 1입니다.
set FoodCollected = Int[1.56]
Print("WoodCollected: {WoodCollected}")
Print("StoneCollected: {StoneCollected}")
Print("GoldCollected: {GoldCollected}")
Print("FoodCollected: {FoodCollected}")
인티저를 플로트로 변환하기
인티저에서 플로트 데이터 타입으로 변환하는 방법은 정수에 1.0을 곱하는 것입니다. 곱하기 연산자(*
)는 곱셈을 수행하기 전에 정수를 부동 소수점 숫자로 변환합니다.
이 코드는 int
변수 StartingPositionX
를 곱셈을 통해 float
로 변환하여 vector3
변수 선언에 사용할 수 있도록 합니다. 데이터 타입 vector3
은 X
, Y
, Z
필드에 float
유형 값이 필요합니다.
var StartingPositionX:int = 960
# CurrentX = 960.0
var CurrentX:float = StartingPositionX * 1.0
var CurrentPosition:vector3 = vector3{X := CurrentX, Y := 0.0, Z := 0.0}
Print("CurrentX: {CurrentX}")
스트링으로 변환
ToString()
함수 또는 스트링 보간을 사용하여 여러 데이터 타입을 string
으로 변환할 수 있으며, 이는 ToString()
함수를 호출합니다. 현재 Verse에서는 다음 타입에 ToString()
함수가 내장되어 있습니다.
- float
- int
- []char
- char
- vector2
- vector3
- rotation
이 예시에서는 스트링 보간과 ToString()
함수를 통해 변수가 스트링으로 변환되는 것을 볼 수 있습니다. 스트링 보간은 ToString()
을 호출하므로 두 방법 모두 동일한 결과를 가져옵니다.
var WoodCollected:int = 100
# 스트링 보간을 사용하여 변환하기
Print("WoodCollected: { WoodCollected }")
# ToString() 함수를 사용하여 변환하기
Print("WoodCollected: " + ToString(WoodCollected))
var InitialDistance:float = 3.625
# 스트링 보간을 사용하여 변환하기
Print("InitialDistance: { InitialDistance }")
# ToString() 함수를 사용하여 변환하기
Print("InitialDistance: " + ToString(InitialDistance))
var CurrentPosition : vector3 = vector3{X:= 960.0, Y:= 540.0, Z := 20.0}
# 스트링 보간을 사용하여 변환하기
Print("CurrentPosition: { CurrentPosition }")
# ToString() 함수를 사용하여 변환하기
Print("CurrentPosition: " + ToString(CurrentPosition))
커스텀 데이터 타입을 스트링으로 변환
커스텀 데이터 타입은 데이터 타입에 ToString(custom_type)
함수를 구현하여 스트링으로 변환할 수도 있습니다. ToString(custom_type)
함수가 있는 경우, 스트링 보간은 이 함수를 사용하여 데이터 타입을 스트링으로 자동 변환합니다.
다음은 열매 enum
에 대한 커스텀 ToString()
함수 예시입니다.
fruit := enum:
Apple
Banana
Strawberry
ToString(Fruit: fruit):string =
case(Fruit):
fruit.Apple => "Apple"
fruit.Banana => "Banana"
fruit.Strawberry => "Strawberry"
PickUpFruit():void =
# 스트링 보간을 사용하여 데이터를 스트링으로 변환하는 예시
var FruitItem:fruit = fruit.Banana
# 바나나 수집
Print("Picked up: {FruitItem}")
set FruitItem = fruit.Apple
# 사과 수집
Print("Picked up: {FruitItem}")
다음은 커스텀 클래스에 대한 커스텀 ToString()
함수 예시입니다. ToString()
함수가 waypoint
클래스 외부에서 선언된 것을 확인할 수 있습니다. SetDestination()
함수에서 Destination
의 스트링 보간은 커스텀 ToString()
함수를 호출하고 있습니다.
# 생성자와 ToString() 함수가 있는 커스텀 클래스
waypoint := class():
DisplayName:string
Position:vector3 = vector3{}
MakeWaypoint<constructor>(Name:string, X:float, Y:float, Z:float) := waypoint:
DisplayName := Name
Position := vector3{X := X, Y := Y, Z := Z}
ToString(Waypoint: waypoint):string =
return "{Waypoint.DisplayName} at {Waypoint.Position}"
SetDestination():void =
Destination:waypoint = MakeWaypoint("River", 919.0, 452.0, 545.0)
# {x=919.0, y=452.0, z=545.0}의 강
Print("Destination: {Destination}")
오브젝트 레퍼런스를 다른 유형으로 변환
다음 구문을 사용하여 오브젝트에 대한 레퍼런스(또는 타입 캐스팅)를 다른 클래스 또는 인터페이스로 명시적으로 변환할 수 있습니다.
if (NewObjectReference := object_type_to_cast_to[ObjectReference]) {}
object_type_to_cast_to 는 레퍼런스를 변환하려는 클래스 또는 인터페이스를 나타냅니다. 오브젝트를 지정된 타입으로 변환할 수 없는 경우 타입 변환이 실패하므로 실패 가능 표현식입니다. 클래스가 오브젝트 타입, 수퍼클래스 타입 또는 오브젝트 클래스가 구현하는 인터페이스와 일치하지 않으면 오브젝트 레퍼런스를 클래스로 변환하려는 시도가 실패합니다.
이 코드는 인터페이스 positionable
, positionable
을 상속하는 추상 클래스 shape
, shape
의 하위 클래스 triangle
과 square
를 선언합니다. 그런 다음 MyShape
라는 square
타입 오브젝트를 생성하고 이를 다른 세 가지 타입으로 타입 캐스팅하려고 시도합니다. 다음은 결과 분석입니다.
square 타입 캐스팅 |
결과 |
---|---|
square |
MyShape 이 square 이므로 성공 |
triangle |
triangle 이 square 의 수퍼클래스가 아니고, triangle 이 square 가 구현하는 인터페이스가 아니므로 실패 |
positionable |
square 가 shape 의 서브클래스이고 shape 의 모든 서브클래스는 positionable 을 구현해야 하므로 성공 |
# 클래스 및 인터페이스 정의
positionable := interface() {}
shape := class<abstract>(positionable) {}
triangle := class(shape) {}
square := class(shape) {}
# 수퍼클래스 타입 셰이프를 사용하여 참조되는 정사각형 오브젝트 생성
MyShape:shape = square{}
# 'MySquare'가 정사각형 오브젝트이므로 성공
if(MySquare := square[MyShape]):
Print("Successfully cast shape to square")
if(MyTriangle := triangle[MyShape]):
Print("This will never print.")
else:
Print("Failed to cast MyShape to triangle. This is expected behavior.")
# 위치 변경 가능한 인터페이스는 셰이프의 하위 클래스에 의해 구현되어야 하므로 성공
if(MyDrawable := positionable[MyShape]):
Print("Successfully cast shape to positionable")
마지막 예시에서는 타입 캐스팅이 작동하지만 필수는 아닙니다. 이 코드도 같은 결과를 가져올 것입니다.
MyDrawable:positionable = MyShape
타입 변환을 사용한 예시
UEFN에서 오브젝트 타입 변환의 한 가지 사용 사례는 특정 타입의 액터를 찾아서 타입에 따라 함수를 호출하는 것입니다. 방법을 알아보려면 게임플레이 태그 문서에서 게임플레이 태그로 액터 찾기를 참고하세요.