320x100
320x100

함수 포인터 (function pointer)

일반 함수를 함수에 전달할 수 있도록 해주는 기법

새로운 클로저를 정의하는 대신 이미 정의한 함수를 전달하고 싶을 때 유용

함수는 fn 타입으로 강제되는데 이 fn 타입을 함수 포인터라고함 (Fn 클로저 트레이트와 혼동 주의)

함수 포인터로 함수를 전달하면 함수를 다른 함수에 대한 인수로 사용할 수 있음

 

fn add_one(x: i32) -> i32 {
    x + 1
}

// fn 타입 (함수 포인터) 사용
fn do_twice(f: fn(i32) -> i32, arg: i32) -> i32 {
    f(arg) + f(arg)
}

fn main() {
    let answer = do_twice(add_one, 5);
    println!("answer: {}", answer);
}

 

함수 포인터는 세 가지 클로저 트레이트 (Fn, FnMut, FnOnce)를 모두 구현하므로, 클로저를 기대하는 함수에 대한 인수로 함수 포인터를 언제나 전달할 수 있음

제네릭 타입과 클로저 트레이트 중 하나를 사용하는 함수를 작성하여 함수나 클로저 중 하나를 받아들일 수 있도록 하는 것이 가장 좋음

 

 

 

 

 

클로저 반환하기

클로저는 트레이트로 표현되므로, 클로저를 직접 반환할 수 없음

트레이트를 반환해야하는 대부분의 경우, 대신 트레이트를 구현하는 구체적 타입을 함수의 반환값으로 사용할 수 있음

그러나 클로저에는 반환 할 수 있는 구체적 타입이 없기 때문에 그렇게 할 수 없음

러스트가 클로저를 저장하기 위해 얼마나 많은 공간이 필요한지 알 수 없기 때문임

때문에 트레이트 객체를 사용하면 클로저를 반환할 수 있음

fn return_closure() -> Box<dyn Fn(i32) -> i32> {
    Box::new(|x| x + 1)
}

 

 

 

 

 

300x250
728x90

'Programming > Rust' 카테고리의 다른 글

러스트의 유용한 도구들  (0) 2025.10.12
러스트 매크로  (0) 2025.10.12
러스트 고급 타입  (0) 2025.10.12
러스트 고급 트레이트  (0) 2025.10.12
안전하지 않은 러스트  (0) 2025.10.12