Crystal에는 다양한 목적을 위한 여러 가지 숫자 타입이 있어요. 예를 들어, 어떤 타입은 다른 타입보다 빠르지만 표현할 수 있는 값의 범위가 더 좁아요. 반대로 값의 범위는 더 넓지만 느린 타입도 있어요.
Crystal에는 부호 있는 정수 타입과 부호 없는 정수 타입이 모두 있어요. 부호 있는 정수 타입은 양수와 음수를 모두 나타낼 수 있어요. 부호 없는 정수 타입은 양수만 나타낼 수 있어요.
다음은 Crystal의 부호 있는 정수 타입이에요:
| 타입 | 크기 (비트) | 범위 |
|---|---|---|
Int8 |
8 | -128 ~ 127 |
Int16 |
16 | -32_768 ~ 32_767 |
Int32 |
32 | -2_147_483_648 ~ 2_147_483_647 |
Int64 |
64 | -9_223_372_036_854_775_808 ~ 9_223_372_036_854_775_807 |
Int128 |
128 | -170_141_183_460_469_231_731_687_303_715_884_105_728 ~ 170_141_183_460_469_231_731_687_303_715_884_105_727 |
작은 타입은 큰 타입보다 메모리를 적게 쓰고 더 빠르지만, 표현할 수 있는 값의 범위가 더 좁아요.
값이 특정 범위 안에 들어온다는 것을 알고 있다면, 메모리를 아끼고 성능을 높이기 위해 가능한 한 가장 작은 타입을 쓰는 게 가장 좋아요.
기본 정수 타입은 Int32예요.
특정 타입의 정수를 선언하려면 숫자 뒤에 <number>_I <bit> 형태로 접미사를 붙여 타입 이름을 지정할 수 있어요.
1_i8.class
# => Int8
to_i<bit> 메서드로 서로 다른 정수 타입 사이를 변환할 수 있어요.
to_i 메서드는 기본 정수 타입인 Int32로 변환해요.
1_i8.to_i16.class
# => Int16
2_i16.to_i.class
# => Int32
다음은 Crystal의 부호 없는 정수 타입이에요:
UInt8, UInt16, UInt32, UInt64, UInt128
부호 있는 정수와 부호 없는 정수의 유일한 차이는 부호 없는 정수가 양수만 나타낼 수 있다는 점이에요.
특정 타입의 부호 없는 정수를 선언하려면 숫자 뒤에 <number>_u<bit> 형태로 접미사를 붙여 타입 이름을 지정할 수 있어요.
to_u<bit> 메서드로 서로 다른 부호 없는 정수 타입 사이를 변환할 수 있어요.
to_u 메서드는 기본 부호 없는 정수 타입인 UInt32로 변환해요.
1_u8.to_u16.class
# => UInt16
다음은 Crystal의 부동소수점 타입이에요:
| 타입 | 크기 (비트) | 범위 |
|---|---|---|
Float32 |
32 | 1.2E-38 ~ 3.4E+38 |
Float64 |
64 | 2.3E-308 ~ 1.7E+308 |
부동소수점 타입은 두 가지가 있는데, 하나가 다른 하나보다 더 정밀해요.
기본 부동소수점 타입은 Float64예요.
to_f<bit> 메서드로 서로 다른 부동소수점 타입 사이를 변환할 수 있어요.
to_f 메서드는 기본 부동소수점 타입인 Float64로 변환해요.
ESA(Exercism Space Agency)는 화성의 위성인 포보스로 향하는 새 임무를 한창 계획하고 있어요. 이 임무의 목표는 탐사선을 포보스 표면에 착륙시키고 표면에 관한 데이터를 보내오는 것이에요. ESA는 탐사선의 항법 컴퓨터를 만드는 데 도움을 요청했어요. 항법 컴퓨터는 메모리가 제한적이라 메모리 사용량을 최대한 낮게 유지해야 해요. 그래서 알맞은 자료형을 사용해야 하죠.
항법 컴퓨터는 올바른 계산을 하려면 우주에 있는 여러 물체 사이의 거리를 알아야 하는데, 거리는 km 단위로 측정해요.
다음 상수를 정의해요.
NEPTUNE_DISTANCE: 값은 4_400_000_000이고 Int64로 저장해야 해요.MARS_DISTANCE: 값은 227_940_000이고 Int32로 저장해야 해요.ATMOSPHERE_DISTANCE: 값은 10_000이고 Int16으로 저장해야 해요.항법 컴퓨터는 올바른 계산을 하려면 우주에 있는 여러 물체의 면적을 알아야 해요. 면적은 절대 음수가 될 수 없어요. 엔지니어들은 면적이 음수일 때 오버플로 오류가 발생하도록 프로그램을 계획했어요. 하지만 엔지니어들은 부호 있는 정수를 부호 없는 정수로 바꾸는 것을 잊었어요.
그래서 엔지니어들은 부호 있는 정수를 부호 없는 정수로 변환하는 프로그램을 원해요.
measurement를 인자로 받아 면적을 32비트 부호 없는 정수로 반환하는 Navigation#correct_area_analysis 메서드를 구현해요.
주어지는 면적은 항상 32비트 부호 없는 정수로 표현할 수 있어요.
measurement = 52554
measurement.class
# => Int32
Navigation.new.correct_area_analysis(measurement)
# => 52554
Navigation.new.correct_area_analysis(measurement).class
# => UInt32
항법 컴퓨터는 탐사선의 속도를 알아야 해요. 속도는 m/s 단위로 측정해요.
속도를 계산하려면 이동한 거리와 그 거리를 이동하는 데 걸린 시간을 알아야 해요. 그런 다음 거리를 시간으로 나눠요.
속도는 정확하지 않아도 되고 아주 큰 수가 될 일도 없어요.
따라서 Float32를 사용할 수 있어요.
distance와 time을 인자로 받아 속도를 32비트 Float로 반환하는 Navigation#calculate_velocity 메서드를 구현해요.
distance = 52554
time = 2.5
Navigation.new.calculate_velocity(distance, time)
# => 21021.6
Navigation.new.calculate_velocity(distance, time).class
# => Float32
Exercism에 가입하고 Crystal 트랙을 개념 26개연습 문제 142개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.