자바, 객체야~ 일해라!

2023. 2. 27. 15:27자바

728x90
반응형

우아한테크코스의 프리코스부터 레벨 1을 진행하는 지금까지 배운 것 중에 가장 인상 깊은 내용이 무엇인가?하고 물어보면 나는 곧바로 “객체가 일하도록 해라!”라는 내용을 말할 것이다.

 


‘객체는 객체스럽게 사용한다.’

우아한테크코스 프리코스 기간 중에 받았던 피드백 중에는 다음과 같은 내용이 있었다.

이는 무분별한 getter 사용을 자제하고 객체가 스스로 일하게끔 하라는 의미였다.

이를테면 다음과 같은 코드가 있다고 가정해보자.

 

(Line 클래스는 생략…)

사다리 게임을 진행하는 코드의 예시이다.

 

플레이어는 위치에 대한 정보를 가지고 있고, 플레이어의 위치를 line에 전달했을 때

사다리가 어디로 연결되어있는지 확인할 수 있는 코드이다.

 

Player는 getter와 setter를 통해 플레이어의 현재 위치를 리턴하고,

사다리 연결 구조에 따라 다시 설정하는 식으로 진행이 되고 있다.

 

 

즉, 오른쪽 사다리에 연결이 되어있다면 플레이어의 위치를 + 1하고,

왼쪽 사다리에 연결이 되어있다면 플레이어의 위치를 - 1하는 동작이 이뤄진다.

 

 

Line과 Player 모두에서 getter를 사용해 값을 반환하고 있고, 이에 대해 LadderGame에서 판단하여 사다리 연결 구조에 따라 플레이어의 위치를 변경해주고 있다.

 

 

getter와 setter를 통해 사다리의 연결구조를 파악하고, 플레이어의 위치를 변경할 수는 있지만 위의 코드는 좋지 못한 코드이다.

 

그 이유는 객체를 객체스럽게 사용하고 있지 못하기 때문이다.

 


🤨 객체스러운 코드가 뭔데?

객체스러운 코드란 객체가 직접 일하게끔 하는 코드가 아닐까 싶다.

바로 다음과 같이 말이다.

위와 같이 코드를 수정해볼 수 있다.

 

 

우선 첫번째로는 무분별하게 setter를 사용해서

player의 포지션을 변경해줬던 코드를 다음과 같이 Player가 직접 움직이도록 변경했다.

 

두번째로는 line에서 position을 전달받았을 때

해당 위치의 사다리가 오른쪽이 연결되어있는지, 왼쪽이 연결되어있는지 직접 판단해 bool 값을 반환하고 있다.

 

 


위와 같이 코드를 작성하는 경우에는 다음과 같은 이점이 있다.

    1. 멤버 변수의 값을 외부에서 마음대로 변경하는 것을 방지할 수 있다.

    2. 캡슐화를 보존할 수 있다.

    3. 메서드를 호출해서 사용하기에 가독성이 좋아진다.

    4. 각 메서드별로 올바른 값이 들어왔는지 검증하는 등의 동작을 따로 처리해줄 수 있다.

 

 

하지만 위와 같이 플레이어의 현재 위치를 파악하기 위해 position를 사용해야하는 일이 발생할 수 있다.

이러한 경우에는 getPosition을 사용하는 것도 괜찮다.

 

 

객체스럽게 코드를 작성하라는 의미는 getter를 사용하지 말라는 의미가 아니라 무분별한 getter의 사용을 지양하라는 의미로 받아들이면 된다.

 

 

앞으로 레벨 1 남은 기간에도 객체를 객체답게 코드를 작성하는 연습을 해봐야겠다.

728x90
반응형