Option, Iterator, Clone, Copy

๋Ÿฌ์ŠคํŠธ์—์„œ ๊ฐ’์˜ ์œ ๋ฌด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” Option ํƒ€์ž…์€ ๋งค์šฐ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค. ์ด ํƒ€์ž…์€ None๊ณผ Some(T)๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ถ„๊ธฐ๋กœ ๊ตฌ์„ฑ๋œ ์—ด๊ฑฐํ˜•์ด๋ฉฐ, ๊ฐ’์ด ์—†์„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋กœ ์‹ค์ œ ๊ฐ’์ด ์—†์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด Option์„ ๋ฐ˜ํ™˜ํ•ด ์˜๋„์ ์œผ๋กœ None์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. None์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ ๋„ํ•œ๋‹ค.

Option ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” match ๊ตฌ๋ฌธ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. Rust์˜ ํŒจํ„ด ๋งค์นญ์€ ๋งค์šฐ ๊ฐ•๋ ฅํ•˜๋ฉฐ, ๊ฐ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ’์ด ์žˆ์„ ๋•Œ(Some)์™€ ์—†์„ ๋•Œ(None)์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์ฝ”๋“œ ์ƒ์—์„œ ๋ชจ๋‘ ๋“œ๋Ÿฌ๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์•ˆ์ „์„ฑ์ด ํ–ฅ์ƒ๋œ๋‹ค. ๋˜ํ•œ Option์—๋Š” ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ข… ํ—ฌํผ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์ด ์ œ๊ณต๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด unwrap_or, map, and_then ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด match๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ„๋‹จํ•œ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ˆ์ „์„ฑ์„ ์ค‘์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” match ๊ตฌ๋ฌธ ํ˜น์€ ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋Š” Option์„ ํ™œ์šฉํ•˜๋Š” ์˜ˆ์‹œ์ด๋ฉฐ, None์ธ ๊ฒฝ์šฐ์™€ Some์ธ ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค.

fn find_even_number(numbers: &[i32]) -> Option<i32> {
    for &num in numbers {
        if num % 2 == 0 {
            return Some(num);
        }
    }
    None
}

fn main() {
    let list = vec![1, 3, 5, 8, 10];
    let result = find_even_number(&list);

    match result {
        Some(val) => println!("์ง์ˆ˜๋ฅผ ์ฐพ์•˜๋‹ค: {}", val),
        None => println!("์ง์ˆ˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜์˜€๋‹ค"),
    }

    let default_number = result.unwrap_or(-1);
    println!("๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด -1์„ ์‚ฌ์šฉํ•œ๋‹ค: {}", default_number);
}

Iterator๋Š” ์ปฌ๋ ‰์…˜์ด๋‚˜ ๊ทธ ์™ธ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์—์„œ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด๋‹ค. ๋Ÿฌ์ŠคํŠธ์˜ Iterator ํŠธ๋ ˆ์ดํŠธ๋Š” next ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต ์‹œ๋งˆ๋‹ค ๋‹ค์Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. next๊ฐ€ None์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฐ˜๋ณต์ด ์ข…๋ฃŒ๋œ๋‹ค. ๋ฐ˜๋ณต์ž๋Š” ์†Œ์œ ๊ถŒ, ์ฐธ์กฐ, ๊ฐ€๋ณ€ ์ฐธ์กฐ ๋“ฑ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์ด ๋•Œ ์†Œ๋ชจ์„ฑ(consume) ๋ฉ”์„œ๋“œ์™€ ๋ฐ˜์†Œ๋ชจ์„ฑ(adapt) ๋ฉ”์„œ๋“œ๋ฅผ ์ ์ ˆํžˆ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด ์œ ์šฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด collect, fold, find ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ์†Œ๋ชจํ•˜๋ฉด์„œ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ , map, filter, take์™€ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉฐ ๊ณ„์† ์ฒด์ด๋‹ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ดํ„ฐ๋ ˆ์ดํ„ฐ๋Š” for ๋ฃจํ”„์—์„œ๋„ ์ž์ฃผ ํ™œ์šฉ๋œ๋‹ค. for ๋ฃจํ”„๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Iterator ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ˆœํšŒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ rust์—์„œ for ... in ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ๊ฒฐ๊ตญ Iterator๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์•„๋ž˜๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ฒด์ด๋‹ํ•˜์—ฌ ํ•„ํ„ฐ๋ง๊ณผ ๋งตํ•‘์„ ๊ฑฐ์นœ ๋’ค ์ตœ์ข…์ ์œผ๋กœ ๋ฒกํ„ฐ๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ์˜ˆ์‹œ๋‹ค.

Clone์€ ์ผ๋ฐ˜์ ์œผ๋กœ โ€œ๋ณต์ œโ€๊ฐ€ ํ•„์š”ํ•œ ํƒ€์ž…์— ๊ตฌํ˜„๋˜๋Š” ํŠธ๋ ˆ์ดํŠธ๋‹ค. Clone ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด .clone() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust์—์„œ ๊นŠ์€ ๋ณต์‚ฌ(deep copy)๊ฐ€ ์ผ์–ด๋‚  ๋•Œ ๋“œ๋Š” ๋น„์šฉ์— ๋Œ€ํ•ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ธ์ง€ํ•˜๊ฒŒ ํ•˜๋ ค๋Š” ์˜๋„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Clone์„ ํ˜ธ์ถœํ•ด์•ผ๋งŒ ๊ฐ์ฒด๊ฐ€ ๋ณต์ œ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒกํ„ฐ, ๋ฌธ์ž์—ด(String), ์‚ฌ์šฉ์ž ์ •์˜ ๊ตฌ์กฐ์ฒด ๋“ฑ์€ Clone์„ ํ†ตํ•ด ๋ณต์‚ฌํ•  ๋•Œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ๋ณต์ œํ•ด์•ผ ํ•œ๋‹ค.

