ν™ˆ [Rust] μžλ£Œν˜•
포슀트
μ·¨μ†Œ

[Rust] μžλ£Œν˜•


Title


κ°œμš”

Rustμ—μ„œμ˜ λͺ¨λ“  값은 νŠΉμ • μžλ£Œν˜•μ„ 가진닀. μ΄λŠ” Rustμ—κ²Œ μ–΄λ–€ μ’…λ₯˜μ˜ 데이터가 μ§€μ •λ˜μ—ˆλŠ”μ§€λ₯Ό μ•Œλ €μ£Όλ©°, κ·Έ 데이터λ₯Ό μ–΄λ–»κ²Œ 닀루어야 할지 κ²°μ •ν•  수 있게 ν•΄μ€€λ‹€. 이 κΈ€μ—μ„œλŠ” μ—¬λŸ¬ μ’…λ₯˜μ˜ μŠ€μΉΌλΌμ™€ 볡합 νƒ€μž…μ— λŒ€ν•΄ μ•Œμ•„λ³Ό 것이닀.

RustλŠ” 정적 νƒ€μž… 언어이닀. μ΄λŠ” 컴파일 μ‹œκ°„μ— λͺ¨λ“  λ³€μˆ˜μ˜ νƒ€μž…μ„ μ»΄νŒŒμΌλŸ¬κ°€ μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. μ»΄νŒŒμΌλŸ¬λŠ” λ³€μˆ˜μ— ν• λ‹Ήλœ κ°’κ³Ό κ·Έ κ°’μ˜ μ‚¬μš© 방법을 톡해 νƒ€μž…μ„ μΆ”λ‘ ν•  수 μžˆλ‹€. κ·ΈλŸ¬λ‚˜ μ—¬λŸ¬ 가지 νƒ€μž…μ΄ 올 수 μžˆλŠ” μƒν™©μ—μ„œλŠ”(String을 숫자둜 λ°”κΎΈλŠ”(parse) λ“±μ˜ 경우), νƒ€μž…μ„ λͺ…ν™•νžˆ 지정해주어야 ν•œλ‹€:

1
let guess: u32 = "42".parse().expect("μˆ«μžκ°€ μ•„λ‹™λ‹ˆλ‹€!");

