객체는 상태와 행위를 가진다. 상태는 행위를 통해서만 변경한다.
객체 지향 프로그래밍(OOP)에서 중요한 원칙 중 하나는 객체의 상태(State)를 행위(Behavior)를 통해서만 변경하는 것입니다. 이 원칙을 따르면 코드의 유지보수성과 가독성이 향상되며, 버그 발생 가능성이 줄어듭니다. 이 글에서는 이러한 원칙을 실제 코드 예시와 함께 살펴보겠습니다.
객체의 상태와 행위
객체는 상태와 행위를 가지고 있습니다. 상태는 객체가 가지고 있는 데이터(필드, 멤버 변수)를 의미하며, 행위는 이 상태를 변경하거나 활용하는 메서드를 의미합니다. 좋은 객체 지향 코드에서는 객체의 상태를 직접 변경하지 않고, 행위를 통해 상태를 변경하는 것이 일반적인 관습입니다.
예시 코드
아래 예시 코드는
앨리스
라는 클래스를 사용하여 객체의 상태를 변경하는 방법을 보여줍니다.package ex00;
class 앨리스 {
private int 목마름;
public 앨리스(int 목마름) {
this.목마름 = 목마름;
}
void 물마시기() {
목마름 = 0;
}
public int get목마름() {
return 목마름;
}
}
public class Mem01 {
public static void main(String[] args) {
앨리스 e = new 앨리스(100);
// e.목마름 = 0; X
// 1. 값 변경
e.물마시기();
// 2. 값 확인
System.out.println(e.get목마름());
;
}
}
위 코드에서
앨리스
객체는 목마름
이라는 상태를 가지고 있습니다. main
메서드에서 e.목마름 = 0;
와 같이 상태를 직접적으로 변경하는 것은 좋지 않은 방식입니다. 대신, 물마시기()
라는 메서드를 호출하여 간접적으로 상태를 변경해야 합니다.왜 직접적인 상태 변경이 좋지 않은가?
- 캡슐화 원칙 위반: 객체의 상태를 외부에서 직접 변경하는 것은 객체의 캡슐화를 위반하는 행위입니다. 캡슐화는 객체 지향 프로그래밍에서 중요한 원칙으로, 객체의 내부 상태를 숨기고, 외부에는 필요한 메서드만 제공하는 것을 의미합니다. 이는 객체의 무결성을 유지하고, 외부 코드가 객체의 내부 구조에 의존하지 않도록 합니다.
- 유지보수성 향상: 상태를 변경하는 메서드를 통해서만 객체의 상태를 관리하면, 코드의 수정 및 유지보수가 쉬워집니다. 메서드 내에서 상태 변경을 제어하기 때문에, 이후에 변경 사항이 생기더라도 메서드만 수정하면 됩니다. 만약 상태를 직접 변경하는 코드가 여기저기 흩어져 있다면, 모든 코드를 일일이 찾아 수정해야 하는 번거로움이 생길 수 있습니다.
- 버그 예방: 상태를 직접 변경하는 경우, 잘못된 값이 들어가거나, 비정상적인 상태가 될 가능성이 높습니다. 메서드를 통해 상태를 변경하면, 메서드 내에서 적절한 검증과 처리를 할 수 있으므로 이러한 위험을 줄일 수 있습니다.
Share article