7. 값의 변경에 따른 부작용
setter, getter를 알게된 미키마우스는 자신의 클래스의 모든 필드에 편집기를 통해 단축키를 써가면서 한 번에 setter, getter를 추가했음
public class Mouse {
private int age;
private String color;
private String name;
// ..그 외 다른 필드들
Mouse(int age, String color, String name) {
this.age = age;
this.color = color;
this.name = name;
}
public setAge(int age) {
this.age = age;
}
public getAge() {
return age;
}
public setColor(String color) {
this.color = color;
}
public getName() {
return name;
}
public setName(String name) {
this.name = name;
}
public getName() {
return name;
}
// ...
}public class Main {
public static void main(String[] args) {
Mouse mickey = new Mouse("black"); // 미키마우스 생성
// 토토로가 몰래 작성한 코드
mickey.setColor("white"); // 화이트 마우스
}
}
객체 지향 프로그래밍에서 객체의 데이터(멤버 필드, 속성)는 객체 외부에서 직접적으로 접근하지 못하도록 범위를 줄이는 것이 권장됨
→ 값의 무분별하거나 예측하지 못한 변경이 프로그램의 동작 및 실행 과정에 영향을 미칠 수 있기 때문
위의 예시처럼 Mouse 관리 서비스가 운영되고 있다고 가정할 때,
미키마우스의 색은 검은색인데, 외부 어딘가에서 임의로 값을 white로 바꿔버리면 미키마우스의 시그니처인 검은색이 하얀색이 되어버릴 수 있음
1. 색을 빼앗긴 미키마우스의 대처 방법
방법 1. 불필요한 메서드 제거
첫 번째 방법은 무분별하게 생성한 불필요한 메서드들을 제거하는 것으로,
속성(필드)는 외부에서 직접 접근할 수 없도록 여전히 접근을 private 키워드로 제한하되,
private String color;해당 값이 정말 변경이 필요할 값인지 먼저 고민 후,
객체를 생성한 이후 값의 변경이 발생할 수 있는 경우가 한 번이라도 필요할 경우,
해당 필드에만 setter()를 공개하여 작성하는 것이 무분별한 값의 변경을 최소화하는 방향에 더 가까워짐
// setColor(String color); // 검은색은 미키마우스의 시그니처 컬러
setAge(int age); // 나이는 매년 정기적으로 변경되어야함또한 color는 절대 변경될 수 없는 값이라면,
final키워드를 활용하여 해당 필드를 불변(Immutable) 속성으로 작성할 수도 있음
private final String COLOR = "black"; // final을 통해 COLOR는 상수 필드가 됨방법 2. 메서드 내 별도의 조건식 추가
두 번째 방법은, setter() 메서드 내에 조건식을 추가하여
파라미터로 전달된 값이 유효한지 검증하는 방법이 있음
setter() 내부에 조건식을 통한 검증 로직 추가
public void setColor(String color) {
if (Objects.equals(color, "white")) {
return; // 하얀색으로 변경할 수 없도록 차단
} else { // 하얀색이 아닌 경우에는 변경 가능
this.color = color;
}
}public class Main {
public static void main(String[] args) {
Mouse mickey = new Mouse("black");
mickey.setColor("blue"); // 파란색으로 변경
System.out.println(mickey.getColor()); // 파란색
}
}JavaBeans Pattern
setter, getter 를 활용하여 필드값을 초기화, 접근하기 위해 사용되는 방식을 가리키는 패턴