
객체지향의 사실과 오해 라는 책을 읽으면서 이해한 것들을 내 말로 써보는 시리즈.
잘못된 내용이나, 자의적인 해석이 있을 수 있습니다.
이상한 부분 언제든지 피드백 주세요!
상태와 행위를 가지고, 다른 객체들과 메시지로 협력하는 녀석들
그렇다면 객체의 특징은?
객체는 상태를 가지며 상태는 변경 가능하다.
객체의 상태를 변경시키는 것은 객체의 행동이다.
행동의 결과는 상태에 의존적이며 상태를 이용해 서술할 수 있다.
행동의 순서가 실행 결과에 영향을 미친다.
객체는 어떤 상태에 있더라도 유일하게 식별 가능하다.
Property : 상태를 가지는 녀석. 예를 들어 "사람" 이라는 객체의 키, 위치 등 동적인(즉, 할당가능한) 값을 가진다
Property Value : 상태를 가지는 녀석의 "현재" 상태. 값으로 표현 가능하다 (Ex 키 == 130)
객체가 스스로의 상태를 표현(조회) 하거나,(==Query) 상태를 변경시키는(==Command) 것.
예를 들어보자. 이상한 나라의 앨리스에서는 앨리스가 소인국으로 가기 위해 "음료" 를 마신다.
따라서 앨리스 객체의 행동은
등으로 나타낼 수 있고, 이는 객체 스스로가 외부와 소통하는 양식(행동)이다.
행동을 우선하자. 왜냐?
아래는 객체 간의 메시지라는 측면과, 객체의 행동으로 상태를 바꾼다는 컨셉을 인지하고 의도적으로 작성한 코드이다.
public class Person {
// 상태들
private Integer height;
private String location;
public Person(Integer height, String location) {
this.height = height;
this.location = location;
}
// 행위
public Integer getHeight() {
return height;
}
public String getLocation() {
return location;
}
public int drinkBeverage(Beverage beverage){
this.height -= 20; // 임의상 20씩 작아진다고 가정
return beverage.getQuantity() - 20; // 남은 양 알려줄게!
}
public void passByDoor(boolean isPassable){
if (isPassable) {
this.location = "새로운 어딘가";
} else {
System.out.println("이곳엔 들어갈 수 없다.");
}
}
}
Alice 라는 객체는 Person 이라는 청사진으로 만들어진 녀석일것이다.
상태(height, Location)을 가진다.
행위는, 상태를 보여주는(Query) 게터 매서드들과
음료를 마시고, 마신 후의 음료 양을 음료에게 알리는 매서드
문을 지나갈 수 있는지 문에게 전달받은 후, 지나가거나 / 못가는 매서드.
public class Door {
private Integer height;
private boolean isOpen;
public Door(Integer height) {
this.height = height;
this.isOpen = false; // 기본적으로 닫혀 있고, 키가 적절하면 열어주자
}
public boolean isPassable(Integer passengerHeight){
return passengerHeight < height;
}
}
public class Beverage {
private Integer quantity;
public Beverage(Integer quantity) {
this.quantity = quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getQuantity() {
return quantity;
}
public void okSetQuantity(Integer drunken){
this.quantity = drunken;
}
}
기본적으로 자신의 양(상태)를 가지고 있다.
세터매서드를 통해서 상태를 변경 가능하다.(행위)
예제에서는 앨리스가 말한 남은 음료의 양을 신뢰하는 것으로 하자.
public static void main(String[] args) {
// 앨리스, 도어, 음료 객체 생성
Person alice = new Person(130, "처음 시작한 곳");
Door door = new Door(100);
Beverage beverage = new Beverage(200);
// 앨리스의 키 확인
int aliceHeight = alice.getHeight();
System.out.println("앨리스의 키: " + aliceHeight);
// 도어 판별
boolean canPass = door.isPassable(aliceHeight);
System.out.println("앨리스가 통과 가능한가? " + canPass);
// 도어 통과 여부에 따라 처리
alice.passByDoor(canPass);
// 음료 마시며 키 조절
System.out.println("음료의 처음 양: " + beverage.getQuantity());
while (alice.getHeight() > 100) {
int quantityOfDrunkenBeverage = alice.drinkBeverage(beverage);
beverage.adjustQuantity(quantityOfDrunkenBeverage);
}
System.out.println("음료의 최종 양: " + beverage.getQuantity());
System.out.println("앨리스의 최종 키: " + alice.getHeight());
// 문 통과
alice.passByDoor(door.isPassable(alice.getHeight()));
// 결과 출력
System.out.println("앨리스의 현재 위치: " + alice.getLocation());
}

도메인은 살찌우고, 서비스는 줄여야 한다는 말은 무엇일까 생각했다
객체의 행동 을 관리해서 객체 스스로의 상태에 대해서 최대한 객체 스스로가 관리하게 하여
외부 비즈니스 로직을 통해서 상태를 과도하게 비틀거나, 객체간의 결합도를 낮추라는 말이 아닐까 하는 생각을 하게 되었다.