๊ด€๋ฆฌ ๋ฉ”๋‰ด

IT’s Portfolio

[Rust] Start Rust (Day 10) - Using Structs to Structure Related Data ๋ณธ๋ฌธ

Development Study/Rust

[Rust] Start Rust (Day 10) - Using Structs to Structure Related Data

f1r3_r41n 2023. 2. 1. 14:11
728x90
๋ฐ˜์‘ํ˜•

๐Ÿฆ€ Rust Day 10

๐Ÿณ๏ธ Using Structs to Structure Related Data

  • ๊ตฌ์กฐ์ฒด(struct ๋˜๋Š” structure)๋Š” ์„œ๋กœ ๊ด€๋ จ์ด ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ’์„ ์˜๋ฏธ ์žˆ๋Š” ํ•˜๋‚˜๋กœ ๋ชจ์œผ๊ณ , ์ด๋ฆ„์„ ์ง€์ •ํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…
  • ๊ตฌ์กฐ์ฒด๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ '๊ฐ์ฒด์˜ ๋ฐ์ดํ„ฐ ์†์„ฑ' ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ฌด๋ฐฉ

1๏ธโƒฃ ๊ตฌ์กฐ์ฒด ์ •์˜์™€ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

  • ํŠœํ”Œ๊ณผ ์œ ์‚ฌํ•จ
  • ๊ฐ ๋ฐ์ดํ„ฐ์— ๋ณ„๊ฐœ์˜ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด์„œ ๊ฐ’์˜ ์˜๋ฏธ๋ฅผ ๋ถ„๋ช…ํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฐ ๋ฐ์ดํ„ฐ์— ์ด๋ฆ„์ด ์žˆ์œผ๋ฏ€๋กœ ํŠœํ”Œ๋ณด๋‹ค ์œ ์—ฐํ•จ
    • ์ฐธ์กฐํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ์ฝ์„ ๋•Œ ๋ฐ์ดํ„ฐ์˜ ์ˆœ์„œ์— ์˜์กดํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ
  • ๐Ÿ˜Ž ๊ตฌ์กฐ์ฒด ์ •์˜
struct User {
    username: String,
    pw: String,
    email: String,
    sign_in_count: u32,
    active: bool,
}
  • struct keyword ๋‹ค์Œ์— ๊ตฌ์กฐ์ฒด์— ๋ถ€์—ฌํ•  ์ด๋ฆ„ ์ง€์ •
    • ์ด๋ฆ„์€ ๊ทธ๋ฃนํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ
  • ์ค‘๊ด„ํ˜ธ ๋‚ด์— ๊ตฌ์กฐ์ฒด๊ฐ€ ์ €์žฅํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ์ด๋ฆ„ ๋‚˜์—ด
    • ๋ฐ์ดํ„ฐ๋“ค์€ ํ•„๋“œ(field) ๋ผ ์นญํ•จ
  • ๐Ÿ˜Ž ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
let user1 = User {
        username: String::from("f1r3_r41n"),
        pw: String::from("a12345"),
        email: String::from("qkrghkql1@gmail.com"),
        sign_in_count: 3,
        active: true,
    };
  • ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„๊ณผ ์ค‘๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด 'key: value' ์˜ ์Œ์„ ๋‚˜์—ด
    • key : ํ•„๋“œ์˜ ์ด๋ฆ„
    • value : ํ•ด๋‹น ํ•„๋“œ์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ
  • ํ•„๋“œ์˜ ๋‚˜์—ด ์ˆœ์„œ๋Š” ๊ตฌ์กฐ์ฒด์— ์ •์˜ํ•œ ์ˆœ์„œ์™€ ๋ฐ˜๋“œ์‹œ ๊ฐ™์„ ํ•„์š”๋Š” ์—†์Œ
  • ๊ตฌ์กฐ์ฒด์˜ ์ •์˜๋Š” ํƒ€์ž…์˜ ํ…œํ”Œ๋ฆฟ
  • ์ธ์Šคํ„ด์Šค๋Š” ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ’์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ…œํ”Œ๋ฆฟ์— ๊ฐ’์„ ์ฑ„์šด ๊ฒƒ
  • ๐Ÿ˜Ž ์ธ์Šคํ„ด์Šค ํ™œ์šฉ
