지난번 정리 했었던 접근 제어자(Access Modifier)에 대해 추가적으로 더 정리해보려고 한다.
코드를 작성할 때, 다른 누군가가 쓰게 할 클래스는 구성요소 중 일부만 밖으로 공개할 수 있도록 할 수 있다. 그러한 이유는 사용 중 오용이나 혼란을 방지하기 위해서이다. 이를 캡슐화(encapsulation)이라고도 한다.
지난 편에서도 언급했듯이 접근 지정자는 상황에 따라 아래와 같이 사용할 수 있다.
이와 같이 클래스의 특정 요소를 감추는 이유는 몇 가지가 있는데, 아래와 같다.
- 정보의 은닉이라고 하지만, 이는 사실상 특정 요소를 '감추는 것'이 아니라 작성자의 의도대로 사용하도록 하기 위함이라고 볼 수 있다.
- 쓰라고 의도한 기능만 공개(IDE의 자동완성 등)하여 혼란을 방지
(내부적으로 수많은 필드들이 사용된다면? 제한이 오히려 편의를 제공한다.)- 필드에 부적절한 값이 적용되는 등의 오용 방지
- 다른 클래스와 복합적으로 사용될 경우 혼선 방지(ex 스마트폰 - PC 연결은 USB 케이블로만)
- 기타 다양한 이유..
Getter와 Setter의 사용 :
객체지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다. 그 이유는 객체 데이터를 외부에서 마음대로 읽고 변경할 경우, 객체의 무결성이 깨질 수 있기 때문이다. 이를 위해 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다. 이처럼 데이터를 변경하는 메소드가 Getter와 Setter가 하는 역할이다.
데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도한다. (이는 메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문!)
이러한 역할을 하는 메소드는 바로 Setter이다.
ex) 자동차 속도를 setSpeed()메소드로 변경할 경우, 아래와 같이 코드를 작성할 수 있다.
void setSpeed(double speed) {
if(speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다. 이런 경우, 메소드로 필드값을 가공 후에 외부로 전달할 수 있다.
이러한 역할을 하는 메소드는 Getter이다.
ex) 자동차 속도를 mile에서 km단위로 환산해서 외부로 리턴하는 getSpeed()
double getSpeed() {
double km = speed *1.6; //필드 값인 mile(speed)을 km단위로 환산 후 외부로 리턴
return km;
}
클래스를 선언할 때 가능하다면 필드를 private으로 선언해 외부로부터 보호하고 필드에 대한 Setter/Getter메소드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋다.
to be continued..