본문 바로가기
Back-End/Java

List객체를 toString()하게 되면 일어나는 일

by 우인입니다 2024. 9. 4.

https://thiswooin.tistory.com/9

 

TIL 230522 : toString()은 대괄호를 포함한 배열인 척하는 문자열이었다.

향상된 for문으로 전체 출력을 해보려 했다. 오류 발생. for-each문에서는 배열이나 Iterable이 필요하다는 뜻 같다. 배열이 맞지않나?라는 생각으로 두가지로 출력해봤다. 배열 모양이 맞는 것 같았

thiswooin.tistory.com

지극히 자바에 아무것도 모르던 시절, 아무것도 모른채로 toString()에 대해 멋대로 해석한 포스팅을 우연히 다시보게 되고,

다시 알게된 지식을 추가한 이 포스팅으로 Override하고자 합니다.


Object클래스의 toString() 메소드

자바에서는 어떤 클래스를 생성하든지 가장 상단에 Object클래스를 자동으로 상속받게 됩니다.

상속받은 메소드중에 toString() 또한 있는 것이죠.

 

그렇기에 위처럼 어떤 객체든지 내가 정의한 적 없는 toString()메소드를 호출할 수 있습니다.


어떻게 List객체를 toString()하면 대괄호에 깔끔하게 정리되어 나오는 것일까?

우선 toString()메소드가 Object클래스에서 어떻게 정의되어 있는지 보겠습니다.

만약 Done클래스의 객체를 toString()하게 된다면 "Done@2981A901" 이런 비슷한 String타입의 값을 리턴받을 수 있게됩니다.


그렇다면 list 객체는 왜 위와 같은 형식으로 나오지 않는 것일까?

결론적으로, 각 구현체에서 toString()을 @Override했기 때문입니다.

 

CollectionList<E> 추상 클래스에 정의된 toString()

ArrayList 구현체로 보았을때는, ArrayList -> AbstaractList -> AbstractCollection 의 순서로 상속받은 부모클래스를 거슬러 올라가면 toString()을 찾을 수 있습니다.


System.out.println(list); 에서 결과적으로 toString()이 호출

 

과거에 위와 다르게 출력을 해도 같은 문자열이 나오는 것을 보고 배열이라고 착각했던 적이 있다. 배열모양이라서..

 

두 개의 결과값이 같은 이유는 println()메소드의 오버로딩이 이루어지기 때문이다. (뒤에 +연산을 제외한 상태를 가정하겠습니다)

모든 객체의 부모클래스인 Object로 업캐스팅 되어 아래의 오른쪽 사진 속 파라미터 타입으로 Object인 메소드의 동작을 거치게 된다.

 

 

결과적으로 String.valueOf() 메소드를 통해 해당 메소드의 toString()의 결과값이 리턴되게 된다.


 

알게된 점

toString( );

Object클래스에 존재하는 메소드이고 이를 재정의하는 것이 추후 어떤식으로 활용될지 알 수 있었다.

 

구현체의 역할

toString( )과 같이 각 구현체의 의도에 맞게 메소드를 재정의하고 코드를 구성하는 것의 체계적임을 느꼈다.

String.valueOf( ) 에서는 기본적으로 null체크를 해주고 있었고,

CollectionList<E> 추상 클래스에서는 toString( ) 메소드에서 자기자신을 호출하는 순환호출의 가능성을 차단하고 있었다.