Generic은 컨셉의 복제를 효율적으로 다루기 위한 도구입니다.
구체화된 타입이나 다른 속성들에 대하여 추상화된 대리인 역할. 제네릭은 함수, 구조체, 열거형, 메소드를 정의할때 사용할 수 있습니다.
제네릭 데이터 타입 활용
다양한 타입의 파라미터를 받아 작업을 수행할 수 있습니다. 다른 언어들처럼 함수이름 뒤에 꺽쇠괄호를 써주면 된니다.
제너릭타입명은 값 하나면 T를 쓰고 함수타입 하나면 F를 쓰는게 관례입니다.
함수정의에서 제네릭 데이터 타입을 이용합니다.
data: T는 [i32],[f32],[&str]타입의 파라미터를 받고 있습니다.
fn show<T>(data : T) -> T {
data
}
fn main(){
println!("i32 data : {}", show(29));
println!("f32 data : {}", show(0.2));
println!("&str data : {}", show("ninestar"));
}
i32 data : 29
f32 data : 0.2
&str data : ninestar
아래와 같이 println!의 인자로 넣어주면 에러가 발생합니다.
fn show<T>(data : T) {
println!("{}",data);
}
fn main(){
show(29);
show(0.2);
show("ninestar");
}
T에 println!이 받을 수 없는 인자가 올수 도 있으니 받을수 없는건 where로 제약을 해야 합니다.
fn show<T>(data : T) where T: fmt::Display{
println!("{}",data);
}
fn main(){
show(29);
show(0.2);
show("ninestar");
}
또는 where를 앞으로 넣어줘도 상관없습니다.
fn show<T: fmt::Display> (data : T) {
println!("{}",data);
}
fn main(){
show(29);
show(0.2);
show("ninestar");
}
T는 Display tait을 구현하는 타입이어야 한다. 라는 의미입니다.
T타입의 값 x,y를 갖는 point구조체
struct Point<T> {
x: T,
y: T,
}
fn main() {
let integer = Point { x: 5, y: 10 };
let float = Point { x: 1.0, y: 4.0 };
}
열거형에서도 제네릭 데이터 타입을 사용 할 수 있습니다. Result는 두 개의 variant를 가지고 있습니다: 타입 T의 값을 들고 있는 Ok, 그리고 타입 E의 값을 들고 있는 Err입니다. 이 정의는 성공하거나 (그래서 어떤 T 값을 반환하거나) 혹은 실패하는 (그래서 E 타입으로 된 에러를 반환하는) 연산이 필요한 어디에서든 편리하게 Result 열거형을 이용하도록 해줍니다.
enum Result<T, E> {
Ok(T),
Err(E),
}
메서드 정의에서도 제네릭 데이터 타입을 사용 할 수 있습니다. T 타입의 x 필드에 대한 참조자를 반환하는 Point<T> 구조체 상에 x라는 이름의 메소드 정의합니다. impl 바로 뒤에 T를 정의해야만 타입 Point<T> 메소드를 구현하는 중에 이를 사용할 수 있습니다.
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn x(&self) -> &T {
&self.x
}
}
fn main() {
let p = Point { x: 5, y: 10 };
println!("p.x = {}", p.x());
}
제네릭 타입 추론
단순 래퍼타입 Wrap를 정의하고 객체 생성할때 타입을 명시하지 않았기 때문에 컴파일시 에러가 납니다.
use std::default::Default;
struct Wrap<T>{
value:T
}
impl <T: Default> Wrap<T>{
pub fn new()->Self{
Wrap{
value: Default::defautl()
}
}
}
fn main()
{
let mut obj = Wrap:new();
}
하지만 바로 값을 넣어주면 에러가 발생하지 않고 자동으로 타입이 추론됩니다.
fn main()
{
let mut obj = Wrap:new();
obj.value = 55; //타입 자동 추론
}
'Rust' 카테고리의 다른 글
[Rust-Python] PyO3 (96) | 2023.06.30 |
---|---|
Rust Trait (160) | 2023.06.20 |
Rust testing (142) | 2023.06.15 |
Rust 파이썬 바인딩 (56) | 2023.05.29 |
Rust 비동기 프로그래밍 (36) | 2023.05.28 |