DataScience
Published 2023. 6. 19. 16:56
Rust Generic 데이터 타입 Rust
728x90

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
profile

DataScience

@Ninestar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!