Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

가시성(Visibility)

코드를 여러 모듈로 나누어 관리하기 시작하면, 자연스럽게 **가시성(Visibility)**이라는 개념을 고민하게 됩니다. 가시성이란 구조체, 함수, 필드 같은 요소들에 누가, 어디까지 접근할 수 있는지를 결정하는 규칙입니다.

기본 설정은 ‘비공개(Private)’

Rust에서는 기본적으로 모든 것이 비공개(Private) 상태입니다. 비공개 상태인 요소들은 오직 다음 범위에서만 접근할 수 있습니다:

  1. 해당 요소가 정의된 모듈 내부
  2. 해당 모듈의 하위 모듈들

우리는 이미 이전 연습 문제들을 통해 이 규칙을 경험해 보았습니다.

  • create_todo_ticket 함수가 작동했던 이유는, 이 함수가 포함된 helpers 모듈이 Ticket이 정의된 크레이트 루트의 하위 모듈이었기 때문입니다. 그래서 Ticket이 비공개였음에도 불구하고 문제없이 접근할 수 있었던 거죠.
  • 마찬가지로 단위 테스트들도 보통 테스트하려는 코드의 하위 모듈로 정의되기 때문에, 제약 없이 모든 요소에 접근할 수 있습니다.

가시성 한정자(Visibility Modifier)

**가시성 한정자(Visibility Modifier)**를 사용하면 이러한 기본 비공개 설정을 바꿀 수 있습니다. 자주 쓰이는 한정자들은 다음과 같습니다:

  • pub: 해당 요소를 **공개(Public)**로 설정합니다. 모듈 밖은 물론, 다른 크레이트에서도 접근할 수 있게 됩니다.
  • pub(crate): 같은 크레이트 안에서는 자유롭게 접근할 수 있지만, 크레이트 밖으로는 노출하지 않습니다.
  • pub(super): 부모 모듈 안에서만 접근할 수 있도록 공개 범위를 제한합니다.
  • pub(in path::to::module): 지정한 특정 모듈 내부에서만 접근할 수 있게 합니다.

이 한정자들은 모듈, 구조체, 함수, 필드 등 어디에나 붙일 수 있습니다. 예를 하나 볼까요?

pub struct Configuration {
    pub(crate) version: u32,
    active: bool,
}

여기서 Configuration 구조체 자체는 공개(pub)입니다. 하지만 version 필드는 같은 크레이트 안에서만 볼 수 있고(pub(crate)), active 필드는 한정자가 없으므로 비공개입니다. 따라서 active 필드는 이 구조체가 정의된 모듈 혹은 그 하위 모듈 안에서만 접근할 수 있습니다.

Exercise

The exercise for this section is located in 03_ticket_v1/04_visibility