Skip to Content
Suffering builds character
아카이브10.Java특징캡슐화7. 값의 변경에 따른 부작용

7. 값의 변경에 따른 부작용

setter, getter를 알게된 미키마우스는 자신의 클래스의 모든 필드에 편집기를 통해 단축키를 써가면서 한 번에 setter, getter를 추가했음

Mouse.java
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; } // ... }
Main.java
public class Main { public static void main(String[] args) { Mouse mickey = new Mouse("black"); // 미키마우스 생성 // 토토로가 몰래 작성한 코드 mickey.setColor("white"); // 화이트 마우스 } }

mickey

객체 지향 프로그래밍에서 객체의 데이터(멤버 필드, 속성)는 객체 외부에서 직접적으로 접근하지 못하도록 범위를 줄이는 것이 권장됨
→ 값의 무분별하거나 예측하지 못한 변경이 프로그램의 동작 및 실행 과정에 영향을 미칠 수 있기 때문

위의 예시처럼 Mouse 관리 서비스가 운영되고 있다고 가정할 때,

미키마우스의 색은 검은색인데, 외부 어딘가에서 임의로 값을 white로 바꿔버리면 미키마우스의 시그니처인 검은색이 하얀색이 되어버릴 수 있음

1. 색을 빼앗긴 미키마우스의 대처 방법

방법 1. 불필요한 메서드 제거

첫 번째 방법은 무분별하게 생성한 불필요한 메서드들을 제거하는 것으로,

속성(필드)는 외부에서 직접 접근할 수 없도록 여전히 접근을 private 키워드로 제한하되,

Mouse.java
private String color;

해당 값이 정말 변경이 필요할 값인지 먼저 고민 후,

객체를 생성한 이후 값의 변경이 발생할 수 있는 경우가 한 번이라도 필요할 경우,
해당 필드에만 setter()를 공개하여 작성하는 것이 무분별한 값의 변경을 최소화하는 방향에 더 가까워짐

Mouse.java
// setColor(String color); // 검은색은 미키마우스의 시그니처 컬러 setAge(int age); // 나이는 매년 정기적으로 변경되어야함

또한 color는 절대 변경될 수 없는 값이라면,
final키워드를 활용하여 해당 필드를 불변(Immutable) 속성으로 작성할 수도 있음

Mouse.java
private final String COLOR = "black"; // final을 통해 COLOR는 상수 필드가 됨

방법 2. 메서드 내 별도의 조건식 추가

두 번째 방법은, setter() 메서드 내에 조건식을 추가하여 파라미터로 전달된 값이 유효한지 검증하는 방법이 있음

setter() 내부에 조건식을 통한 검증 로직 추가

Mouse.java
public void setColor(String color) { if (Objects.equals(color, "white")) { return; // 하얀색으로 변경할 수 없도록 차단 } else { // 하얀색이 아닌 경우에는 변경 가능 this.color = color; } }
Main.java
public class Main { public static void main(String[] args) { Mouse mickey = new Mouse("black"); mickey.setColor("blue"); // 파란색으로 변경 System.out.println(mickey.getColor()); // 파란색 } }
💡
Tip

JavaBeans Pattern
setter, getter 를 활용하여 필드값을 초기화, 접근하기 위해 사용되는 방식을 가리키는 패턴

Last updated on