Clone ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํƒ€์ž…์€ ๋ณ„๋„์˜ ๋กœ์ง์œผ๋กœ ๋ณต์ œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ๊ตฌ์กฐ์ฒด ๋‚ด์— ๋ณต์ œ ๋น„์šฉ์ด ํฐ ํ•„๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด, Clone ๊ตฌํ˜„์—์„œ ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ณต์ œํ• ์ง€ ์„ธ๋ถ€์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ Clone ํŒŒ์ƒ(derive)๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ๊ฐ์ฒด๋ผ๋ฉด ์ˆ˜๋™ ๊ตฌํ˜„์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Copy๋Š” Clone๊ณผ ๋‹ค๋ฅด๊ฒŒ โ€œ๊นŠ์€ ๋ณต์‚ฌโ€๊ฐ€ ์•„๋‹Œ โ€œ๋น„ํŠธ ๋‹จ์œ„ ๋ณต์‚ฌโ€๋ฅผ ์˜๋ฏธํ•˜๋Š” ํŠธ๋ ˆ์ดํŠธ์ด์ž ๋งˆ์ปค ํŠธ๋ ˆ์ดํŠธ๋‹ค. Copy๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์€ ๋Ÿฐํƒ€์ž„ ๋ณต์‚ฌ ๋น„์šฉ์ด ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์ž‘์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„ ์Šคํƒ์— ์ง์ ‘ ๋ฐฐ์น˜๋˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. i32, f64 ๊ฐ™์€ ๊ธฐ๋ณธ ์ •์ˆ˜, ๋ถ€๋™์†Œ์ˆ˜์ , ๋ถˆ๋ฆฌ์–ธ ๋“ฑ์ด ๋Œ€ํ‘œ์ ์œผ๋กœ Copy ํƒ€์ž…์ด๋‹ค. Copy ํŠธ๋ ˆ์ดํŠธ๊ฐ€ ์ ์šฉ๋œ ํƒ€์ž…์€ ๋ณ€์ˆ˜ ์ด๋™์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๋ณต์‚ฌ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ผ์–ด๋‚œ๋‹ค. ์ฆ‰, Copy๊ฐ€ ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์˜ ๊ฐ’์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•ด๋„ ์›๋ณธ ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจ์„ฑ์„ ์ƒ์‹คํ•˜์ง€ ์•Š๋Š”๋‹ค.

Copy๋Š” Clone์„ ์ƒ์†ํ•˜๋Š” ๊ตฌ์กฐ์ด๋ฏ€๋กœ Copy ํŠธ๋ ˆ์ดํŠธ๊ฐ€ ์ ์šฉ๋œ ํƒ€์ž…์€ ์ž๋™์œผ๋กœ Clone๋„ ๊ตฌํ˜„ํ•˜์ง€๋งŒ, Copy ํŠธ๋ ˆ์ดํŠธ๊ฐ€ ์ ์šฉ๋˜๋Š” ์ˆœ๊ฐ„ .clone() ๋ฉ”์„œ๋“œ๋Š” ๊ตณ์ด ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค. Copy ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด ํƒ€์ž… ๋‚ด๋ถ€์— ์ฐธ์กฐ ํƒ€์ž…์ด๋‚˜ ์†Œ์œ ๊ถŒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ ๋“ฑ์ด ์—†์–ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Vec์ด๋‚˜ String์ฒ˜๋Ÿผ ํž™์„ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž…์€ Copy๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  Clone๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. Copy์™€ Clone์˜ ์ฐจ์ด๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋ฉด Rust์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์„ ๋”์šฑ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” i32๋Š” Copy ํƒ€์ž…์ด๋ฏ€๋กœ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋˜์–ด a, b ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ์œ ํšจํ•˜๋‹ค. Vec๋Š” Copy๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ํƒ€์ž…์ด๋ฏ€๋กœ ์ด๋™์ด ๋ฐœ์ƒํ•˜๋ฉฐ, ์ด๋™ ํ›„ ์›๋ณธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

Option, Iterator, Clone, Copy๋Š” ๋ชจ๋‘ Rust์˜ ์•ˆ์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ๊ด€๋ จ๋œ ์ค‘์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋“ค์ด๋‹ค. Option์œผ๋กœ ๊ฐ’์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ณ , Iterator๋กœ ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ, Clone๊ณผ Copy๋ฅผ ํ†ตํ•ด ๋ณต์ œ ์ •์ฑ…์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•จ์œผ๋กœ์จ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํŠธ๋ ˆ์ดํŠธ์˜ ์„ค๊ณ„๋Š” Rust๋ฅผ ์•ˆ์ „ํ•˜๋ฉด์„œ๋„ ๋น ๋ฅธ ์–ธ์–ด๋กœ ๋งŒ๋“œ๋Š” ํฐ ๊ธฐ๋ฐ˜์ด ๋œ๋‹ค.

Last updated