Rust - 제네릭 타입
Rust 문법
1. 제네릭 타입
제네릭을 사용하면 함수 시그니처나 구조체의 아이템에 다양한 구체적 데이터 타입을 사용할 수 있도록 정의할 수 있다. 총 4가지를 제네릭 데이터 타입으로 정의할 수 있다.
1) 함수
제네릭 함수를 정의할 때는, 함수 시그니처 내 매개변수와 반환 값의 데이터 타입 위치에 제네릭을 사용하면 된다. 제네릭 함수로 정의하면 데이터 타입마다 함수를 정의하지 않아도 되서 코드가 매우 깔끔해진다.
아래와 같이 제네릭 함수를 정의할 수 있다.
1
2
3
4
5
6
7
8
fn mirror<T>(data: T) -> T {
data
}
fn main() {
println!("i32 data : {}", show(11));
println!("f32 data : {}", show(1.1));
}
단, 데이터 타입마다 별도의 처리를 구현해야하는 경우가 있는데 이는 트레이트에 대해 설명할 때 추가적으로 업데이트하겠다.
2) 구조체
제네릭 구조체의 경우도 struct 명령어 옆에 원래라면 데이터 타입이 나올자리를
1
2
3
4
5
6
7
8
9
10
struct Point<T> {
x: T,
y: T,
z: T
}
fn main() {
let integer = Point { x: 5, y: 10 , z: 30};
let float = Point { x: 1.0, y: 4.0 , z: 3.3};
}
3) 열거형
이전에 Option 형과 같은 경우는 이전 열거형 파트에서 설명했다.
1
2
3
4
enum Option<T> {
Some(T),
None,
}
꼭 데이터 타입이 한 개가 아니라도 아래와 같이 사용할 수 있다.
1
2
3
4
enum Result<T, E> {
Ok(T),
Err(E),
}
4) 메서드
구조체에 정의된 self를 포함한 함수인 메서드도 반호나값과 데이터 타입에 대해서 제네릭 타입을 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct Point<T> {
x: T,
y: T,
}
impl<T> Point<T> {
fn x(&self) -> &T {
&self.x
}
fn y(&self) -> &T {
&self.y
}
}
fn main() {
let p = Point { x: 5, y: 10 };
println!("p.x = {}", p.x());
println!("p.y = {}", p.y());
}
참고문헌
This post is licensed under CC BY 4.0 by the author.