#[derive(Debug)]
struct User {
    username: String,
    pw: String,
    email: String,
    sign_in_count: u32,
    active: bool,
}

fn main() {
    let id = String::from("f1r3_r41n");
    let pw = String::from("a12345");
    let email = String::from("qkrghkql1@gmail.com");

    let user1 = build_user(id, pw, email);

    println!("{}", user1.username);
    println!("{:?}", user1);
}

fn build_user(username: String, pw: String, email: String) -> User {
    User{
        username: username,
        pw: pw,
        email: email,
        sign_in_count: 3,
        active: true,
    }
}
// Result
// f1r3_r41n
// User { username: "f1r3_r41n", pw: "a12345", email: "qkrghkql1@gmail.com", sign_in_count: 3, active: true }
  • ๊ตฌ์กฐ์ฒด์—์„œ ์›ํ•˜๋Š” ๊ฐ’์„ ์ฝ์œผ๋ ค๋ฉด ๋งˆ์นจํ‘œ(.) ์‚ฌ์šฉ
    • user1.username
  • ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ€๋ณ€ ์ธ์Šคํ„ด์Šค์ธ ๊ฒฝ์šฐ ๋งˆ์นจํ‘œ๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ํ•„๋“œ์— ์ƒˆ๋กœ์šด ๊ฐ’ ๋Œ€์ž… ๊ฐ€๋Šฅ
    • ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค ์ž์ฒด๊ฐ€ ๊ฐ€๋ณ€์ด์–ด์•ผ ํ•จ
    • ๋Ÿฌ์ŠคํŠธ๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ช‡๋ช‡ ํ•„๋“œ๋งŒ์„ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ
  • ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๊ฐ€๋Šฅ
    • ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ํ‘œํ˜„์‹์€ ๋ฌต์‹œ์ ์œผ๋กœ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•ด์•ผ ํ•จ

๐Ÿค” ๊ฐ™์€ ์ด๋ฆ„์˜ ํ•„๋“œ์™€ ๋ณ€์ˆ˜๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ™œ์šฉํ•˜๊ธฐ

fn build_user(username: String, pw: String, email: String) -> User {
        User{
            username,
            pw,
            email: email,
            sign_in_count: 3,
            active: true,
        }
}
  • ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ตฌ์กฐ์ฒด์˜ ํ•„๋“œ ์ด๋ฆ„์ด ๊ฐ™์„ ๊ฒฝ์šฐ
    • ํ•„๋“œ ์ดˆ๊ธฐํ™” ๋‹จ์ถ• ๋ฌธ๋ฒ•(field init shorthand syntax) ์‚ฌ์šฉ
  • ์ธ์Šคํ„ด์Šค ํ™œ์šฉ ๋ถ€๋ถ„์˜ ์ฝ”๋“œ ์ค‘ build_user ํ•จ์ˆ˜์— ํ•„๋“œ ์ดˆ๊ธฐํ™” ๋‹จ์ถ• ๋ฌธ๋ฒ• ์„ ์ ์šฉํ•œ ์ฝ”๋“œ

๐Ÿค” ๊ธฐ์กด์˜ ์ธ์Šคํ„ด์Šค๋กœ๋ถ€ํ„ฐ ์ƒˆ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๊ธฐ

#[derive(Debug)]
struct User {
    username: String,
    pw: String,
    email: String,
    sign_in_count: u32,
    active: bool,
}

fn main() {
    let user1 = User{
        username: String::from("f1r3_r41n"),
        pw: String::from("a12345"),
        email: String::from("qkrghkql1@gmail.com"),
        sign_in_count: 3,
        active: true,
    };

    let user2 = User{
        username: String::from("gnuykob_"),
        pw: String::from("b12345"),
        email: String::from("leebk1124@gmail.com"),
        ..user1
    };

    println!("{:?}", user1);
    println!("{:?}", user2);
}
// Result
// User { username: "f1r3_r41n", pw: "a12345", email: "qkrghkql1@gmail.com", sign_in_count: 3, active: true }
// User { username: "gnuykob_", pw: "b12345", email: "leebk1124@gmail.com", sign_in_count: 3, active: true }
  • ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ธ์Šคํ„ด์Šค์—์„œ ๋ช‡ ๊ฐ€์ง€ ํ•„๋“œ์˜ ๊ฐ’๋งŒ ์ˆ˜์ •ํ•œ ์ƒํƒœ์˜ ์ƒˆ ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
    • ๊ตฌ์กฐ์ฒด ๊ฐฑ์‹  ๋ฌธ๋ฒ•(struct update syntax) ์‚ฌ์šฉ
  • .. ๋ฌธ๋ฒ•์€ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ดํ•˜์ง€ ์•Š์€ ๋‚˜๋จธ์ง€ ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ๊ธฐ์กด์˜ ์ธ์Šคํ„ด์Šค ํ•„๋“œ์™€ ๊ฐ™์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์˜๋ฏธ ๋‚ดํฌ

