[Rust] 구조체와 메소드
rust의 구조체 자체는 C의 구조체와 다를 것이 없다.
메소드도 못넣고 그냥 멤버들만 주르륵 나열해놓을 수만 있다.
이렇게.
초기화하고 나서도 구조체의 멤버들에게 자유롭게 접근할 수도 있고. 진짜 별거 없다.
하지만 이것만으로는 객체지향적인, 생산성 있는 코딩이 당연히 불가능하다.
이래서야 C보다 나을 게 뭔가.
Rust에서는 메서드 구현부가 따로 존재한다. 키워드는 implements의 약자인 impl이다.
Rust에는 생성자가 존재하지 않아서, 정적으로 사용할 수 있는 메서드를 응용해서 new처럼 저런 식으로 초기화를 한다. 앞서 몇번 썼던 String::from이나 Box::new도 저런 식으로 되어있다.
그리고 print_all이 진짜 메소드다. self는 구현하는 대상을 가리킨다. 무조건 파라미터 첫째자리에 와야 하고, 값으로 받을지, 참조로 받을지, 변경가능한 참조로 받을지 선택할 수 있다. 그냥 약속일 뿐이니 실제로 호출할 때는 신경쓰지 않아도 된다.
위처럼 &self로 받으면 변경 불가능한 참조라 요소의 값을 변경할 수가 없다.
메소드에서 구조체의 값을 바꾸고 싶으면 &mut self,...로 써주면 된다.
값으로 복사하려면 그냥 self만 쓰면 되는데 복사란 것이 원래 비효율적인 작업이 될 수 있다보니 보통 i32같은 가벼운 기본 타입들만 값으로 받아놓고 대부분은 참조로 받는다.
그리고 impl 구현은 여러번에 걸쳐서 할 수도 있다. 이제까지 나불거린 것들을 코드에 정리해보면 이렇게 되겠다.
구조체와 메서드를 사용하는 방법은 일단 이게 다다.
trait라고 인터페이스 비슷한게 있긴 한데, 그건 나중에 다루고.
아마 객체 개념을 좀 다뤄본 사람들이라면 멤버에 대한 접근제어자가 없다는 것에 의문을 품을 것이다.
하지만 Rust는 멤버 단위가 아니라 일종의 이름공간 단위로 접근제어를 걸어놓으므로...
이름공간과 함께 설명하도록 하겠다.