Structure
기본 Structure
구조체는 다음과 같이 사용한다.
struct User {
name: String,
memberNumber: u32,
active: bool,
}
struct 키워드를 사용하며 {}안에 field 명과 각 field의 data type을 정의한다.
위와 같이 생성한 structurer는 다음과 같이 변수에 할당할 수 있다.
fn main() {
let user = {
name: String::from("jays"),
memberNumber: 10,
active: true
};
}
이렇게 할당된 structure의 field의 값을 가져오기 위해서는 다음과 같이 ‘.’을 이용해서 가져올 수 있다. 그리고 field가 mutable일때는 ‘.’을 이용하여 해당 field의 값을 바꿀 수 있다.
...
println!("user name is {}", user.name);
// user.name = String::from("anotherName");
...
Structure 변수를 생성할때는 다음과 같이 코드양의 줄여서 간편히 생성할 수 있다.
fn usernena(name, memberNumber) {
User {
name,
memberNumber,
active: false
}
}
fn main() {
let name = String::from("myname");
let memberNumber = 1;
let user1 = usernena(name, memberNumber);
let user2 = User {
name: String::from("another"),
..user1
}
}
field명에 해당하는 변수가 있을 경우 ‘fieldName: variableName’하지 않고 fieldName만 써주어도 변수 값을 할당할 수 있다.
그리고 같은 Structure의 값을 재사용할때, ‘..StructureVairable’을 통해 변화하지 않는 필드들의 값을 짧은 코드로 할당할 수 있다.
Tuple Structure
Tuple 형태의 Structure도 만들 수 있다.
struct GPS(f64, f64);
let mypoint = GPS(120.34121, 131.12121);
명명이 가능한 tuple 정도라고 생각하면 이해가 쉽다.
Structure field Ownership
Structure의 field에 대한 ownership은 보통 해당 Structure 변수가 갖는다.
하지만 field에 대해서도 borrowing처리를 할 수 있는데, 이떄는 lifetime을 명시해주어야 한다고 한다. 아직까지는 이 부분은 학습하지 않고 이런 것이 있다 정도만 알고 넘어간다.
Structure 출력
Structure 변수를 println! 매크로를 이용하여 출력하려고 하면 에러를 만난다.
이럴 경우 #[derive(Debug)] 를 Structure 상단에 선언해주고 println! 매크로에서는 기존의 {} 대신에 {:?}를 이용하여 출력한다.
{:#?}를 사용하면 pretty print가 된다.
예제로는 다음과 같다.
struct Rectangle {
width: u32,
lenght: u32
}
fn main() {
let rect = Rectangle {
width: 30,
length: 20
};
println!("Rectangle is {:?}", rect);
}
Structure method
Structure method는 함수와 유사하다. 다만 다른점은 해당 method의 첫번째 파라미터는 항상 self이며 이는 호출되고 있는 Structure의 instance를 의미한다.
method는 impl keyword를 이용하여 정의할 수 있다.
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.length
}
}
위에서 self는 borrowing인데, 예제와 달리 ownership을 아예 가져올 수도 있다.
Associated Function(연관 함수)
이 부분은 기존 다른 랭귀지의 Class에서 보던 static이라고 생각하면 쉽다.
Associated Function은 self 파라미터를 갖지 않는다.
그리고 역시 impl 안에 정의한다. (method가 아닌 function으로 부른다.)
impl Rectangle {
fn square(size: u32) -> Rectangle {
Rectangle {
width: size,
length: size
}
}
}
위에서 본것처럼 주로 생성자 용도로 사용된다.
호출은 Structure::AssociatedFunction 의 문법을 사용한다.
이미 여러번 본 String::from(“hello”); 가 바로 이 문법의 예제이다.
References
- https://rinthel.github.io/rust-lang-book-ko/ch05-01-defining-structs.html
- https://doc.rust-lang.org/book/ch05-03-method-syntax.html