저번 시간에 객체의 완전한 상태에 대해서 이야기를 했습니다. 이번 시간에는, method chaining에 대해서 알아보겠습니다.

 


 Dog 클래스가 있다고 해 보겠습니다.

 

 

 name과, 출생 년도, 그리고 동물 등록 번호를 필드로 가지고 있습니다. 평범한 getter와 setter가 있습니다. Name과 Reg_id에 세터가 있는 이유는 dog가 생성되고 나서, 시간이 지난 후에도 바뀔 수 있는 속성이기 때문입니다.

 

 

 반면에, 태어난 연도인 year는 바뀌지 않습니다. 그러니, setter 등으로 열어둘 필요가 없습니다.

 

 

 그래서, year는 setter가 없습니다. 단지 객체가 만들어 지고 초기화 하는 과정에서만 값이 들어갈 뿐입니다. 이 정도 보고 넘어가시면 될 듯 합니다.

 

 

 그리고 toString을 override 해 주었습니다. 이것은, 단지 이름과 year, reg_id를 포함하는 정보를 리턴합니다.

 

 

 main 메소드를 보겠습니다. 먼저 강아지가 태어났을 때, 태어난 연도와 이름이 생성자의 인자로 들어갑니다. 그리고 동물 등록은, 생성된 후에 했습니다. 4번째 줄의 setReg_id가 이 일을 수행합니다. 다음에, 이름에 대해서 변경 사항이 있었는지, 다시 재등록을 하게 되었습니다. 이 때 id와 이름이 둘 다 바뀌었습니다. 7번째와 8번째 줄이 하는 일이 그것입니다. 그리고 이것이 저의 의도입니다.

 

 

 실행 결과는 위와 같습니다. 그런데, 7번째 줄과 8번째 줄 말입니다. readable 하게 바꿀 수 없을까요? 물론, 이름과 등록 번호만 바뀌면, 이렇게 코드를 짜도 무난할 겁니다.

 

 

 그런데, 필드가 더 있다면 어떨까요? 사는 지역이 추가된다면? 그러면 reg_id와 사는 지역을 바꾸려고 한다면 함수 하나를 더 추가해야 하나요? setLivingAreaAndRegId 이름까지 바꾼다면 setNameAndLivingAreaAndRegId. 아. 진짜 복잡해 지는군요. 이건 너무 오버킬인 듯 합니다.

 

 


 setter에서, set을 하고 나면 자기 자신을 리턴해 보도록 하겠습니다.

 

 

 자기 자신은 this입니다. 따라서, this를 리턴하면 됩니다. 이제 main 메서드를 아래와 같이 바꿀 수 있습니다.

 

 

 reg_id를 바꾸면서 이름이 바뀌었다. 있을 수 있는 일입니다. 속성 여러개를 한 번에 바꾼 셈입니다. 그런데 저게 어떻게 동작할까요? method 체이닝에 의해서, setReg_id가 호출이 되고 나면

 

 

 해당 객체의 등록 id가 23292331로 바뀐 상태가 됩니다. 이 객체가 리턴이 되었고, 여기에 setName이 걸립니다.

 

 

 그러니, 23292331로 바뀐 객체의 이름이 chogahui05로 set이 될 겁니다. 단지, setter에 this를 리턴하게만 했는데도, 읽기 쉬워진 코드가 된 것은 기분 탓일 겁니다. 읽기가 더 쉽다? 왜? 이거에 대해서 조금 더 생각해 보면, 7 ~ 8번째 줄에 있는 문장은 단 한 문장입니다. 물론, 그 한 문장 내에서 호출되는 setter는 2개입니다만, 제가 의도한 바가 명확하게 나타납니다. 동물 등록을 다시 하면서 id와 이름을 바꾸었다는 그 의도가요.

 

 

 이건 어떤가요? id와 Name을 동시에 설정했다는 것을 표현하기 위해서, 저렇게 작성하면 어떨까요? 결과만 보면 별 차이는 없어 보입니다만, Reg_id를 하고 얼마나 지난 시점에서 setName을 한 건지 알 수 없습니다. 바로 한 건지, 2시간 뒤에 한 건지, 아니면 1년 뒤에나 한 건지. 단지 id를 바꾸고 이름을 바꿨다. 정도의 선행 후행 관계만 보일 뿐입니다.

 

 

 그렇다면 중간에 "rest"를 한다는 게 끼어들어도 할 말이 없게 됩니다. id를 바꾸고, Name을 설정한다는 사실은 똑같이 만족했기 때문입니다. 제 의도였던 id를 바꾸면서 이름도 바꿨다는 것이 명확하게 드러나지 않습니다. 위와는 반대되는 상황인 셈입니다.

 

 

 다시 코드로 돌아와 봅시다. 체이닝을 한 코드의 실행 결과는 위와 같습니다. method chaining은 저도 한 번에 여러개의 속성들을 setting 할 때 많이 쓰곤 합니다. 알아두면 유용하게 써 먹을 구석이 있는 듯 싶습니다.