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

realjays

반박시 당신말이 맞습니다.