๐Ÿค” ์ด๋ฆ„ ์—†๋Š” ํ•„๋“œ๋ฅผ ๊ฐ€์ง„ ํŠœํ”Œ ๊ตฌ์กฐ์ฒด๋กœ ๋‹ค๋ฅธ ํƒ€์ž… ์ƒ์„ฑํ•˜๊ธฐ

  • ํŠœํ”Œ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ƒ๊ธด ๊ตฌ์กฐ์ฒด ์„ ์–ธ ๊ฐ€๋Šฅ
    • ํŠœํ”Œ ๊ตฌ์กฐ์ฒด(tuple structs)
  • ๊ตฌ์กฐ์ฒด์—๋Š” ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜์ง€๋งŒ, ํ•„๋“œ์—๋Š” ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š๊ณ  ํƒ€์ž…๋งŒ ์ง€์ •
  • ์ผ๋ฐ˜์ ์ธ ๊ตฌ์กฐ์ฒด์ฒ˜๋Ÿผ ํ•„๋“œ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ์ด ๊ท€์ฐฎ๊ฑฐ๋‚˜ ๋ถˆํ•„์š”ํ•˜๊ณ , ํŠœํ”Œ ์ž์ฒด์—๋งŒ ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด ์—ฌํƒ€์˜ ํŠœํ”Œ๋“ค๊ณผ๋Š” ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๊ณ ์ž ํ•  ๋•Œ ์œ ์šฉํ•จ
  • ๐Ÿ˜Ž ํŠœํ”Œ ๊ตฌ์กฐ์ฒด ์ •์˜
    • struct keyword์™€ ๊ตฌ์กฐ์ฒด ์ด๋ฆ„, ํŠœํ”Œ ์•ˆ์—์„œ ์‚ฌ์šฉํ•  ํƒ€์ž…๋“ค์„ ์ฐจ๋ก€๋กœ ๋‚˜์—ด
    • ๊ฐ™์€ ํƒ€์ž…๋“ค์„ ํฌํ•จํ•˜๋Š” ๊ฐ๊ฐ์˜ ํŠœํ”Œ ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…
      • 'B ํŠœํ”Œ ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค' ์™€ ๊ฐ™์€ ํƒ€์ž…์„ ํฌํ•จํ•œ 'A ํŠœํ”Œ ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค' ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์— 'B ํŠœํ”Œ ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค' ๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ ๋ถˆ๊ฐ€๋Šฅ
    • ์œ„์˜ ์ ๋งŒ ์ œ์™ธํ•˜๋ฉด ํŠœํ”Œ๊ณผ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•จ
      • (1). ๊ฐ ํ•„๋“œ๊ฐ’์— ๋Œ€์‘ํ•˜๋Š” ๋ณ€์ˆ˜๋กœ ํ•ด์ฒด ๊ฐ€๋Šฅ
      • (2). ๋งˆ์นจํ‘œ(.) ์™€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด ๊ฐœ๋ณ„ ํ•„๋“œ๊ฐ’์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

