Enum



enum 정의


enum IpaddrKind {
V4,
V6
}


enum 타입은 같은 타입에 속한 필드는 모두 같은 enum 타입으로 봄. 때문에 아래와 같이 IpAddrKind 타입의 파라미터를 받는 함수에 V4, V6 모두 사용 가능.


enum IpAddrKind {
V4,
V6
}

fn main() {
let four = IpAddrKind::V4;
let six = IpAddrKind::V6;

route(four);
route(six);
}

fn route(ip_type: IpAddrKind) {
// do something..
}


아래와 같이 값을 지정할 수도 있음. 보다시피 타입은 자유롭게 지정 가능. 이렇게 값을 지정할 경우, 값은 필수가 됨.


enum IpAddrKind {
V4(u8, u8, u8, u8),
V6(String)
}

let four = IpAddrKind::V4(127, 0, 0, 1);
let six = IpAddrKind::V6(String::from("::1"));


구조체를 값으로 지정할 수도 있음. 이 방법으로 여러 값과 다양한 형태를 정의할 수 있음.


struct Ipv4Addr {

}

struct Ipv6Addr {

}

enum IpAddrKind {
V4(Ipv4Addr),
V6(Ipv6Addr)
}


아래는 enum 을 정의하는 다양한 방법.


enum Message {
Quit,
Move {x: i32, y:i32},
Write(String),
ChangeColor(i32, i32, i32),
}


  • Quit: 아무 데이터도 없는 형태.
  • Move: 익명 구조체 형태.
  • Write: String 타입의 값을 가지는 형태.
  • ChangeColor: i32 타입의 값 3개를 가지는 형태.

각각 아래와 같이 선언. 각 변수는 모두 Message 타입이 됨.

let message_quit = Message::Quit;
let message_move = Message::Move{x: 30, y: 108};
let message_write = Message::Write(String::from("hello"));
let message_cc = Message::ChangeColor(253, 253, 253);

이런 enum 의 형태는 구조체로 치면 아래와 같음. 

struct QuitMessage;
struct MoveMessage {
x: i32,
y: i32,
}
struct WriteMessage(String);
struct ChangeColorMessage(i32, i32, i32);

그리고 구조체와 같은 방식으로 메서드를 정의할 수 있음.

impl Message {
fn call(&self) {
// do something..
}
}

let m = Message::Write(String::from("hello"));
m.call();



'Rust' 카테고리의 다른 글

Enum(match)  (0) 2018.02.21
Enum(Option<T>)  (0) 2018.02.21
구조체(메서드)  (0) 2018.02.20
구조체(활용)  (0) 2018.02.20
구조체(기본)  (0) 2018.02.19

+ Recent posts