배경
모든 Java 객체에는 toString()
객체를 인쇄하려고 할 때 호출되는 메소드가 있습니다.
System.out.println(myObject); // invokes myObject.toString()
이 메소드는 Object
클래스 (모든 Java 오브젝트의 수퍼 클래스 )에 정의되어 있습니다. 이 Object.toString()
메소드는 클래스 이름, @
심볼 및 오브젝트 의 해시 코드 로 구성된 상당히보기 흉한 문자열 을 16 진수 로 리턴합니다 . 이에 대한 코드는 다음과 같습니다.
// Code of Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
com.foo.MyType@2f92e0f4
따라서 다음 과 같은 결과를 설명 할 수 있습니다.
com.foo.MyType
-클래스의 이름. 즉 클래스가 MyType
패키지에있다 com.foo
.
@
-문자열을 결합
2f92e0f4
객체의 해시 코드
배열 클래스의 이름은 약간 다르게 보입니다 Class.getName()
. 에 대한 Javadocs에 잘 설명되어 있습니다 . 예를 들어 다음을 [Ljava.lang.String
의미합니다.
[
- (대향 같은 단일 차원 어레이 [[
또는 [[[
등)
L
-배열은 클래스 또는 인터페이스를 포함
java.lang.String
-배열 내의 객체의 형태
출력 사용자 정의
당신이 전화 뭔가 다른를 인쇄하려면 System.out.println(myObject)
다음을 수행해야 오버라이드 (override)toString()
자신의 수업 방법을. 다음은 간단한 예입니다.
public class Person {
private String name;
// constructors and other methods omitted
@Override
public String toString() {
return name;
}
}
이제를 인쇄하면 Person
이름이 아닌 이름이 표시 com.foo.Person@12345678
됩니다.
마음에 베어 toString()
그냥 하나의 방법으로 개체에 대한 문자열로 변환 할 수 있습니다. 일반적으로이 출력은 객체를 명확하고 간결하게 설명해야합니다. toString()
우리 Person
수업에 더 좋을 수도 있습니다 :
@Override
public String toString() {
return getClass().getSimpleName() + "[name=" + name + "]";
}
예를 들어 Person[name=Henry]
. 디버깅 / 테스트에 유용한 데이터입니다.
객체의 한 측면에만 초점을 맞추거나 많은 재즈 형식을 포함하려면 대신 별도의 방법을 정의하는 것이 좋습니다 (예 :) String toElegantReport() {...}
.
출력 자동 생성
많은 IDEtoString()
가 클래스의 필드를 기반으로 메소드 자동 생성을 지원합니다 . 예를 들어 Eclipse 및 IntelliJ 용 문서를 참조하십시오 .
널리 사용되는 여러 Java 라이브러리도이 기능을 제공합니다. 몇 가지 예는 다음과 같습니다.
객체 그룹 인쇄
그래서 당신은 toString()
당신의 수업에 좋은 곳 을 만들었습니다 . 해당 클래스가 배열 또는 컬렉션에 배치되면 어떻게됩니까?
배열
객체 배열이있는 경우 호출 Arrays.toString()
하여 배열의 내용을 간단하게 표현할 수 있습니다 . 예를 들어,이 Person
객체 배열을 고려하십시오 .
Person[] people = { new Person("Fred"), new Person("Mike") };
System.out.println(Arrays.toString(people));
// Prints: [Fred, Mike]
참고 : 이것은 Arrays 클래스에서 호출 된 정적 메소드 toString()
에 대한 호출 이며 위에서 논의 한 것과 다릅니다.
다차원 배열 이있는 경우 Arrays.deepToString()
동일한 종류의 출력을 달성하는 데 사용할 수 있습니다 .
컬렉션
대부분의 컬렉션은 .toString()
모든 요소 에 대한 호출 을 기반으로 예쁜 출력을 생성합니다 .
List<Person> people = new ArrayList<>();
people.add(new Person("Alice"));
people.add(new Person("Bob"));
System.out.println(people);
// Prints [Alice, Bob]
따라서 toString()
위에서 설명한대로 목록 요소가 멋지게 정의되도록해야합니다 .