접근제어자 이해
- 접근제어자를 사용하면 외부에서 필드 메서드에 접근할 수 있다.
- 객체의 필드를 외부 에서 접근하지 못하도록 막는것이다.
- private는 모든 외부 호출을 막는다. private가 붙은경우 내부에서만 접근이 가능하다.
- 좋은 프로그램은 무한한 자유를 제공하는것보다 적절한 제약을 제공하는것이 좋은 프로그램이다.
- 접근제어자가 없으면 외부에서 스피커 객체의 내부 필드를 건들여서 100이상 넘어가면 동작이 안되는 볼륨 필드를 직접 접근하여 200으로 설정하여 스피커 객체는 폭발하게 되었다. 그렇기에 외부에서 접근을 못하도록 볼륨필드에 private를 설정하여 외부에서 접근을 하지 못하도록 막는다면 외부에서 접근했을 때 아예 컴파일 오류가 생긴다.
접근제어자의 종류
private : 모든 외부 호출을 막는다.
default(package-private) 같은 패키지 에서 호출은 허용한다.
protected : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
public : 모든 외부 호출을 허용한다.
- private가 가장 많이 차단하며 public이 가장 많이 허용한다
- 접근 제어자의 핵심은 기능을 외부로 부터 숨기는 것이다.
- 지역 변수에서는 private를 사용할 수 없다.
`
접근 제어자 사용 필드 메서드
- 생성자도 접근 제어자 관섬에서는 메서드와 같다.
접근 제어자 클래스 레벨
- 클래스 레벨의 접근제어자는 public default 두개만 사용하며 그 외는 사용할 수 없는게 규칙이다.
- public클래스는 파일명과 클래스 이름이 같아야 하는것이 자바 규칙이다.
- 하나의 자바 파일에는 하나의 public만 존재한다.
- 자바파일 안에는 default클래스는 무한하게 만들 수 있다.
캡슐화
- 캡슐화를 통해 데이터의 직접적인 변경을 막을 수 있다.
- 캡슐화를 안전하게 완성시켜주는 장치가 접근제어자이다.
데이터 숨겨라
- 캡슐화에서 필수로 숨겨야하는 부분은 속성인 필드이다.
- 캡슐화를 하였지만 외부에서 갑자기 내부속성을 건들면 캡슐화가 깨져버린다.
- 자동차가 있는데 사용자가 계기판의 숫자를 직접 제어하지 않는다. 하지만 사용자는 엑셀이라는 메소드를 이용하여 계기판의 숫자를 조절할 수 있다.
- 사용자는 단지 자동차의 기능을 사용할 뿐이다.
- 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서만 접근해야한다.
- 특별한 일이 없을경우 데이터는 private로 막는다. 기능들만 열어 기능을 통하여 내부를 통제한다.
기능도 숨겨라
- 가급적 필요한 기능만 오픈한다.
- 외부에서 사용하지 않는 내부 기능은 다 숨겨야 한다.
- 예를들어 배기조절 같은 기능은 외부로 오픈할 필요가 없다.
- 기능이 많더라도 사용자에게 필요한 기능만 오픈한다.
- 데이터는 다 숨기고 필요한 기능만 오픈하는것이 좋은 캡슐화이다.
캡슐화를 시키지 않았을 경우
- 외부에 노출해도 되지 않을 메소드를 public으로 설정하였으 때 그 객체를 사용하는 다른 개발자가 하나가 더 늘은 메소드를 보고 이 메소드를 사용해야할지 말지 고민을 하게 되는 혼란을 가져다 줄 수 있다. 그렇기에 반드시 외부에 노출시키지 않고 내부에서만 처리해야할 로직이 들어있는 메소드는 클래스 내부에서만 동작할 수 있도록 캡슐화를 할 수 있도록 한다.
- balance필드를 private가 아닌 public으로 노출시킬 경우 검증을 거치지 않고 바로 값이 들어갈 수 있으며 들어갈 수 없는 값이 들어갈 수 있기 때문에 위험해질 수 있다. 그렇기에 꼭 private로 설정하여 외부에서 접근을 할 수 없게 만들어야 한다.
추가내용
- 본인의 데이터(클래스 필드 내부 데이터)끼리 계산되는 값이라면 public으로 설정한 메소드를 만들어 클래스 내부에서 계산되도록 하고 메소드만 제공해준다.
- 수정사항이 생기더라도 본인만 바꾸면 전체의 메소드를 바꿀 수 있기 때문이다.