1. 간결한 API의 필요성
- 학습과 유지보수의 용이성
- 작고 명확한 인터페이스를 두면 이해하기 쉽고, 수정 시에도 고려해야 할 범위가 줄어듦.
- 유지보수 리스크 감소
- 노출되는 요소가 적을수록 변경에 따른 파급 효과가 줄어듦.
2. 변경 시 고려 사항
- 공개된 API는 외부 코드에서 사용 중
- 공개 범위를 줄이는 것이 늦어지면, 이미 배포된 라이브러리에 의존하는 사용자들이 큰 영향을 받을 수 있음.
- 외부 노출은 신중하게
- 한 번 공개된 요소를 숨기는 것은 어려움. 대체재와 호환성을 제공해야 하며, 이는 많은 비용이 들 수 있음.
3. 클래스 상태 보호와 캡슐화
-
프로퍼티 접근 제어
-
setter를 private으로 두는 등의 접근 제한을 통해 클래스의 불변성(invariant)과 내부 로직을 보호.
예) CounterSet에서 elementsAdded의 세터를 private으로 지정해 외부에서 임의로 수정되지 않도록 함.
-
서로 의존하는 상태 보호
예) mutableLazy 구현 시 initialized를 외부에 노출하지 않아야 예외 상황(잘못된 순서의 값 설정)을 방지할 수 있음.
4. 동시성(concurrency)에서의 중요성
- 상태 변경은 병렬 프로그래밍 시 문제 발생 가능
- 노출된 상태가 많을수록 경쟁 상태(race condition) 등이 발생할 여지가 커짐.
- 가시성을 제한하면 변경 지점을 줄여 동시성 문제 예방에 유리함.
5. 가시성 한정자(visibility modifier) 활용