접근 제어자는 클래스, 필드, 메서드, 생성자 등에 접근할 수 있는 범위를 제한하는 기능입니다.
Java에는 public, protected, package-private, private가 있습니다. public은 모든 곳에서 접근할 수 있고, protected는 같은 패키지와 상속 관계의 하위 클래스에서 접근할 수 있습니다. 접근 제어자를 생략한 package-private은 같은 패키지에서만 접근할 수 있고, private은 해당 클래스 내부에서만 접근할 수 있습니다.
접근 제어자를 사용하는 가장 큰 이유는 캡슐화를 지키기 위해서입니다. 외부에 필요한 기능만 공개하고 내부 구현이나 상태는 숨김으로써 객체가 잘못된 방식으로 사용되는 것을 방지할 수 있습니다.
예를 들어 필드를 private으로 선언하고 검증 로직이 포함된 메서드를 통해서만 값을 변경하도록 하면, 객체의 상태를 일관되게 유지할 수 있습니다. 또한 외부 코드가 내부 구현에 직접 의존하지 않기 때문에 구현을 변경했을 때 발생하는 영향도 줄일 수 있습니다.