๐Ÿค” ํ•„๋“œ๊ฐ€ ์—†๋Š” ์œ ์‚ฌ ์œ ๋‹› ๊ตฌ์กฐ์ฒด

  • ํ•„๋“œ๊ฐ€ ํ•˜๋‚˜๋„ ์—†๋Š” ๊ตฌ์กฐ์ฒด ์„ ์–ธ ๊ฐ€๋Šฅ
    • ์œ ์‚ฌ ์œ ๋‹› ๊ตฌ์กฐ์ฒด(unit-like structs)
    • ์ด ๊ตฌ์กฐ์ฒด๋Š” ์œ ๋‹› ํƒ€์ž…, ์ฆ‰ () ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ์œ ์‚ฌ ์œ ๋‹› ๊ตฌ์กฐ์ฒด๋Š” ์–ด๋–ค ํƒ€์ž…์˜ ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ํƒ€์ž…์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๐Ÿ˜Ž ๊ตฌ์กฐ์ฒด ๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ๊ถŒ
    • ์ด ๊ธ€์—์„œ ๊ตฌ์กฐ์ฒด ์ •์˜ ์‹œ &str ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์Šค ํƒ€์ž…์ด ์•„๋‹Œ String ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ
      • ๊ตฌ์กฐ์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ–๊ฒŒ ํ•จ์œผ๋กœ์จ ์œ ํšจํ•œ ๋ฒ”์œ„ ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋™์•ˆ ๊ทธ ๋ฐ์ดํ„ฐ๋„ ์œ ํšจํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ์˜๋„์ž„
    • ๊ตฌ์กฐ์ฒด์— ๋‹ค๋ฅธ ๋ณ€์ˆ˜๊ฐ€ ์†Œ์œ ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
      • ์ˆ˜๋ช…(lifetimes) ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
      • ์ˆ˜๋ช…์€ ๊ตฌ์กฐ์ฒด์˜ ์œ ํšจ ๋ฒ”์œ„ ์•ˆ์—์„œ ๊ตฌ์กฐ์ฒด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•˜๋„๋ก ๋ณด์žฅํ•ด ์คŒ
      • ์ˆ˜๋ช…์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์กฐ์ฒด์— ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ
    • ์•„์ง ์ˆ˜๋ช…์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ง€ ์•Š์•˜๊ธฐ์— String ํƒ€์ž…๊ณผ ๊ฐ™์ด ์†Œ์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž„

2๏ธโƒฃ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ

  • ์‚ฌ๊ฐํ˜•์˜ ๋ฉด์ ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ
    • ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ ํ›„ ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉ ํ˜•ํƒœ๋กœ ๋ฆฌํŒฉํ† ๋ง

๐Ÿค” ๋ณ€์ˆ˜ ์ด์šฉ

fn main() {
    let width1: u32 = 30;
    let height1: u32 = 50;

    println!(
        "์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€", 
        get_area(width1, height1)
    );
}

fn get_area(width: u32, height: u32) -> u32 {
    width * height
}
// Result
// ์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : 1500 ์ œ๊ณฑ ํ”ฝ์…€
  • get_area ํ•จ์ˆ˜๋Š” ํ•œ ์‚ฌ๊ฐํ˜•์˜ ๋ฉด์ ์„ ๊ตฌํ•˜์ง€๋งŒ, ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์žˆ์Œ
  • ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์—ฐ๊ด€์ง€์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ ์€ ๋ฌผ๋ก  ๊ด€๋ฆฌ๋„ ์‰ฌ์šธ ๊ฒƒ ์ž„

๐Ÿค” ํŠœํ”Œ ์ด์šฉ

fn main() {
    let width1: u32 = 30;
    let height1: u32 = 50;

    println!(
        "์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€", 
        get_area((width1, height1))
    );
}

fn get_area(compression: (u32, u32)) -> u32 {
    compression.0 * compression.1
}
// Result
// ์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : 1500 ์ œ๊ณฑ ํ”ฝ์…€
  • ํŠœํ”Œ์€ ์š”์†Œ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์Œ
    • ๊ฐ ์š”์†Œ์— ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Œ

๐Ÿค” ๊ตฌ์กฐ์ฒด ์ด์šฉ : ๋” ๋งŽ์€ ์˜๋ฏธ ๋ฐ˜์˜ํ•˜๊ธฐ

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rectangle1 = Rectangle{ width: 30, height: 50, };
    let rectangle2 = Rectangle{ width: 31, height: 45, };

    println!(
        "์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€",
        get_area(&rectangle1)
    );
    println!(
        "์‚ฌ๊ฐํ˜• 2์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€",
        get_area(&rectangle2)
    );
}

