where 절과 여러 제약
복잡한 시그니처를 읽기 쉽게 유지해 보세요.
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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 제네릭 함수
- 제네릭 구조체와 열거형
- 트레이트 제약
- where 절과 여러 제약