0Pricing
Learn Rust Coding · 강의

제네릭 함수

형식에 따라 동작을 매개변수화해 보세요.

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

제네릭 함수를 사용하는 이유

제네릭 함수를 사용하면 타입마다 코드를 복사하는 대신 여러 타입에서 작동하는 함수 하나를 작성할 수 있습니다. Rust는 컴파일 시점에 자리 표시자 타입을 바꿉니다.

정수용 largest와 문자용 largest를 각각 작성한다고 생각해 보세요. 제네릭을 사용하면 이를 실행 비용 없이 하나의 정의로 합칠 수 있습니다.

타입 매개변수

제네릭 함수는 이름 뒤의 꺾쇠괄호 안에 타입 매개변수를 선언합니다. T라는 이름이 관례이지만 어떤 CamelCase 식별자든 사용할 수 있습니다.

그런 다음 매개변수는 인수와 반환 타입에 나타나 호출자가 사용하는 구체적인 타입을 대신할 수 있습니다.

fn first<T>(pair: (T, T)) -> T {
    pair.0
}

간단한 항등 함수

이 프로그램은 인수를 변경하지 않고 반환하는 제네릭 echo를 정의합니다. 정수와 문자열 슬라이스를 각각 한 번씩 전달하여 호출합니다.

컴파일러는 실제로 사용된 각 타입에 대해 별도의 구체적인 버전을 생성합니다.

fn echo<T>(value: T) -> T {
    value
}

fn main() {
    println!("{}", echo(42));
    println!("{}", echo("hi"));
}

단일형성

Rust는 단일형성을 사용합니다. 컴파일 시점에 사용된 각 구체적 타입에 맞춘 특수화된 함수 복사본을 만듭니다. 박싱이나 가상 디스패치는 없습니다.

그 결과 제네릭 코드가 직접 작성한 타입별 코드만큼 빠르게 실행됩니다.

제약 조건이 필요한 제네릭

제네릭 함수 내부에서는 가능한 모든 타입이 지원하는 연산만 사용할 수 있습니다. 아무 제약이 없는 T는 더하거나 비교하거나 출력할 수 없습니다.

T가 비교를 구현하지 않을 수도 있기 때문에 이 코드는 컴파일에 실패합니다. 다음에는 트레이트 바운드로 이를 수정합니다.

fn larger<T>(a: T, b: T) -> T {
    if a > b { a } else { b }
}

트레이트 바운드 추가

값을 비교하려면 PartialOrd로 T에 제약을 설정합니다. 이 바운드는 타입이 > 연산자를 지원한다는 것을 보장합니다.

또한 Copy를 추가하여 정수처럼 단순한 타입의 값이 이동 문제 없이 반환되도록 합니다.

fn larger<T: PartialOrd + Copy>(a: T, b: T) -> T {
    if a > b { a } else { b }
}

바운드가 있는 함수 호출

이제 두 트레이트를 모두 구현하는 모든 타입에서 함수가 작동합니다. 정수와 실수는 모두 PartialOrd + Copy를 만족합니다.

동일한 소스 코드가 두 버전으로 단일형성되어 각 호출의 결과를 출력합니다.

fn larger<T: PartialOrd + Copy>(a: T, b: T) -> T {
    if a > b { a } else { b }
}

fn main() {
    println!("{}", larger(3, 9));
    println!("{}", larger(2.5, 1.0));
}

여러 타입 매개변수

함수는 여러 타입 매개변수를 선언할 수 있습니다. 각각 독립적이므로 두 인수의 타입이 서로 달라도 됩니다.

여기서 pair는 임의의 T와 임의의 U를 받아 튜플로 반환합니다.

fn pair<T, U>(a: T, b: U) -> (T, U) {
    (a, b)
}

제네릭 값 출력

{}로 제네릭 값을 출력하려면 타입이 Display를 구현해야 합니다. 출력 가능한 타입을 전달할 수 있도록 해당 바운드를 추가합니다.

이 함수는 값에 이름을 붙여 반환하며, 서식 지정만을 위해 바운드를 사용하는 방법을 보여 줍니다.

use std::fmt::Display;

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

fn main() {
    announce("count", 7);
    announce("name", "Ada");
}

터보피시 문법

때로는 컴파일러가 인수만으로 T를 추론할 수 없습니다. 터보피시 ::<Type>을 사용하면 호출 위치에서 명시적으로 지정할 수 있습니다.

반환 타입이 모호한 parse와 collect 같은 메서드에서 가장 흔히 사용됩니다.

fn main() {
    let n = "42".parse::<i32>().unwrap();
    println!("{}", n + 1);
}

참조에 대한 제네릭

제네릭 매개변수는 참조에도 사용할 수 있습니다. 참조를 기준으로 제약을 설정하면 값을 읽기만 할 때 Copy를 요구하지 않아도 됩니다.

이 longest_str 스타일의 도우미 함수는 두 슬라이스를 빌리고 소유권을 가져오지 않은 채 그중 하나를 반환합니다.

fn pick<'a, T: PartialOrd>(a: &'a T, b: &'a T) -> &'a T {
    if a > b { a } else { b }
}

빠른 확인

Rust의 제네릭 함수에 대한 이해도를 확인해 보세요.

복습

제네릭 함수는 꺾쇠괄호 안의 타입 매개변수를 사용하여 단일형성을 통해 실행 시간 비용 없이 여러 타입에서 작동합니다.

제네릭 타입에 연산을 적용하려면 PartialOrd, Copy, Display 같은 트레이트 바운드가 필요합니다. 추론으로 타입을 결정할 수 없을 때는 터보피시를 사용합니다.

자주 묻는 질문

“제네릭 함수” 강의는 무료인가요?

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

“제네릭 함수”에서 뭘 배우나요?

형식에 따라 동작을 매개변수화해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“제네릭 함수” 강의는 얼마나 걸리나요?

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

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

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

이 강의의 모든 강의

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