fn get_area(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}
// Result
// ์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : 1500 ์ œ๊ณฑ ํ”ฝ์…€
// ์‚ฌ๊ฐํ˜• 2์˜ ๋ฉด์  : 1395 ์ œ๊ณฑ ํ”ฝ์…€
  • ๋ฐ์ดํ„ฐ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•ด์„œ ์˜๋ฏธ๋ฅผ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์กฐ์ฒด ์‚ฌ์šฉ
  • get_area ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋งŒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ
    • ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์€ ๊ตฌ์กฐ์ฒด์˜ ๋ถˆ๋ณ€ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋Œ€์—ฌ
    • ๋Œ€์—ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด main ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์†Œ์œ ๊ถŒ์„ ๊ณ„์† ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฒ”์œ„ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿค” ํŠธ๋ ˆ์ดํŠธ๋ฅผ ์ƒ์†ํ•ด์„œ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ€์ง„ ๊ฐ’๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋””๋ฒ„๊น…์— ๋งค์šฐ ํšจ์œจ์ ์ผ ๊ฒƒ์ž„
  • println!("rectangle1 : {}", rectangle1); $=>$ Error
  • ๐Ÿ˜Ž println ๋งคํฌ๋กœ
    • ๋‹ค์–‘ํ•œ ํ˜•์‹์œผ๋กœ ๋ฌธ์ž์—ด ์ถœ๋ ฅ ๊ฐ€๋Šฅ
    • ์ค‘๊ด„ํ˜ธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๋งคํฌ๋กœ๊ฐ€ Display ํ˜•์‹์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•จ
      • Display ํ˜•์‹ : ์ตœ์ข… ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ถœ๋ ฅ ํ˜•์‹
    • ๊ธฐ๋ณธ ํƒ€์ž…๋“ค์€ ์ž์‹ ์„ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ๋‹จ ํ•œ ๊ฐ€์ง€๋ฐ–์— ์—†๊ธฐ์— Display ํ˜•์‹์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Œ
    • ๊ตฌ์กฐ์ฒด์™€ ๋น„์Šทํ•œ ์›ฌ๋งŒํ•œ ์ปดํŒŒ์šด๋“œ ํƒ€์ž…๋“ค์€ ์ž์‹ ์„ ์ถœ๋ ฅํ•  ๋ฐฉ๋ฒ•์ด ํ•˜๋‚˜ ์ด์ƒ์ž„
    • ๋Ÿฌ์ŠคํŠธ๋Š” ์—ฐ์†๋œ ๊ฐ’์„ ๊ฐ–๋Š” ํƒ€์ž…์— ๋Œ€ํ•ด Display ํŠธ๋ ˆ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋„๋ก ๋‚จ๊ฒจ๋‘ 
    • println ๋งคํฌ๋กœ์˜ ์ค‘๊ด„ํ˜ธ ์•ˆ์— :? ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์ •ํ•˜๋ฉด Debug ๋ผ๋Š” ์ถœ๋ ฅ ํ˜•์‹์„ ์ด์šฉํ•ด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•จ
    • Debug ํŠธ๋ ˆ์ดํŠธ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ํ˜•์‹์œผ๋กœ ๊ตฌ์กฐ์ฒด์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•จ
    • ๋Ÿฌ์ŠคํŠธ๋Š” ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ตฌ์กฐ์ฒด๋Š” ์ด ๊ธฐ๋Šฅ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•จ
    • #[derive(Debug)] ์• ๋…ธํ…Œ์ด์…˜์„ ๊ตฌ์กฐ์ฒด ์ •์˜์— ์ถ”๊ฐ€
    • ๊ตฌ์กฐ์ฒด์— ํฌํ•จ๋œ ํ•„๋“œ์˜ ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋ฉด :? ๋Œ€์‹  :#? ์‚ฌ์šฉ
  • ๋Ÿฌ์ŠคํŠธ๋Š” derive ์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์— ์œ ์šฉํ•œ ๋™์ž‘์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํŠธ๋ ˆ์ดํŠธ ์ œ๊ณต

