회고

20220630 TIL #객체에게 메시지를 보내자

paran21 2022. 7. 1. 01:00

넥스트스탭에서 <자바 플레이그라운드 with TDD, 클린코드> 과정을 수강하고 있는데, 최근에 굉장히 인상깊은 내용이 있었다.

 

객체를 가져와서 그 값을 처리하는게 아니라, 해당 객체에게 메시지를 보내라는 것이다.

 

예를 들어서, 이런 식으로 if문에 원하는 조건을 검증하기 위해 해당 객체의 값을 getter로 가져와서 비교하는 것이 아니라

for (int i = 0; i < QUANTITY_OF_BALL; i++) {
    if (Integer.parseInt(inputs[i]) == answer.getBalls().get(i)) {
        strikeCnt++;
        continue;
    }
    for (int j = 0; j < QUANTITY_OF_BALL; j++) {
        if (Integer.parseInt(inputs[i]) == answer.getBalls().get(j)) {
            ballCnt++;
        }
    }
}

 

이렇게 해당 객체에게 "isStrike? isBall?"과 같이 메시지를 보내라는 것이다.

public void changeBallCountByResult(MatchResult result) {
    if (result.isStrike()) {
        this.plusStrikeCount();
    }
    if (result.isBall()) {
        this.plusBallCount();
    }
}

 

숫자야구게임을 새로 구현하면서는 가급적 메시지를 보내는 방법으로 구현할 수 있도록 노력해보았다.

 

구현을 해보면서 느낀 점은 이렇게 하면 코드에서 어떤 걸 하고 싶은지 더 명확해지고 좀 더 추상화가 잘 이루어지는 것 같다.

 

우선 코드가 어떤 역할을 하는지 메소드 이름만으로 금방 알 수 있다.

equals를 통해서도 값이 같은지를 비교하려고 한다는 것을 알 수 있지만, 메서드를 쓰면 짧은 코드라도 더 직관적으로 이해할 수 있는 것 같다.

 

그리고 이 코드를 사용하는 곳에서는 그 과정이 구체적으로 어떻게 이루어지는지 알 필요가 없다.

단지 필요한 값을 얻거나 로직을 실행하면된다.

해당 객체(예시에서는 result)의 메서드를 통해 필요한 로직을 실행하기 때문에 구체적으로 그 객체 안에 어떤 데이터가 있는지 노출되지 않는다.

동어반복같지만, 이 메서드를 쓰는 곳에서는 사용하는 객체가 어떤 데이터를 가지고 있는지도 알 필요가 없다.

이런 과정을 통해 객체가 정말로 해야하는 역할을 하고 있고, 잘 분리되어 있다는 느낌을 받았다!

 

'객체'라는 개념에 대해 코딩을 처음 시작할때부터 많은 얘기를 들었지만,

왜 객체를 사용하는지에 대해서는 관련된 것들을 하나로 모은다는 것 외에 어떤 장점이 있는지 잘 이해하지 못했다.

 

이렇게 코드를 다시 구현해보니 왜 객체를 사용하는지에 대해 장점을 하나 알게 된 것 같다.

객체를 사용해 코드를 분리하기 때문에 수정을 할 때도 해당 로직을 구현한 부분이 주로 수정되니까 훨씬 유지보수하고 리펙토링하기 좋을 것 같다.

 

객체지향 프로그래밍의 이런 측면들은 자바뿐만 아니라 다른 언어를 사용할 때도 적용할 수 있을 것 같고, 언어나 프레임워크에 따라서 어떻게 구현할 수 있을지 궁금하다.

이런 방식으로 구현했을 때 다른 단점은 없는지, 다른 프로그래밍 패러다임(예를 들면 함수형!!)과는 어떤 차이가 나는지 더 공부하고 싶다.