step 0. 개념정리
모든 클래스의 가장 최상위 클래스 : Object 클래스가 있습니다
자바에서 제공하는 모든 클래스들은 계층 구조로 형성 되있고
그 계층구조 최상위에는 Object 클래스가 있습니다.
모든 클래스들의 생성할때 적혀있지는 않지만
Object 클래스가 기본적으로 상속 구조가 되어있습니다
그래서 Object클래스에서 사용할 수 있는 메서드들을 사용할 수 있고, 재정의 또한 가능합니다.
즉 자바 라이브러리나 저희가 직접 만드는 클래스에는
Object 클래스를 부모클래스로 자동 상속 받아 사용하고 있다는 뜻 입니다.
toString() 메서드?
-> object(객체)가 가지고 있는 정보나 값들을 문자열로 만들어서 return 해주는 메서드 입니다.
class Objects {
public static void main (String[] args) {
Object object = new Object();
System.out.println(object);
System.out.println(object.toString());
System.out.println(object.hashCode());
System.out.println(object.getClass());
}
}
java.lang.Object@6acbcfc0
java.lang.Object@6acbcfc0
1791741888
class java.lang.Object
위 메소드들은 Object 의 메소드들이며 그 중에서 객체 자체 및 객체에.toString()을 이용해 값을 출력해보면
결과값에 어떠한 주소가 담기는데 이 결과는 Object의 toString 주소 값이라는 뜻입니다
즉 위 값에서 @ 뒤에 붙은 값은 JVM heap 메모리에 담긴 객체의 주소를 의미합니다.
java.lang 패키지의 Obeject 클래스의 toString 메서드에 기본 내부 구현을 체크해보면
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
toString 메서드는 클래스이름@16진수로표시된 해시코드 문자열을 반환해준다고 이해를 하였습니다.
간단한게 말하면 위에 po 인스턴스의 주소값을 16진수로 반환한다고 이해를 하였습니다.
이펙티브 자바 책 및 여러 사람들을 글을 보면 toString 메서드를 재정의를 해줘야한다고 이야기를 하곤 합니다.
하지만 왜 재정의를 해야하는지 몰라서 책을 찾아보았습니다.
1) toString이 잘 구현된 클래스는 사용이 편하고 , 디버깅이 쉽다.
객체를 출력하기만 하면 , 객체가 가지고 있는 모든 정보를 확인 할 수 있기 때문 입니다.
2) toString은 객체가 가진 주요 정보를 모든 반환하는 것이 좋다.
아래 예제를 보며 리뷰를 해보겠습니다.
class Car {
static String name;
static int position;
Car (String name , int position) {
this.name=name;
this.position=position;
}
}
@Override
public String toString() {
return String.format(name, position);
}
이렇게 재정의된 toString 메소드는 직접 호출하지 않더라도 문자열 출력시,
문자열 결합 연산자 등을 사용할 때 자동으로 호출됩니다.
단, 정적 유틸리티 클래스의 경우 toString 을 제공할 필요가 없다.
* 또한 대부분의 Enum 타입은 이미자바가 완벽한 toString 을 제공하므로 재정의할 필요 없다.
toString은 언제 사용해야 하나?
- > 인스턴스에 대한 정보를 쉽게 출력할 수 있고, 메서드를 재정의하여 원하는 형태로 출력할 수 있는 장점이
존재합니다.
https://stackoverflow.com/questions/4762406/tostring-for-debugging-or-for-humans
위 스택오버플로우에서 자료를 참고하였는데 toString()메서드는 디버깅에 적합하다는 의견이 많았습니다.
추가적인 내용으로 문자열 객체을 값을 추출하기 위해 보통 toString() 을 많이 사용하는 편인대
위 toString() 은 NullSafe 하지 않기 때문에 String.valueOf() 메소드를 추천하는 분들 또한 있습니다.
그러므로 사이드 이펙트를 잘 알고 사용할 필요가 있습니다
본문중 틀린 내용이 있으면 지적 부탁드립니다. 이상입니다
ref : https://hudi.blog/java-correct-purpose-of-tostring/