3๏ธโƒฃ ๋ฉ”์„œ๋“œ ๋ฌธ๋ฒ•

  • ๋ฉ”์„œ๋“œ(method) ๋Š” ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•จ
  • fn keyword๋กœ ์ •์˜ํ•˜๋ฉฐ, ์ด๋ฆ„, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด ํƒ€์ž…์„ ์ •์˜ ๊ฐ€๋Šฅ
  • ํ˜ธ์ถœ ์‹œ ์‹คํ–‰ํ•  ์ผ๋ จ์˜ ์ฝ”๋“œ๋„ ์ •์˜ ๊ฐ€๋Šฅ
  • ํ•จ์ˆ˜์™€ ๋‹ฌ๋ฆฌ ๊ตฌ์กฐ์ฒด์˜ ์ปจํ…์ŠคํŠธ(context) ์•ˆ์— ์ •์˜ํ•˜๋ฉฐ, ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํ‘œํ˜„ํ•˜๋Š” self ์ด์–ด์•ผ ํ•จ
    • ๋ฉ”์„œ๋“œ๋Š” ์—ด๊ฑฐ์ž๋‚˜ ํŠธ๋ ˆ์ดํŠธ ๊ฐ์ฒด์—๋„ ์ •์˜ ๊ฐ€๋Šฅ

๐Ÿค” ๋ฉ”์„œ๋“œ ์ •์˜ํ•˜๊ธฐ

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn get_area(&self) -> u32 {
        self.width * self.height
    }
}

