Menu
Coddy logo textTech

연관 함수

Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 4번째.

impl 블록 내의 모든 함수가 기존 인스턴스에서 동작해야 하는 것은 아닙니다. self를 매개변수로 받지 않는 함수를 연관 함수라고 하며, 이는 특정 인스턴스가 아닌 타입 자체와 연관됩니다.

연관 함수의 가장 일반적인 용도는 생성자를 만드는 것입니다. 관례적으로, 이들은 종종 new라고 명명됩니다:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

self 매개변수가 없다는 점에 주목하세요. 이 함수는 작동하기 위해 기존 Player가 필요하지 않습니다. 대신, 완전히 새로운 것을 생성하여 반환합니다. 반환 타입은 구조체 그 자체입니다.

연관 함수를 호출하려면 점 표기법 대신 타입 이름과 함께 :: 구문을 사용하세요:

fn main() {
    let player1 = Player::new(String::from("Alice"));
    
    println!("{} starts with {} points", player1.name, player1.score);
    // 출력: Alice starts with 0 points
}

이 패턴은 기본값이나 유효성 검사 로직을 사용하여 구조체를 초기화하는 깔끔한 방법을 제공하며, 생성 로직을 타입 정의와 함께 묶어 둡니다. 여러분은 이미 String::from()에서 이 구문을 보셨을 것입니다. 이것 역시 연관 함수입니다!

challenge icon

챌린지

쉬움

두 개의 필드 title (String)과 pages (u32)를 가진 Book 구조체를 생성하세요.

Book에 대해 다음과 같은 기능을 수행하는 new라는 연관 함수(associated function)를 포함하는 구현(implementation) 블록을 추가하세요:

  • title: String 매개변수를 받습니다
  • 주어진 제목과 0으로 설정된 pages를 가진 새로운 Book을 반환합니다

또한 &self를 매개변수로 받고 "{title} has {pages} pages" 형식의 String을 반환하는 info라는 메서드를 추가하세요.

하나의 입력을 받게 됩니다:

  • 책의 제목 (String)

Book::new 연관 함수를 사용하여 제공된 제목으로 책을 생성한 다음, info 메서드를 호출한 결과를 출력하세요.

예상 출력 형식:

{title} has {pages} pages

치트 시트

impl 블록 내에서 self를 매개변수로 받지 않는 함수를 연관 함수(associated functions)라고 부릅니다. 이 함수들은 특정 인스턴스가 아니라 타입 자체와 연관됩니다.

연관 함수는 흔히 생성자로 사용되며, 보통 new라는 이름을 가집니다:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

연관 함수를 호출하려면 타입 이름과 함께 :: 문법을 사용하세요:

let player1 = Player::new(String::from("Alice"));

String::from()은 여러분이 이미 사용해 본 연관 함수의 한 예입니다.

직접 해보기

use std::io;

// TODO: title (String)과 pages (u32) 필드를 가진 Book 구조체를 정의하세요.


// TODO: 다음을 포함하는 Book의 impl 블록을 추가하세요:
// - 제목(title)을 받아 pages가 0으로 설정된 Book을 반환하는 연관 함수 `new`
// - "{title} has {pages} pages" 형식의 String을 반환하는 `info` 메서드


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let title = input.trim().to_string();

    // TODO: Book::new를 사용하여 제공된 제목으로 책을 생성하세요.
    // TODO: info 메서드를 호출한 결과를 출력하세요.
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