https://thiswooin.tistory.com/9
지극히 자바에 아무것도 모르던 시절, 아무것도 모른채로 toString()에 대해 멋대로 해석한 포스팅을 우연히 다시보게 되고,
다시 알게된 지식을 추가한 이 포스팅으로 Override하고자 합니다.
Object클래스의 toString() 메소드
자바에서는 어떤 클래스를 생성하든지 가장 상단에 Object클래스를 자동으로 상속받게 됩니다.
상속받은 메소드중에 toString() 또한 있는 것이죠.
그렇기에 위처럼 어떤 객체든지 내가 정의한 적 없는 toString()메소드를 호출할 수 있습니다.
어떻게 List객체를 toString()하면 대괄호에 깔끔하게 정리되어 나오는 것일까?
우선 toString()메소드가 Object클래스에서 어떻게 정의되어 있는지 보겠습니다.
만약 Done클래스의 객체를 toString()하게 된다면 "Done@2981A901" 이런 비슷한 String타입의 값을 리턴받을 수 있게됩니다.
그렇다면 list 객체는 왜 위와 같은 형식으로 나오지 않는 것일까?
결론적으로, 각 구현체에서 toString()을 @Override했기 때문입니다.
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( ) 메소드에서 자기자신을 호출하는 순환호출의 가능성을 차단하고 있었다.
'Back-End > Java' 카테고리의 다른 글
HashSet에 hashCode() 재정의 없이도 중복제거가 가능할까 (5) | 2024.07.22 |
---|---|
TIL 230712 : 자바의 람다식 짚고 넘어가기(2) 메소드 참조 (0) | 2023.07.13 |
TIL 230711 : 자바의 람다식 짚고 넘어가기. (0) | 2023.07.12 |
TIL 230614 : 실행은 같아도 코드는 다르다. (0) | 2023.06.19 |
TIL 230612 : 날짜 시간 데이터와 인사하기. (2. SimpleDateFormat) (0) | 2023.06.12 |