객체를 바라볼 때 2가지 중 하나를 취할 수 있다.
외부적인 관점에서 object는 서비스를 제공하는 캡슐화된 엔티티라고 볼 수 있다. 이 서비스들은 객체의 interface다.
한 객체(client)는 해당 객체의 서비스에서 다른 객체를 사용(요청)할 수도 있다.
객체의 client는 메서드를 요청하지만 그 서비스가 어떻게 돌아가는지 알 필요가 없다.
객체에 대한 변경(변수 같은)은 그 객체의 메서드에 의해 이루어져야 한다. 즉, client가 다른 객체에 직접적으로 액세스하여 변수들을 변경하는 것을 최대한 어렵도록 설계해야 한다.
캡슐화된 object는 client로부터 내부 작동이 숨겨진 일종의 블랙박스로 생각해보자.
자바는 visibility modifier를 이용해 캡슐화한다. modifier는 메서드, 데이터의 특성을 지정하는 java reserved word다. 상수를 정의할 때는 final
이란 modifier를 사용하는 것처럼.
자바는 3가지의 visibility modifier를 갖는다.
public
, protected
, private
아무런 수정자를 적지 않으면 default
가 될 것이다.
visibility modifier는 클래스 선언 시의 top level, 메서드나 변수(필드) 선언 시의 member level 2가지로 나뉜다.
자바는 클래스, 변수, 메서드, 생성자에 대한 액세스 레벨을 설정하기 위한 4가지의 access modifier를 제공한다.
public은 client가 값을 직접 수정할 수 있는 경우가 된다. 따라서 인스턴스 변수는 private으로 선언하는게 권장된다. public constance는 client가 액세스할 수 있지만 값 변경이 불가능하기에 캡슐화에 위배되지 않는다.
객체의 서비스를 제공하는 메서드의 경우는 client가 액세스하고 호출할 수 있어야 하기 때문에 public으로 선언한다. 따라서, public method를 service method라고 부르기도 한다.
여기서 객체의 서비스 메서드를 지원하기 위한 메서드를 support method라고 하는데 이 경우 public 대신 private 선언을 한다.
변수의 경우는 캡슐화 위배 때문에 private으로만 선언을 한다. 메서드의 경우 앞서 말한 것처럼 service와 support case를 나눠 선언하도록 해야 한다.
클래스, 변수, 메서드에 visibility modifier를 적용한 코드 예시다.
Test 클래스를 보면 필드 선언 시 private으로 하여 client(여기서는 ClassExample 클래스)가 Test 클래스의 필드를 직접 변경할 수 없도록 헀다.
Test 클래스의 메서드 getData(), add()는 서비스 메서드이기 때문에 public으로 선언했다.
main 메서드를 구성하고 있는 클래스(ClassExample)은 반드시 public으로 선언해야 한다.