java의 toString 메서드는, 객체의 정보를 리턴하는 역할을 합니다. 사실 이 부분에 대해서 저는 별로 중요하게 생각을 하지는 않았습니다. 이걸 보면 아직도 멀었다는 생각이 듭니다. 하여튼, Object의 정보는 언제 볼까요? 당연하게도, 디버깅을 할 때 어디서 잘못되었는지 보기 위해서 볼 겁니다.

 

 

 기본적으로, 자바에서, 최상위 부모는 Object입니다. 따라서, 클래스에 toString이 override가 되어 있지 않으면, Object에 있는 toString을 부르게 됩니다. 이 함수를 봅시다. 그러면 뭔가 getClass().getName()에 @을 concat를 하고, hashCode값을 16진수화 시킨 것을 또 concat 한다는 것을 알 수 있어요.

 

 

 myClass 클래스를 선언하였습니다. 따로 override 한 것이 없기 때문에, 11번째 줄에 문제의 메서드를 호출하면 클래스이름에다가 @를 concat 한 거에 hashCode를 append 한 문자열이 출력이 될 거에요.

 

 

 아래와 같이요. 이것만 가지고는 myClass의 객체 a에 대한 유의미한 정보를 뽑아낼 수 없습니다. 특히 구현 문제들 (역량 테스트라던지) 같은 경우에는. 어디서 잘못되었는지 추적을 해야 하는데.. 저런 식으로만 정보가 나오면 조금 멘붕일 듯 싶어요. 이 메서드를 재정의 하는 것이 권장되는 이유입니다.

 

 


 그러면 어떻게 해야 할까요? toString 메소드를 오버 라이딩하시면 됩니다.

 

 

 이클립스에서는 source에서 Generate toString()...이 있습니다. 이것을 눌러 봅시다.

 

 

 옵션들을 그대로 두고 확인 버튼을 눌러 봅시다.

 

 

 그러면, 이런 식으로 생성이 되는데요. 실행을 시켜 봅시다.

 

 

 아까와는 다르게, 그래도 어느 정도 디버깅이나 추적에 쓸만한 정보들이 있음을 알 수 있어요. 그런데 사실 너무 많은 정보가 있으면 눈이 아플 듯 싶군요. 저는 이러한 경우에, field에 있는 원소들과 클래스 이름@hashCode만 출력하는 편입니다. 조금 더 이쁘게 출력해 봅시다.

 

 

 코드를 보면 그렇게 복잡하지 않습니다. 클래스 이름 출력해 주고, hashCode를 출력해 줍니다. 그리고 내부에 있는 주요 필드들의 값들도 출력해 주었습니다. 필요 없는 값들은 과감히 생략해 주어도 크게 문제는 없어요.

 

 

 조금 더 깔끔해 졌어요. 그리고 역추적 하기도 조금은 더 쉬워지겠네요. 실제로 저는 알고리즘 사이트에서 문제를 풀 때 print 계열 함수로 디버그를 상당히 많이 하는 편이에요. 그럴 때 굉장히 유용하게 써먹을 수 있어요.

 

 


 다른 예제 하나만 더 봅시다. 이번에는 배열이 필드에 추가되었습니다. 생성자를 보니 배열의 원소 갯수는 5개인가 보군요.

 

 

 이 때에는 어떻게 하면 좋을까요? arr의 length가 작으니, 그냥 전체를 출력해도 크게 문제는 없어 보입니다.

 

 

 

 그러면 코드를 위와 같이 작성할 수 있습니다. 여기서 arr_str은 원소,원소,원소,원소,원소, 이런 패턴으로 저장을 합니다. 예를 들어 배열 arr에 2,3,5,7,9가 있으면 2,3,5,7,9, 이렇게 저장을 합니다. 여기서, arr_str의 length가 0이 아니면 끝에 있는 ,을 제거하기 위해서, substring을 취합니다. 19번째 줄이 그러한 일을 수행합니다.

 

 그러면, arr_str이 "2,3,5,7,9" 객체를 가리키고 있을 겁니다. 이제, arr 정보인 arr_str을 만들었으니, 객체 정보를 리턴하는 문자열에 그대로 append만 시키면 됩니다.

 

 

 객체에 대해서 의미있는 정보가 출력이 되었습니다. 그 이야기는 toString을 오버라이드 할 때, 디버깅이나 trace를 위한 의미있는 정보를 가진 필드와 그렇지 않은 필드를 구분해야 한다는 이야기가 되겠습니다. 물론 그렇게까지 깊게 생각해야 할 일은, ps에서 그렇게 많지는 않을 겁니다.