private
앞선 문제를 근본적으로 해결하는 방법은 volume
필드를 Speaker
클래스 외부에서는 접근하지 못하게 막는 것이다.
private
으로 수정package access;
public class Speaker {
private int volume; // private 사용
...
}
private
접근 제어자는 모든 외부 호출을 막는다. 따라서 private
이 붙은 경우 해당 클래스 내부에서만 호출할 수 있다.
그림을 보면 volume
필드를 private
을 사용해서 Speaker
내부에 숨겼다.
외부에서 volume
필드에 직접 접근할 수 없게 막은 것이다. volume
필드는 이제 Speaker
내부에서만 접근할 수 있다.
// 필드에 직접 접근
System.out.println("volume 필드 직접 접근 수정");
speaker.volume = 200; // private 접근 오류
IDE에서 speaker.volume = 200
부분에 오류가 발생하는 것을 확인할 수 있다. 실행해보면 다음과 같은 컴파일 오류가 발생한다.
컴파일 오류 메시지
volume
필드는 private
으로 설정되어 있기 때문에 외부에서 접근할 수 없다는 오류이다.
// 필드에 직접 접근
System.out.println("volume 필드 직접 접근 수정");
// speaker.volume = 200; // private 접근 오류
speaker.showVolume();
이제 Speaker
외부에서 volume
필드에 직접 접근하는 것은 불가능하다. 이 경우 자바 컴파일러가 컴파일 오류를 발생시킨다.
참고 : 좋은 프로그램은 무한한 자유도가 주어지는 프로그램이 아니라 적절한 제약을 제공하는 프로그램이다.