fn main() {
    let rectangle1 = Rectangle{ width: 30, height: 50, };
    let rectangle2 = Rectangle{ width: 31, height: 45, };

    println!(
        "์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€",
        rectangle1.get_area()
    );
    println!(
        "์‚ฌ๊ฐํ˜• 2์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€",
        rectangle2.get_area()
    );
}
// Result
// ์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : 1500 ์ œ๊ณฑ ํ”ฝ์…€
// ์‚ฌ๊ฐํ˜• 2์˜ ๋ฉด์  : 1395 ์ œ๊ณฑ ํ”ฝ์…€
  • ๊ตฌ์กฐ์ฒด ํƒ€์ž…์˜ ์ปจํ…์ŠคํŠธ ์•ˆ์— ํ•จ์ˆ˜ ์ •์˜ ์‹œ impl(implementation) ๋ธ”๋ก ์ด์šฉ
  • ๋ฉ”์„œ๋“œ ๋ฌธ๋ฒ• ์‚ฌ์šฉ์œผ๋กœ get_area ๋ฉ”์„œ๋“œ๋Š” Rectangle ์ธ์Šคํ„ด์Šค ์ƒ์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ๋ฉ”์„œ๋“œ ๋ฌธ๋ฒ•์€ ์ธ์Šคํ„ด์Šค ๋‹ค์Œ์— ๋”ฐ๋ผ์˜ด
    • ์ธ์Šคํ„ด์Šค ๋‹ค์Œ์— ๋งˆ์นจํ‘œ, ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„, ๊ด„ํ˜ธ, ํ•„์š”ํ•œ ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋จ
  • get_area ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ &self ์ž„
    • ํ•จ์ˆ˜๊ฐ€ Rectangle ๊ตฌ์กฐ์ฒด์˜ ์ปจํ…์ŠคํŠธ ์•ˆ์— ์กด์žฌํ•˜๋ฏ€๋กœ ๋Ÿฌ์ŠคํŠธ๋Š” self ์˜ ํƒ€์ž…์ด Rectangle ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Œ
    • ๋ฉ”์„œ๋“œ๋Š” self ์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์„ ๊ฐ–๊ฑฐ๋‚˜ self ์˜ ๋ถˆ๋ณ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์—ฌํ•˜๊ฑฐ๋‚˜ self ์˜ ๊ฐ€๋ณ€ ์ธ์Šคํ„ด์Šค๋ฅผ ๋Œ€์—ฌํ•  ์ˆ˜ ์žˆ์Œ
  • ํ•ด๋‹น ์ฝ”๋“œ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ๊ตฌ์กฐ์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋ฟ ๊ฐ’์„ ์“ฐ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ตณ์ด ์†Œ์œ ๊ถŒ์„ ๊ฐ€์งˆ ํ•„์š”๊ฐ€ ์—†์Œ
    • ์ฐธ์กฐ์˜ ์‚ฌ์šฉ ์ด์œ 
  • ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ &mut self ๋กœ ์„ ์–ธํ•ด์•ผ ํ•จ
    • ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ self ๋กœ๋งŒ ์„ ์–ธํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์†Œ์œ ๊ถŒ์„ ๊ฐ–๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋“œ๋ฌพ
    • ๋ฉ”์„œ๋“œ๊ฐ€ self ๋ฅผ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋กœ ๊ต์ฒดํ•œ ํ›„ ํ˜ธ์ถœ์ž๊ฐ€ ๋” ์ด์ƒ ์˜ˆ์ „ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•  ๊ฒฝ์šฐ์— ํ™œ์šฉ
  • ๐Ÿ˜Ž ํ•จ์ˆ˜ ๋Œ€์‹  ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์žฅ์ 
    • (1). ํ˜ธ์ถœ ๋•Œ๋งˆ๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํƒ€์ž…์„ ๋„˜๊ฒจ์ค„ ํ•„์š”๊ฐ€ ์—†์Œ
    • (2). ์ฝ”๋“œ๋ฅผ ๋” ์ž˜ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
  • ๐Ÿ˜Ž -> ์—ฐ์‚ฐ์ž๋Š” ์–ด๋””์—?
    • C๋‚˜ CPP์—์„œ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์„œ๋กœ ๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
      • ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•  ๋•Œ . ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ
      • ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ ์‹œ -> ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํฌ์ธํ„ฐ๋ฅผ ์—ญ์ฐธ์กฐ(dereference) ํ•ด์•ผ ํ•จ
      • ๊ฐ์ฒด๊ฐ€ ํฌ์ธํ„ฐ์ผ ๋•Œ๋Š” object->something() ์€ (*object).something() ๊ณผ ์œ ์‚ฌํ•จ
    • ๋Ÿฌ์ŠคํŠธ์—๋Š” -> ์—ฐ์‚ฐ์ž์— ํ•ด๋‹นํ•˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์—†์Œ
      • ๋Ÿฌ์ŠคํŠธ๋Š” ์ž๋™ ์ฐธ์กฐ ๋ฐ ์—ญ์ฐธ์กฐ(automatic referencing and dereferencing) ๊ธฐ๋Šฅ ์ œ๊ณต
      • ๋ฉ”์†Œ๋“œ์˜ ํ˜ธ์ถœ ์—ญ์‹œ ๋Ÿฌ์ŠคํŠธ๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ํ™•์šฉํ•˜๋Š” ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜
    • object.something() ๊ณผ ๊ฐ™์ด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ๋Ÿฌ์ŠคํŠธ๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ object ๋ณ€์ˆ˜์— & , &mut , ๋˜๋Š” * ์„ ์ถ”๊ฐ€ํ•จ
    • p1.distance(&p2); $=$ (&p1).distance(&p2);
    • ์ž๋™ ์ฐธ์กฐ ๊ธฐ๋Šฅ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜์‹ ์ž, ์ฆ‰ self ์˜ ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ ์–ธํ•˜๊ธฐ์— ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ž„
    • ๋ฉ”์„œ๋“œ์˜ ์ˆ˜์‹ ์ž์™€ ์ด๋ฆ„ ๋•๋ถ„์— ๋Ÿฌ์ŠคํŠธ๋Š” ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๊ฐ’์„ ์ฝ๋Š”์ง€ (&self) , ๊ฐ’์„ ์“ฐ๋Š”์ง€ (&mut self) , ์•„๋‹ˆ๋ฉด ์†Œ๋น„ํ•˜๋Š”์ง€ (self) ๋ฅผ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Œ

๐Ÿค” ๋” ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ–๋Š” ๋ฉ”์„œ๋“œ

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn get_area(&self) -> u32 {
        self.width * self.height
    }

    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width>other.width && self.height>other.height
    }
}

