Learn Rust Coding · 강의

where 절과 여러 제약

복잡한 시그니처를 읽기 쉽게 유지해 보세요.

레슨 4/413개 단계

where 절과 여러 제약은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

인라인 바운드가 복잡해질 때

<T: Display + Clone, U: Debug + Default>와 같은 인라인 바운드는 길어질수록 읽기 어려워집니다. Rust에서는 더 깔끔한 대안으로 where 절을 제공합니다.

where 절은 제약 조건을 시그니처 아래로 옮겨 매개변수 목록을 짧게 유지합니다.

기본 where 절

where 절은 반환 타입과 본문 사이에 놓입니다. 각 줄에는 타입과 해당 타입의 바운드를 나열합니다.

이 두 시그니처는 정확히 같은 의미이며, where 형식이 더 읽기 좋을 뿐입니다.

use std::fmt::Display;

fn show<T>(value: T)
where
    T: Display,
{
    println!("{}", value);
}

where 절에서 여러 바운드 사용하기

여러 제약 조건을 둘 수 있으며, 각 타입 매개변수마다 하나씩 쉼표로 구분해 작성합니다. 각 항목에서는 여러 트레이트를 +로 결합할 수 있습니다.

모든 내용을 인라인으로 욱여넣는 것보다 복잡한 시그니처를 읽기 쉽게 유지할 수 있습니다.

use std::fmt::{Display, Debug};

fn report<T, U>(a: T, b: U)
where
    T: Display + Clone,
    U: Debug,
{
    println!("{} {:?}", a, b);
}

완전한 예제

이 프로그램은 Display를 요구하는 where 절을 사용합니다. 프로그램이 실행되면 각 인수를 레이블과 함께 출력합니다.

바운드가 붙어 있어도 함수 헤더가 깔끔하게 유지되는 점을 살펴보세요.

use std::fmt::Display;

fn label<T>(name: &str, value: T)
where
    T: Display,
{
    println!("{} = {}", name, value);
}

fn main() {
    label("age", 30);
    label("city", "Oslo");
}

컴파일러가 인라인으로 작성할 수 없는 바운드

연관 타입이나 참조된 타입에 대한 바운드처럼 where 절에서만 작성할 수 있는 바운드도 있습니다. 인라인 구문으로는 where Vec<T>: Clone을 표현할 수 없습니다.

따라서 where 형식이 표현력이 더 뛰어납니다.

fn duplicate<T>(items: Vec<T>) -> (Vec<T>, Vec<T>)
where
    Vec<T>: Clone,
{
    (items.clone(), items)
}

표준 트레이트 결합하기

실제 프로그램에서 흔히 사용하는 바운드는 순서 지정, 복사, 출력을 결합합니다. 이 제네릭 max_of는 슬라이스에서 가장 큰 항목을 찾습니다.

where 절은 알고리즘이 의존하는 세 트레이트를 한곳에 모읍니다.

use std::fmt::Display;

fn max_of<T>(items: &[T]) -> &T
where
    T: PartialOrd + Display,
{
    let mut best = &items[0];
    for item in items {
        if item > best { best = item; }
    }
    best
}

max_of 실행하기

다음은 같은 아이디어를 실행 가능한 프로그램으로 작성한 예입니다. 정수 슬라이스는 PartialOrd + Display를 만족하므로 호출이 컴파일되고 최댓값을 출력합니다.

이 함수는 부동 소수점 수나 문자에도 똑같이 작동합니다.

fn max_of<T>(items: &[T]) -> &T
where
    T: PartialOrd,
{
    let mut best = &items[0];
    for item in items {
        if item > best { best = item; }
    }
    best
}

fn main() {
    let nums = [3, 7, 1, 9, 4];
    println!("{}", max_of(&nums));
}

impl 블록의 where 절

where 절은 impl 블록에도 붙일 수 있습니다. 이렇게 하면 저장된 타입이 Display를 구현할 때만 메서드가 추가됩니다.

T가 Display가 아닌 인스턴스에는 이 메서드가 아예 존재하지 않습니다.

use std::fmt::Display;

struct Holder<T> { item: T }

impl<T> Holder<T>
where
    T: Display,
{
    fn print(&self) {
        println!("{}", self.item);
    }
}

여러 바운드를 한 번에 사용하기

실제 제네릭 API에서는 매개변수마다 여러 트레이트를 요구하는 경우가 많습니다. 이 시그니처는 복제, 디버깅, 기본값을 요구합니다.

where 절을 사용하면 하나의 타입에 세 가지 바운드가 있어도 읽기 쉽게 유지할 수 있습니다.

use std::fmt::Debug;

fn build<T>() -> T
where
    T: Default + Clone + Debug,
{
    let v = T::default();
    v.clone()
}

인라인과 where 중 선택하기

간단한 제약 조건이 한두 개라면 인라인 바운드를 사용하세요. 매개변수가 많거나 트레이트 목록이 길거나 복잡한 타입에 바운드를 지정해야 한다면 where로 바꾸세요.

둘 다 동일한 코드로 컴파일되므로, 선택 기준은 순전히 가독성입니다.

수명과 함께 사용하는 where

where 절에는 트레이트 바운드와 함께 수명 관계도 나열할 수 있습니다. 따라서 두 종류의 제약 조건이 모두 있는 제네릭 시그니처를 체계적으로 정리할 수 있습니다.

여기서 이 절은 T가 수명 'a보다 오래 지속되도록 요구합니다.

fn keep<'a, T>(value: &'a T) -> &'a T
where
    T: 'a,
{
    value
}

빠른 확인

where 절과 여러 바운드에 대한 이해도를 확인해 보세요.

정리

where 절은 트레이트 바운드를 시그니처 아래로 옮겨, 매개변수나 트레이트 목록이 길어질 때 가독성을 높입니다. 또한 인라인 구문으로 표현할 수 없는 복잡한 타입과 수명에 대한 바운드도 표현할 수 있습니다.

인라인 바운드와 where 바운드는 동일하게 컴파일되므로, 더 명확하게 읽히는 쪽을 선택하세요.

무료로 시작

AI 튜터와 함께 Rust을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
39
레슨
144

자주 묻는 질문

“where 절과 여러 제약” 강의는 무료인가요?

네 — “where 절과 여러 제약” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

“where 절과 여러 제약”에서 뭘 배우나요?

복잡한 시그니처를 읽기 쉽게 유지해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“where 절과 여러 제약” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 제네릭 함수
  2. 제네릭 구조체와 열거형
  3. 트레이트 제약
  4. where 절과 여러 제약
← Learn Rust Coding(으)로 돌아가기