> For the complete documentation index, see [llms.txt](https://seunghyun-kim-1.gitbook.io/my-knowledge-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://seunghyun-kim-1.gitbook.io/my-knowledge-library/jetbrains-academy/kotlin-basics/coffee-machine/brush-up-your-code/encapsulation.md).

# Encapsulation

### Encapsulation

캡슐화는 컴포넌트에 대한 직접적인 접근을 제한하면서 이와 함께 작동하는 메서드로 데이터를 번들링할 수 있습니다.

객체 지향 언어를 사용하여 프로그래밍 할 때 우리는 모든 변경사항을 제어합니다. 객체는 스스로 변하지 않습니다. 객체는 항상 변하기 위한 이유가 필요합니다.

객체의 내부 데이터에 직접 접근하는 것은 시간을 설정하는 시계를 움직이는 기어와 비슷하므로 조심하는 것이 좋습니다. 쉽게 망가질 수 있거든요! 하지만 우리는 시계의 내부 데이터에 접근하는 것이 아닌 제조업체가 설계한 시간 변경 손잡이를 사용할 수 있습니다. 따라서 어떤 물체가 동작하기 위한 내부 데이터는 사용자에게 숨기는 것이 좋습니다.

### Getters and Setters

프로그래머가 되는 것은 엔지니어가 되는 것과 같습니다. 아무도 변경할 수 없는 일부 데이터로 클래스를 만들 수 있으며 수정을 금지하는 안전한 방법도 제공할 수 있습니다. 외부에서 절대 바뀌면 안 되는 데이터들은 숨기거나 접근하지 못하게 합니다. 사용자가 위험하고 예측할 수 없는 작업을 못하게 하는 것이 좋습니다.

위에서 설명한 것을 쉽게하려면 많은 객체 지향 언어에서 일반적으로 쓰이는 방법인 데이터를 얻거나 데이터를 설정하는 메서드를 생성합니다. 해당 메서드는 **getter** 와 **setter** 로 알려져 있습니다. 아마도 우리는 여전히 객체를 임의로 바꿀 수 있기에 이건 불필요하다고 생각할텐데, 이는 틀렸습니다. Setter를 사용하여 객체를 변경할 행위자가 있어야 함을 선언할 수 있습니다. 게다가 `set()` 메서드로 새로운 데이터가 올바른지 검사할 수 있고, 데이터의 정확성을 보장합니다.

모든 언어가 setter 를 사용하는 것은 아닙니다. 그렇다면 객체를 변경하는 또다른 방법은 무엇일까요?

## Domain-specific methods

`Clock` 클래스를 작업한다 가정하겠습니다. 시간을 변경하기 위해서 사용자에게 제공할 수 있는 것은 무엇이 있을까요? `setTime()` 으로 시간을 설정할 수 있지만 더 자세하게 변경하려면 `addHour()`, `addMinute()`, `addSeconds()` 등의 메서드를 만들 수 있습니다.

사용자는 세부적으로 분과 초를 설정하지 않고 타임존을 변경하길 원할 수 있습니다. 해당 아이디어를 따른다면 `changeTimezone()` 을 만드는 솔루션을 제안할 수 있습니다.

이처럼 setter 를 사용하지 않고 데이터를 제어할 수 있습니다. 그렇다면 데이터를 보호하는 방법은 무엇일까요?

## Protecting data

데이터 보호 문제는 모든 프로그래밍 언어에 대한 보편적인 해결책이 없습니다. 하지만 그 중 일부는 클래스의 속성에 대한 접근을 제한하는 키워드를 제공합니다. 이를 제대로 하려면 해당 언어의 문서를 읽어봐야 합니다.

클래스의 필드에 대한 접근 속성을 키워드를 사용하여 설정할 수 있습니다. 다른 방법으로는 name conventions 을 사용할 수 있습니다. 예를 들어 소문자로 시작하는 모든 변수는 내부에서만 접근할 수 있다는 규칙을 설정할 수 있습니다.

> Public access 는 이름을 이용해 바로 접근할 수 있음을 의미합니다.

> 만약 필드를 read-only 로 설정하고 싶다면 getter 를 사용해야합니다.