fn main() {
    let rectangle1 = Rectangle{ width: 30, height: 50, };
    let rectangle2 = Rectangle{ width: 10, height: 40, };
    let rectangle3 = Rectangle{ width: 60, height: 45, };

    println!(
        "์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€",
        rectangle1.get_area()
    );
    println!(
        "์‚ฌ๊ฐํ˜• 2์˜ ๋ฉด์  : {} ์ œ๊ณฑ ํ”ฝ์…€",
        rectangle2.get_area()
    );
    println!(
        "์‚ฌ๊ฐํ˜• 1์ด ์‚ฌ๊ฐํ˜• 2๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? {}", 
        rectangle1.can_hold(&rectangle2)
    );
    println!(
        "์‚ฌ๊ฐํ˜• 1์ด ์‚ฌ๊ฐํ˜• 3์„ ํฌํ•จํ•˜๋Š”๊ฐ€? {}", 
        rectangle1.can_hold(&rectangle3)
    );
}
// Result
// ์‚ฌ๊ฐํ˜• 1์˜ ๋ฉด์  : 1500 ์ œ๊ณฑ ํ”ฝ์…€
// ์‚ฌ๊ฐํ˜• 2์˜ ๋ฉด์  : 400 ์ œ๊ณฑ ํ”ฝ์…€
// ์‚ฌ๊ฐํ˜• 1์ด ์‚ฌ๊ฐํ˜• 2๋ฅผ ํฌํ•จํ•˜๋Š”๊ฐ€? true
// ์‚ฌ๊ฐํ˜• 1์ด ์‚ฌ๊ฐํ˜• 3์„ ํฌํ•จํ•˜๋Š”๊ฐ€? false
  • ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์— ๋˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•ด์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค์˜ ๋ฉด์ ์ด ๋‘ ๋ฒˆ์งธ ์ธ์Šคํ„ด์Šค์˜ ๋ฉด์ ์„ ์™„์ „ํžˆ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด true ๋ฆฌํ„ด, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์ฝ”๋“œ
  • ๋ฉ”์„œ๋“œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด self ๋งค๊ฐœ๋ณ€์ˆ˜ ์ดํ›„์— ์›ํ•˜๋Š” ๋งŒํผ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ

๐Ÿค” ์—ฐ๊ด€ ํ•จ์ˆ˜

  • impl ๋ธ”๋ก์€ self ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ => ์—ฐ๊ด€ ํ•จ์ˆ˜(associated functions)
  • ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ์ „๋‹ฌ๋ฐ›์ง€ ์•Š๊ธฐ์— ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ ํ•จ์ˆ˜์ž„
    • Ex) String::from ํ•จ์ˆ˜
  • ์—ฐ๊ด€ ํ•จ์ˆ˜๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์ƒ์„ฑ์ž(constructors) ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn square(size: u32) -> Rectangle {
        Rectangle { width: size, height: size }
    }
}

fn main() {
    let square1 = Rectangle::square(4);
    println!(
        "width: {}\nheight: {}", 
        square1.width, square1.height
    );
}
// Result
// width: 4
// height: 4
  • ์—ฐ๊ด€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ๊ตฌ์กฐ์ฒด์˜ ์ด๋ฆ„๊ณผ :: ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
  • ์—ฐ๊ด€ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • :: ๋ฌธ๋ฒ•์€ ์—ฐ๊ด€ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“ˆ์ด ์ƒ์„ฑํ•˜๋Š” ์ด๋ฆ„ ๊ณต๊ฐ„(namespace) ์ •์˜์—๋„ ์‚ฌ์šฉ๋จ

๐Ÿค” ์—ฌ๋Ÿฌ ๊ฐœ์˜ impl ๋ธ”๋ก

  • ๊ฐ ๊ตฌ์กฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ impl ๋ธ”๋ก ์„ ์–ธ ๊ฐ€๋Šฅ
  • ์ œ๋„ค๋ฆญ ํƒ€์ž…๊ณผ ํŠธ๋ ˆ์ดํŠธ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ

Summary

  • ๊ตฌ์กฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ํŠน์ •ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…
  • ๋ฉ”์„œ๋“œ๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค์— ์›ํ•˜๋Š” ๋™์ž‘์„ ๋ถ€์—ฌํ•จ
  • ์—ฐ๊ด€ ํ•จ์ˆ˜๋Š” ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—†๋Š” ์ƒํ™ฉ์—์„œ ๊ตฌ์กฐ์ฒด์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌ๋ถ„์ง“๋Š” ๋ฐ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ตฌ์กฐ์ฒด๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž…์„ ์„ ์–ธํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹˜
728x90
๋ฐ˜์‘ํ˜•
Comments