λ§Œμ•½ μš°λ¦¬κ°€ μœ„ μ½”λ“œμ—μ„œ : u32λΌλŠ” νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ RustλŠ” μ•„λž˜μ™€ 같은 μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•  것이닀. 이 λ©”μ‹œμ§€λŠ” μ»΄νŒŒμΌλŸ¬κ°€ μš°λ¦¬κ°€ μ‚¬μš©ν•  νƒ€μž…μ— λŒ€ν•œ 보닀 ꡬ체적인 정보λ₯Ό ν•„μš”λ‘œ ν•œλ‹€λŠ” 것을 λ‚˜νƒ€λ‚Έλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cargo build
   Compiling no_type_annotations v0.1.0 (file:///projects/no_type_annotations)
error[E0282]: type annotations needed
 --> src/main.rs:2:9
  |
2 |     let guess = "42".parse().expect("Not a number!");
  |         ^^^^^
  |
help: consider giving `guess` an explicit type
  |
2 |     let guess: _ = "42".parse().expect("Not a number!");
  |              +++

For more information about this error, try `rustc --explain E0282`.
error: could not compile `no_type_annotations` due to previous error

슀칼라 νƒ€μž…

슀칼라 νƒ€μž…μ€ 단일 값을 λ‚˜νƒ€λ‚Έλ‹€. Rustμ—λŠ” λ„€ 가지 κΈ°λ³Έ 슀칼라 νƒ€μž…μ΄ μžˆλ‹€: μ •μˆ˜, 뢀동 μ†Œμˆ˜μ  숫자, λΆˆλ¦¬μ–Έ, 그리고 λ¬Έμžμ΄λ‹€.

이제 이 νƒ€μž…λ“€μ΄ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž.


μ •μˆ˜ νƒ€μž…

μ •μˆ˜λŠ” μ†Œμˆ˜μ μ΄ μ—†λŠ” 숫자λ₯Ό μ˜λ―Έν•œλ‹€. μš°λ¦¬λŠ” 이전 μž₯μ—μ„œ u32와 같은 μ •μˆ˜ νƒ€μž…μ„ μ‚¬μš©ν–ˆμ—ˆλ‹€. 이 νƒ€μž… 선언은 λ°”μΈλ”©λœ 값이 32λΉ„νŠΈμ˜ 곡간을 μ°¨μ§€ν•˜λŠ” λΆ€ν˜Έ μ—†λŠ” μ •μˆ˜μ—¬μ•Ό 함을 μ§€μ‹œν•œλ‹€(λΆ€ν˜Έκ°€ μžˆλŠ” μ •μˆ˜ νƒ€μž…μ€ u λŒ€μ‹  i둜 μ‹œμž‘ν•œλ‹€). μ•„λž˜ ν‘œμ— Rustμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ •μˆ˜ νƒ€μž…μ΄ λ‚˜μ—΄λ˜μ–΄ μžˆλ‹€. μš°λ¦¬λŠ” μ•„λž˜ 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μˆ˜ νƒ€μž…μ„ μ„ μ–Έν•  수 μžˆλ‹€.

Rust의 μ •μˆ˜ νƒ€μž…

κΈΈμ΄λΆ€ν˜Έ μžˆμŒλΆ€ν˜Έ μ—†μŒ
8λΉ„νŠΈi8u8
16λΉ„νŠΈi16u16
32λΉ„νŠΈi32u32
64λΉ„νŠΈi64u64
128λΉ„νŠΈi128u128
μ•„ν‚€ν…μ²˜isizeusize

각 νƒ€μž…μ€ λΆ€ν˜Έκ°€ μžˆκ±°λ‚˜ 없을 수 있으며, λͺ…μ‹œμ μΈ 크기λ₯Ό 가지고 μžˆλ‹€. λΆ€ν˜Έ 있음과 λΆ€ν˜Έ μ—†μŒμ€ μˆ«μžκ°€ μŒμˆ˜μΈμ§€ μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λ©°, μˆ«μžμ— λΆ€ν˜Έκ°€ ν•„μš”ν•œμ§€(λΆ€ν˜Έ 있음), μ•„λ‹ˆλ©΄ 항상 μ–‘μˆ˜μ΄λ―€λ‘œ λΆ€ν˜Έ 없이 ν‘œν˜„ν•  수 μžˆλŠ”μ§€(λΆ€ν˜Έ μ—†μŒ)λ₯Ό μ˜λ―Έν•œλ‹€. μ΄λŠ” 숫자λ₯Ό 쒅이에 μ“°λŠ” 것과 λΉ„μŠ·ν•˜λ‹€. λΆ€ν˜Έκ°€ μ€‘μš”ν•œ 경우, μˆ«μžλŠ” ν”ŒλŸ¬μŠ€ λ˜λŠ” λ§ˆμ΄λ„ˆμŠ€ κΈ°ν˜Έμ™€ ν•¨κ»˜ μž‘μ„±ν•˜μ§€λ§Œ, μˆ«μžκ°€ μ–‘μˆ˜λΌκ³  κ°€μ •ν•  수 μžˆλŠ” κ²½μš°μ—λŠ” λΆ€ν˜Έ 없이 μž‘μ„±ν•œλ‹€. λΆ€ν˜Έ μžˆλŠ” μˆ«μžλŠ” 2의 λ³΄μˆ˜λ²•μ„ μ‚¬μš©ν•˜μ—¬ λ©”λͺ¨λ¦¬μ— μ €μž₯λœλ‹€.

λΆ€ν˜Έ μžˆλŠ” νƒ€μž…μ€ 각각 $-(2^{n-1})$μ—μ„œ $2^{n-1} - 1$(포함) μ‚¬μ΄μ˜ 숫자λ₯Ό μ €μž₯ν•  수 μžˆλ‹€. μ—¬κΈ°μ„œ $n$은 νƒ€μž…μ΄ μ‚¬μš©ν•˜λŠ” λΉ„νŠΈ μˆ˜μ΄λ‹€. κ·ΈλŸ¬λ―€λ‘œ, i8은 $-128$λΆ€ν„° $127$κΉŒμ§€μ˜ 숫자, 즉 $-(2^7)$λΆ€ν„° $2^7 - 1$κΉŒμ§€λ₯Ό μ €μž₯ν•  수 μžˆλ‹€. 반면 u8은 $0$λΆ€ν„° $255$, 즉 $0$λΆ€ν„° $2^8 - 1$ μ‚¬μ΄μ˜ 숫자λ₯Ό μ €μž₯ν•  수 μžˆλ‹€.

λ˜ν•œ isize와 usize νƒ€μž…μ€ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” μ»΄ν“¨ν„°μ˜ μ•„ν‚€ν…μ²˜μ— μ˜μ‘΄ν•˜λŠ”λ°, μ΄λŠ” ν‘œμ— β€œμ•„ν‚€ν…μ²˜β€λ‘œ λͺ…μ‹œλ˜μ–΄ μžˆλ‹€. 64λΉ„νŠΈ μ•„ν‚€ν…μ²˜μ—μ„œλŠ” 64λΉ„νŠΈ, 32λΉ„νŠΈ μ•„ν‚€ν…μ²˜μ—μ„œλŠ” 32λΉ„νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€.

μ •μˆ˜ λ¦¬ν„°λŸ΄μ€ μ•„λž˜ ν‘œμ— μ œμ‹œλœ λ‹€μ–‘ν•œ ν˜•μ‹μœΌλ‘œ μž‘μ„±ν•  수 μžˆλ‹€. λ‹€μ–‘ν•œ νƒ€μž…μœΌλ‘œ 해석될 수 μžˆλŠ” 숫자 λ¦¬ν„°λŸ΄μ—λŠ” νƒ€μž…μ„ μ§€μ •ν•˜λŠ” 접미사λ₯Ό 뢙일 μˆ˜λ„ μžˆλ‹€. 예λ₯Ό λ“€μ–΄ 57u8κ³Ό 같은 ν˜•νƒœλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€. λ˜ν•œ 숫자 λ¦¬ν„°λŸ΄μ—μ„œλŠ” 가독성을 μœ„ν•΄ _λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 즉, 1_000은 1000κ³Ό 같은 값이닀.

Rustμ—μ„œμ˜ μ •μˆ˜ λ¦¬ν„°λŸ΄

숫자 λ¦¬ν„°λŸ΄μ˜ˆμ‹œ
10진법98_222
16진법0xff
8진법0o77
2진법0b1111_0000
λ°”μ΄νŠΈ(u8 μ „μš©)b'A'

μ •μˆ˜ νƒ€μž…μ„ κ²°μ •ν•˜λŠ” 것이 μ–΄λ €μš΄ 경우, Rustκ°€ μ œκ³΅ν•˜λŠ” 기본값을 λ”°λ₯΄λŠ” 것을 μΆ”μ²œν•˜λ‹€. RustλŠ” νŠΉλ³„ν•œ 지정이 μ—†λŠ” 경우 i32λ₯Ό μ •μˆ˜μ˜ κΈ°λ³Έ νƒ€μž…μœΌλ‘œ ν•œλ‹€. μ΄λŠ” λŒ€λΆ€λΆ„μ˜ μƒν™©μ—μ„œ μ μ ˆν•œ μ„±λŠ₯κ³Ό λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ œκ³΅ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

κ·ΈλŸ¬λ‚˜ isizeλ‚˜ usize νƒ€μž…μ€ νŠΉλ³„ν•œ κ²½μš°μ— μ‚¬μš©λ˜κ³€ ν•œλ‹€. 이 νƒ€μž…λ“€μ€ 주둜 μ»¬λ ‰μ…˜μ˜ 인덱싱에 μ‚¬μš©λœλ‹€. μ»¬λ ‰μ…˜μ˜ ν¬κΈ°λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” μ‹œμŠ€ν…œμ˜ μ•„ν‚€ν…μ²˜μ— 의쑴적이기 λ•Œλ¬Έμ—, 이 νƒ€μž…λ“€μ€ ν•΄λ‹Ή μ‹œμŠ€ν…œμ—μ„œ κ°€μž₯ 효율적인 λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. λ”°λΌμ„œ, λ°°μ—΄κ³Ό 같은 μ»¬λ ‰μ…˜μ˜ 인덱슀둜 μ‚¬μš©λ  λ•Œ, isizeλ‚˜ usizeλŠ” ν•΄λ‹Ή ν”Œλž«νΌμ— λ§žλŠ” 인덱슀 크기λ₯Ό μžλ™μœΌλ‘œ μ‘°μ •ν•œλ‹€.

μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš°

μš°λ¦¬κ°€ u8 νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό 가지고 μžˆλ‹€κ³  ν•΄λ³΄μž. 이 λ³€μˆ˜λŠ” $0$μ—μ„œ $255$ μ‚¬μ΄μ˜ 값을 담을 수 μžˆλ‹€. 이 λ³€μˆ˜μ— $256$ 같이 λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ 값을 ν• λ‹Ήν•˜λ €κ³  ν•˜λ©΄ μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•˜λ©°, 두 가지 λ°˜μ‘μ„ μœ λ°œν•  수 μžˆλ‹€. 디버그 λͺ¨λ“œμ—μ„œ μ»΄νŒŒμΌν•  λ•Œ, RustλŠ” μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš°λ₯Ό ν™•μΈν•˜λŠ” 검사λ₯Ό ν¬ν•¨ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ΄ λŸ°νƒ€μž„ μ‹œκ°„μ— νŒ¨λ‹‰ μƒνƒœμ— 빠지도둝 ν•œλ‹€. RustλŠ” ν”„λ‘œκ·Έλž¨μ΄ μ—λŸ¬λ‘œ 인해 μ’…λ£Œλ  λ•Œ νŒ¨λ‹‰!(panic!)μ΄λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€.

--release ν”Œλž˜κ·Έλ₯Ό 톡해 릴리즈 λͺ¨λ“œλ‘œ μ»΄νŒŒμΌν•  λ•Œ, RustλŠ” νŒ¨λ‹‰μ„ μΌμœΌν‚¬ 수 μžˆλŠ” μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš° 검사λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€. λŒ€μ‹  μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•˜λ©΄, RustλŠ” 2의 보수 λž˜ν•‘μ„ μ‹€ν–‰ν•œλ‹€. κ°„λ‹¨νžˆ λ§ν•΄μ„œ, νƒ€μž…μ΄ μ €μž₯ν•  수 μžˆλŠ” μ΅œλŒ€κ°’μ„ μ΄ˆκ³Όν•˜λŠ” 값은 β€œμˆœν™˜β€ν•˜μ—¬ νƒ€μž…μ΄ μ €μž₯ν•  수 μžˆλŠ” μ΅œμ†Œκ°’μ΄ λœλ‹€. u8의 경우, $256$은 $0$이 되고, $257$은 $1$이 λ˜λŠ” 방식이닀. 이 경우 ν”„λ‘œκ·Έλž¨μ€ νŒ¨λ‹‰ μƒνƒœμ— 빠지지 μ•Šμ§€λ§Œ, λ³€μˆ˜λŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 값을 κ°€μ§€κ²Œ 될 것이닀. 즉, μ •μˆ˜ μ˜€λ²„ν”Œλ‘œμš°μ˜ λž˜ν•‘ λ™μž‘μ— μ˜μ‘΄ν•˜λŠ” 것은 μ—λŸ¬λ‘œ κ°„μ£Όλœλ‹€.

μ˜€λ²„ν”Œλ‘œμš°μ˜ κ°€λŠ₯성을 λͺ…ν™•νžˆ μ²˜λ¦¬ν•˜κ³ μž ν•  λ•ŒλŠ”, μ›μ‹œ 숫자 νƒ€μž…λ“€μ— λŒ€ν•΄ ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ œκ³΅ν•˜λŠ” λͺ‡ 가지 λ©”μ„œλ“œ 집합을 μ‚¬μš©ν•  수 μžˆλ‹€:

  • λͺ¨λ“  λͺ¨λ“œμ—μ„œμ˜ λž˜ν•‘μ„ μ²˜λ¦¬ν•˜λŠ” wrapping_* λ©”μ„œλ“œ (μ˜ˆμ‹œ: wrapping_add)
  • μ˜€λ²„ν”Œλ‘œμš°κ°€ μžˆμ„ 경우 None 값을 λ°˜ν™˜ν•˜λŠ” checked_* λ©”μ„œλ“œ
  • μ˜€λ²„ν”Œλ‘œμš° μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆˆλ¦¬μ–Έκ³Ό ν•¨κ»˜ 값을 λ°˜ν™˜ν•˜λŠ” overflowing_* λ©”μ„œλ“œ
  • 값이 μ΅œμ†Œ λ˜λŠ” μ΅œλŒ€ 값에 λ„λ‹¬ν–ˆμ„ λ•Œ 값을 κ³ μ •ν•˜λŠ” saturating_* λ©”μ„œλ“œ

뢀동 μ†Œμˆ˜μ  νƒ€μž…

RustλŠ” μ†Œμˆ˜μ μ„ ν¬ν•¨ν•œ 숫자, 즉 뢀동 μ†Œμˆ˜μ  숫자λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 두 가지 κΈ°λ³Έ νƒ€μž…μ„ μ œκ³΅ν•œλ‹€. Rust의 뢀동 μ†Œμˆ˜μ  νƒ€μž…μ—λŠ” f32와 f64κ°€ 있으며, μ΄λŠ” 각각 32λΉ„νŠΈμ™€ 64λΉ„νŠΈμ˜ 크기λ₯Ό 가진닀. Rustμ—λŠ” f64κ°€ κΈ°λ³Έ νƒ€μž…μœΌλ‘œ μ§€μ •λ˜μ–΄ μžˆλŠ”λ°, μ΄λŠ” ν˜„λŒ€μ˜ CPUκ°€ f32와 λΉ„μŠ·ν•œ μ†λ„λ‘œ 더 μ •λ°€ν•œ 계산을 ν•  수 있기 λ•Œλ¬Έμ΄λ‹€. λͺ¨λ“  뢀동 μ†Œμˆ˜μ  νƒ€μž…μ€ λΆ€ν˜Έλ₯Ό 가진닀.

λ‹€μŒμ€ 뢀동 μ†Œμˆ˜μ  숫자λ₯Ό μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œμ΄λ‹€.

1
2
3
4
5
fn main() {
    let x = 2.0; // f64

    let y: f32 = 3.0; // f32
}

뢀동 μ†Œμˆ˜μ  μˆ«μžλŠ” IEEE-754 ν‘œμ€€μ„ λ”°λ₯Έλ‹€. f32 νƒ€μž…μ€ 단정밀도(float)λ₯Ό μ˜λ―Έν•˜λ©°, f64 νƒ€μž…μ€ 배정밀도(double)λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

숫자 μ—°μ‚°

RustλŠ” λ‹€μ–‘ν•œ 숫자 νƒ€μž…μ— λŒ€ν•΄ 기본적인 숫자 연산을 μ§€μ›ν•œλ‹€. μ—°μ‚°μ—λŠ” λ§μ…ˆ, λΊ„μ…ˆ, κ³±μ…ˆ, λ‚˜λˆ—μ…ˆ, 그리고 λ‚˜λ¨Έμ§€ 연산이 ν¬ν•¨λœλ‹€. μ •μˆ˜ λ‚˜λˆ—μ…ˆ 연산은, κ²°κ³Όκ°€ 0에 κ°€κΉŒμš΄ μͺ½μœΌλ‘œ λ‚΄λ¦Όλœ μ •μˆ˜ 값이 λœλ‹€. λ‹€μŒ μ˜ˆμ‹œλŠ” let ꡬ문을 μ΄μš©ν•˜μ—¬ 각 숫자 연산을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ 보여쀀닀.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fn main() {
    // λ§μ…ˆ
    let sum = 5 + 10;

    // λΊ„μ…ˆ
    let difference = 95.5 - 4.3;

    // κ³±μ…ˆ
    let product = 4 * 30;

    // λ‚˜λˆ—μ…ˆ
    let quotient = 56.7 / 32.2;
    let truncated = -5 / 3; // κ²°κ³ΌλŠ” -1

    // λ‚˜λ¨Έμ§€
    let remainder = 43 % 5;
}

μœ„ μ½”λ“œμ—μ„œ, 각각의 ν‘œν˜„μ‹μ€ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 단일 κ°’μœΌλ‘œ ν‰κ°€λ˜κ³ , μ—°μ‚°μ˜ κ²°κ³Ό 값을 λ³€μˆ˜μ— λ°”μΈλ”©ν•œλ‹€.


λΆˆλ¦¬μ–Έ νƒ€μž…

Rustμ—μ„œ λΆˆλ¦¬μ–Έ νƒ€μž…μ€ true와 false 두 κ°’λ§Œμ„ 가진닀. λΆˆλ¦¬μ–Έμ˜ ν¬κΈ°λŠ” ν•œ λ°”μ΄νŠΈμ΄λ‹€. Rustμ—μ„œλŠ” boolμ΄λΌλŠ” ν‚€μ›Œλ“œλ‘œ λΆˆλ¦¬μ–Έ νƒ€μž…μ„ ν‘œν˜„ν•œλ‹€. 예λ₯Ό λ“€λ©΄:

1
2
3
4
5
fn main() {
    let t = true;

    let f: bool = false; // λͺ…μ‹œμ  νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜κ³Ό ν•¨κ»˜
}

λΆˆλ¦¬μ–Έ 값은 주둜 μ‘°κ±΄λ¬Έμ—μ„œ μ‚¬μš©λœλ‹€. 특히 if 쑰건문 λ“±μ—μ„œ 자주 λ³Ό 수 μžˆλ‹€.


문자 νƒ€μž…

Rust의 char νƒ€μž…μ€ λ‹€μ–‘ν•œ 문자λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€. μ•„λž˜μ— char νƒ€μž…μ˜ μ‚¬μš© μ˜ˆκ°€ μžˆλ‹€.

1
2
3
4
5
fn main() {
    let c = 'z';
    let z: char = 'β„€'; // λͺ…μ‹œμ  νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜κ³Ό ν•¨κ»˜
    let heart_eyed_cat = '😻';
}

Rustμ—μ„œμ˜ charλŠ” 4λ°”μ΄νŠΈ 크기이고, μœ λ‹ˆμ½”λ“œ 슀칼라 값을 ν‘œν˜„ν•œλ‹€. μ΄λŠ” ASCII λ¬Έμžλ§Œμ„ ν‘œν˜„ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μ•…μ„ΌνŠΈ 문자, ν•œκ΅­μ–΄, 쀑ꡭ어, 일본어 문자, 이λͺ¨ν‹°μ½˜ 등도 포함할 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄, πŸ˜»λ‚˜ ℀도 λͺ¨λ‘ μœ νš¨ν•œ char 값이닀. ν•˜μ§€λ§Œ, μœ λ‹ˆμ½”λ“œμ˜ β€œλ¬Έμžβ€ κ°œλ…μ€ μ‚¬λžŒμ΄ μƒκ°ν•˜λŠ” 일반적인 β€œλ¬Έμžβ€ κ°œλ…κ³Ό λ‹€λ₯Ό 수 μžˆλ‹€. Rust의 charκ°€ 항상 우리의 직관적 이해와 μΌμΉ˜ν•œλ‹€κ³  보μž₯ν•  μˆ˜λŠ” μ—†λ‹€.


볡합 νƒ€μž…

볡합 νƒ€μž…μ€ λ‹€μˆ˜μ˜ 값듀을 ν•˜λ‚˜μ˜ νƒ€μž… μ•ˆμ— λ¬ΆλŠ” 것을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. Rustμ—μ„œλŠ” νŠœν”Œκ³Ό λ°°μ—΄μ΄λΌλŠ” 두 μ’…λ₯˜μ˜ 볡합 νƒ€μž…μ„ μ œκ³΅ν•œλ‹€.


νŠœν”Œ νƒ€μž…

νŠœν”Œμ€ μ„œλ‘œ λ‹€λ₯Έ νƒ€μž…μ„ 가진 μ—¬λŸ¬ κ°’λ“€λ‘œ κ΅¬μ„±λœ 볡합 νƒ€μž…μ΄λ‹€. νŠœν”Œμ€ κ³ μ •λœ 길이λ₯Ό 가지며, ν•œ 번 μ„ μ–Έλ˜λ©΄ 크기λ₯Ό λŠ˜λ¦¬κ±°λ‚˜ 쀄일 수 μ—†λ‹€.

νŠœν”Œμ€ κ΄„ν˜Έ μ•ˆμ— 콀마둜 κ΅¬λΆ„λœ 값을 λ‚˜μ—΄ν•˜μ—¬ λ§Œλ“ λ‹€. νŠœν”Œμ˜ 각 μš”μ†ŒλŠ” κ³ μœ ν•œ νƒ€μž…μ„ 가지며, 각 μš”μ†ŒλΌλ¦¬ κΌ­ νƒ€μž…μ΄ 같을 ν•„μš”λŠ” μ—†λ‹€. μ•„λž˜ μ½”λ“œμ—μ„œλŠ” μ„€λͺ…을 μœ„ν•΄ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ„ μΆ”κ°€ν•˜μ˜€λ‹€:

1
2
3
fn main() {
    let tup: (i32, f64, u8) = (500, 6.4, 1);
}

λ³€μˆ˜ tup은 전체 νŠœν”Œμ— λ°”μΈλ”©λœλ‹€. νŠœν”Œμ΄ ν•˜λ‚˜μ˜ 볡합 μš”μ†Œλ‘œ κ°„μ£Όλ˜κΈ° λ•Œλ¬Έμ΄λ‹€. νŠœν”Œ λ‚΄μ˜ κ°œλ³„ 값에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ”, λ‹€μŒ μ½”λ“œμ™€ 같이 let을 톡해 νŠœν”Œμ„ ꡬ쑰 λΆ„ν•΄ν•  수 μžˆλ‹€:

1
2
3
4
5
6
7
fn main() {
    let tup = (500, 6.4, 1);

    let (x, y, z) = tup;

    println!("The value of y is: {}", y);
}

이 μ½”λ“œλŠ” λ¨Όμ € νŠœν”Œμ„ μƒμ„±ν•˜κ³  tupμ΄λΌλŠ” λ³€μˆ˜μ— λ°”μΈλ”©ν•œλ‹€. 이후 let을 μ‚¬μš©ν•œ νŒ¨ν„΄μœΌλ‘œ tup을 μ„Έ 개의 λ³€μˆ˜ x, y, z둜 λΆ„ν•΄ν•œλ‹€. 이 과정을 ꡬ쑰 뢄해라 λΆ€λ₯΄λ©°, 단일 νŠœν”Œμ„ μ„Έ λΆ€λΆ„μœΌλ‘œ λ‚˜λˆˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, ν”„λ‘œκ·Έλž¨μ€ y의 값을 좜λ ₯ν•˜λ©°, 이 값은 6.4이닀.

νŠœν”Œμ˜ μš”μ†Œμ— 직접 μ ‘κ·Όν•˜λ €λ©΄ 점(.) λ‹€μŒμ— 인덱슀 번호λ₯Ό μ‚¬μš©ν•œλ‹€. 예λ₯Ό λ“€μ–΄:

1
2
3
4
5
6
7
8
9
fn main() {
    let x: (i32, f64, u8) = (500, 6.4, 1);

    let five_hundred = x.0;

    let six_point_four = x.1;

    let one = x.2;
}

μœ„ μ½”λ“œλŠ” xλΌλŠ” νŠœν”Œμ„ μƒμ„±ν•˜κ³  νŠœν”Œμ˜ 각 μš”μ†Œμ— ν•΄λ‹Ήν•˜λŠ” 인덱슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ ‘κ·Όν•œλ‹€. μ—¬κΈ°μ„œ νŠœν”Œμ˜ 첫 번째 μš”μ†ŒλŠ” 인덱슀 0을 가진닀.

그리고 νŠΉλ³„ν•œ 경우둜, 값이 μ—†λŠ” νŠœν”Œλ„ μžˆλŠ”λ°, 이λ₯Ό μœ λ‹›(unit)이라고 ν•œλ‹€. μœ λ‹› κ°’κ³Ό μœ λ‹› νƒ€μž…μ€ ()둜 ν‘œν˜„λ˜λ©°, μ΄λŠ” 값을 가지지 μ•ŠλŠ”λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. μ–΄λ–€ ν‘œν˜„μ‹μ΄ 값을 λ°˜ν™˜ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” μœ λ‹› 값이 μ•”μ‹œμ μœΌλ‘œ μ‚¬μš©λœλ‹€.


λ°°μ—΄ νƒ€μž…

μ—¬λŸ¬ 값을 κ·Έλ£Ήν™”ν•˜λŠ” 또 λ‹€λ₯Έ 방법은 배열을 μ‚¬μš©ν•˜λŠ” 것이닀. 배열은 λͺ¨λ“  μš”μ†Œκ°€ λ™μΌν•œ νƒ€μž…μ„ κ°€μ Έμ•Ό ν•œλ‹€λŠ” μ μ—μ„œ νŠœν”Œκ³Ό 차이가 있으며, Rust의 배열은 κ³ μ •λœ 크기λ₯Ό 가지고 μžˆλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

배열은 λŒ€κ΄„ν˜Έ μ•ˆμ— 값듀을 μ‰Όν‘œλ‘œ ꡬ뢄지어 μž‘μ„±ν•  수 μžˆλ‹€:

1
2
3
fn main() {
    let a = [1, 2, 3, 4, 5];
}

배열은 μŠ€νƒμ— 데이터λ₯Ό ν• λ‹Ήν•˜κ³ μž ν•  λ•Œλ‚˜ κ³ μ •λœ 수의 μš”μ†Œλ₯Ό 가지고 μžˆμ–΄μ•Ό ν•  λ•Œ μœ μš©ν•˜λ‹€. ν•˜μ§€λ§Œ, 배열은 크기가 가변적인 벑터 νƒ€μž…μ²˜λŸΌ μœ μ—°ν•˜μ§€ μ•Šλ‹€. λ°°μ—΄κ³Ό 벑터 쀑 무엇을 선택해야 ν•  지 확신이 듀지 μ•ŠλŠ”λ‹€λ©΄, 벑터λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

반면 μš”μ†Œμ˜ κ°œμˆ˜κ°€ λ³€ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” μƒν™©μ—μ„œλŠ” 배열이 더 μ ν•©ν•˜λ‹€. 예λ₯Ό λ“€μ–΄, ν”„λ‘œκ·Έλž¨μ—μ„œ μš”μΌμ˜ 이름을 닀룬닀면, 항상 7개의 μš”μ†Œλ§Œμ„ μœ μ§€ν•˜κΈ° λ•Œλ¬Έμ— λ²‘ν„°λ³΄λ‹€λŠ” 배열을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

1
let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

λ°°μ—΄μ˜ νƒ€μž…μ€ μš”μ†Œμ˜ νƒ€μž…κ³Ό λ°°μ—΄μ˜ 길이λ₯Ό λŒ€κ΄„ν˜Έ μ•ˆμ— μ„Έλ―Έμ½œλ‘ κ³Ό ν•¨κ»˜ λͺ…μ‹œν•¨μœΌλ‘œμ¨ ν‘œν˜„ν•  수 μžˆλ‹€:

1
let a: [i32; 5] = [1, 2, 3, 4, 5];

μ—¬κΈ°μ„œ i32λŠ” 각 μš”μ†Œμ˜ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄κ³ , μ„Έλ―Έμ½œλ‘  λ‹€μŒμ˜ 5λŠ” 배열이 5개의 μš”μ†Œλ₯Ό ν¬ν•¨ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

λ˜ν•œ, λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œκ°€ λ™μΌν•œ 값을 가지길 μ›ν•œλ‹€λ©΄ μ΄ˆκΈ°κ°’ ν•˜λ‚˜μ™€ λ°°μ—΄μ˜ 길이λ₯Ό μ„Έλ―Έμ½œλ‘ μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ λŒ€κ΄„ν˜Έ μ•ˆμ— μž‘μ„±ν•˜λ©΄ λœλ‹€:

1
let a = [3; 5];

이 경우 aλΌλŠ” μ΄λ¦„μ˜ 배열은 μ΄ˆκΈ°μ— 3μ΄λΌλŠ” κ°’μœΌλ‘œ μ„€μ •λœ 5개의 μš”μ†Œλ₯Ό ν¬ν•¨ν•˜κ²Œ λœλ‹€. 이 방식은 let a = [3, 3, 3, 3, 3];을 μž‘μ„±ν•˜λŠ” 것과 λ™μΌν•œ κ²°κ³Όλ₯Ό λ‚˜νƒ€λ‚΄μ§€λ§Œ, 더 κ°„κ²°ν•œ ν‘œν˜„ 방법이닀.


λ°°μ—΄ μš”μ†Œμ— μ ‘κ·Όν•˜κΈ°

배열은 미리 정해진 크기의 λ©”λͺ¨λ¦¬ 블둝을 μŠ€νƒμ— ν• λ‹Ήν•œλ‹€. μš°λ¦¬λŠ” 인덱싱을 μ‚¬μš©ν•˜μ—¬ λ°°μ—΄ λ‚΄μ˜ νŠΉμ • μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€. μ•„λž˜ μ½”λ“œλ₯Ό 보자:

1
2
3
4
5
6
fn main() {
    let a = [1, 2, 3, 4, 5];

    let first = a[0];
    let second = a[1];
}

μœ„ μ½”λ“œμ—μ„œ firstλŠ” λ°°μ—΄ a의 첫 번째 μš”μ†ŒμΈ 1을, secondλŠ” 두 번째 μš”μ†ŒμΈ 2λ₯Ό μ°Έμ‘°ν•œλ‹€.


잘λͺ»λœ λ°°μ—΄ μš”μ†Œ μ ‘κ·Ό

λ°°μ—΄ λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ 인덱슀둜 배열에 μ ‘κ·Όν•˜λ €κ³  ν•˜λ©΄ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€. β€œμœ μ €μ—κ²Œ λ°°μ—΄μ˜ 인덱슀λ₯Ό μž…λ ₯λ°›μ•„ ν•΄λ‹Ή μš”μ†Œμ— μ ‘κ·Όν•˜λŠ”β€ μ•„λž˜ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž:

μ•„λž˜ μ½”λ“œλŠ” νŒ¨λ‹‰μ„ μœ λ°œν•  수 μžˆλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use std::io;

fn main() {
    let a = [1, 2, 3, 4, 5];

    println!("λ°°μ—΄μ˜ 인덱슀λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.");

    let mut index = String::new();

    io::stdin()
        .read_line(&mut index)
        .expect("쀄을 μ½λŠ” 데 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.");

    let index: usize = index
        .trim()
        .parse()
        .expect("μž…λ ₯ν•œ μΈλ±μŠ€κ°€ μˆ«μžκ°€ μ•„λ‹™λ‹ˆλ‹€.");

    let element = a[index];

    println!("인덱슀 {index}에 μžˆλŠ” μš”μ†Œμ˜ 값은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€: {element}");
}

μœ„ μ½”λ“œλŠ” μ„±κ³΅μ μœΌλ‘œ μ»΄νŒŒμΌλœλ‹€. cargo run으둜 μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ³ , 0, 1, 2, 3, λ˜λŠ” 4λ₯Ό μž…λ ₯ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ€ λ°°μ—΄μ—μ„œ ν•΄λ‹Ή 인덱슀의 값을 좜λ ₯ν•œλ‹€. κ·ΈλŸ¬λ‚˜ λ§Œμ•½ λ°°μ—΄μ˜ λ²”μœ„λ₯Ό λ„˜μ–΄μ„œλŠ” 숫자인 10κ³Ό 같은 수λ₯Ό μž…λ ₯ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같은 λ©”μ‹œμ§€λ₯Ό 보게 될 것이닀:

1
2
thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19
note: run with 'RUST_BACKTRACE=1' environment variable to display a backtrace

이 λ©”μ‹œμ§€λŠ” 인덱싱 μž‘μ—… 쀑 잘λͺ»λœ κ°’ μ‚¬μš©μœΌλ‘œ λ°œμƒν•œ λŸ°νƒ€μž„ μ—λŸ¬λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. ν”„λ‘œκ·Έλž¨μ€ μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜κ³  μ’…λ£Œλœλ‹€. μ—¬κΈ°μ„œ λ§ˆμ§€λ§‰ println! λͺ…령은 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€. μš”μ†Œμ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ 인덱싱을 μ‹œλ„ν•  λ•Œ RustλŠ” μ§€μ •ν•œ μΈλ±μŠ€κ°€ λ°°μ—΄μ˜ 길이보닀 μž‘μ€μ§€ ν™•μΈν•œλ‹€. λ§Œμ•½ μΈλ±μŠ€κ°€ 길이와 κ°™κ±°λ‚˜ 큰 경우, RustλŠ” νŒ¨λ‹‰ν•œλ‹€. 이 κ²€μ‚¬λŠ” λŸ°νƒ€μž„ μ‹œκ°„μ— μˆ˜ν–‰λ˜μ–΄μ•Ό ν•œλ‹€. μ™œλƒν•˜λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” μœ μ €κ°€ μ–΄λ–€ 값을 μž…λ ₯할지 μ˜ˆμΈ‘ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

이 상황은 Rust의 λ©”λͺ¨λ¦¬ μ•ˆμ „μ„± 원칙을 λ³΄μ—¬μ£ΌλŠ” 사둀이닀. λ‹€μˆ˜μ˜ μ €μˆ˜μ€€ μ–Έμ–΄μ—μ„œλŠ” μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ 검사가 μˆ˜ν–‰λ˜μ§€ μ•Šμ•„, μœ μ €κ°€ λΆ€μ μ ˆν•œ 인덱슀λ₯Ό μ œκ³΅ν•  경우 잘λͺ»λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ ‘κ·Όν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€. RustλŠ” μ΄λŸ¬ν•œ μ—λŸ¬λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 잘λͺ»λœ λ©”λͺ¨λ¦¬ 접근을 ν—ˆμš©ν•˜λŠ” 상황 λŒ€μ‹ μ—, ν”„λ‘œκ·Έλž¨μ„ μ¦‰κ°μ μœΌλ‘œ μ’…λ£Œν•¨μœΌλ‘œμ¨ μœ μ €λ₯Ό λ³΄ν˜Έν•œλ‹€.


좜처: rust-lang book

이 ν¬μŠ€νŠΈλŠ” μ €μž‘κΆŒμžμ˜ CC BY-NC-ND 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.
졜근 μ—…λ°μ΄νŠΈ
λ°”λ‘œκ°€κΈ°

[Rust] λ³€μˆ˜μ™€ κ°€λ³€μ„±

[Rust] ν•¨μˆ˜