구조체 가시성
구조체는 필드에 대해 추가적인 수준의 가시성을 가집니다. 가시성은 기본적으로 비공개이며, pub 수식어로 재정의할 수 있습니다. 이 가시성은 구조체가 정의된 모듈 외부에서 접근할 때만 의미가 있으며, 정보를 숨기는 것(캡슐화)이 목적입니다.
mod my {
// 제네릭 타입 `T`의 공개 필드를 가진 공개 구조체
pub struct OpenBox<T> {
pub contents: T,
}
// 제네릭 타입 `T`의 비공개 필드를 가진 공개 구조체
pub struct ClosedBox<T> {
contents: T,
}
impl<T> ClosedBox<T> {
// 공개 생성자 메서드
pub fn new(contents: T) -> ClosedBox<T> {
ClosedBox {
contents: contents,
}
}
}
}
fn main() {
// 공개 필드를 가진 공개 구조체는 평소처럼 생성할 수 있습니다
let open_box = my::OpenBox { contents: "공개 정보" };
// 그리고 그 필드들에 정상적으로 접근할 수 있습니다.
println!("열린 박스 내용물: {}", open_box.contents);
// 비공개 필드를 가진 공개 구조체는 필드 이름을 사용하여 생성할 수 없습니다.
// 에러! `ClosedBox`에 비공개 필드가 있습니다
// let closed_box = my::ClosedBox { contents: "classified information" };
// TODO ^ 이 줄의 주석을 해제해 보세요
// 하지만 비공개 필드를 가진 구조체는 공개 생성자를 통해 생성할 수 있습니다
let _closed_box = my::ClosedBox::new("기밀 정보");
// 그리고 공개 구조체의 비공개 필드에는 접근할 수 없습니다.
// 에러! `contents` 필드는 비공개입니다
// println!("닫힌 박스 내용물: {}", _closed_box.contents);
// TODO ^ 이 줄의 주석을 해제해 보세요
}