[Java] toString() 정리

728x90

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(): for debugging or for humans?

class Address { private enum Component { NUMBER, STREET, STATE, COUNTRY } private Map<Component, String> componentToValue = ...; } I'd like my class to contain two m...

stackoverflow.com

위 스택오버플로우에서 자료를 참고하였는데 toString()메서드는 디버깅에 적합하다는 의견이 많았습니다.

 

추가적인 내용으로 문자열 객체을 값을 추출하기 위해 보통 toString() 을 많이 사용하는 편인대 

위 toString() 은 NullSafe 하지 않기 때문에 String.valueOf() 메소드를 추천하는 분들 또한 있습니다.

 

그러므로 사이드 이펙트를 잘 알고 사용할 필요가 있습니다

 

 

본문중 틀린 내용이 있으면 지적 부탁드립니다. 이상입니다

 

ref : https://hudi.blog/java-correct-purpose-of-tostring/

 

 

728x90