Java에서 toString 메소드를 사용하는 방법은 무엇입니까?


118

누구든지 클래스에 toString()정의 된 메서드 의 개념을 설명해 줄 수 있습니까 Object? 어떻게 사용되며 그 목적은 무엇입니까?



여기에 빠른 트릭 / 빠른 구현도 있습니다. @Override public String toString () {return org.apache.commons.lang3.builder.ToStringBuilder.reflectionToString (this); }
granadaCoder

답변:


81

로부터 Object.toString문서 :

객체의 문자열 표현을 반환합니다. 일반적으로toString 메서드는이 개체를 "텍스트로 나타내는"문자열을 반환합니다. 그 결과는 사람이 읽기 쉬운 간결하지만 유익한 표현이어야합니다. 모든 하위 클래스가이 메서드를 재정의하는 것이 좋습니다.

toString클래스의 방법은 Object 객체가 인스턴스, 상기 서명 문자 '로되어있는 클래스의 이름 구성된 문자열 (@), 및 오브젝트의 해시 코드의 부호 없음 16 진 표현을 반환합니다. 즉,이 메서드는 다음 값과 같은 문자열을 반환합니다.

getClass().getName() + '@' + Integer.toHexString(hashCode())

예:

String[] mystr ={"a","b","c"};
System.out.println("mystr.toString: " + mystr.toString());

output:- mystr.toString: [Ljava.lang.String;@13aaa14a

1
주요 목적은 하위 클래스에서이를 재정의하는 것입니다. @stephen과 Andreas_D의 답변이 수락 된 답변보다 낫다고 생각합니다.
스리 라마

39

사용 String.toString :

String양식 에서 value라는 생성자를 탐색해야 할 때마다 간단히 String.toString...를 예제로 사용할 수 있습니다 .

package pack1;

import java.util.*;

class Bank {

    String n;
    String add;
    int an;
    int bal;
    int dep;

    public Bank(String n, String add, int an, int bal) {

        this.add = add;
        this.bal = bal;
        this.an = an;
        this.n = n;

    }

    public String toString() {
        return "Name of the customer.:" + this.n + ",, "
                + "Address of the customer.:" + this.add + ",, " + "A/c no..:"
                + this.an + ",, " + "Balance in A/c..:" + this.bal;
    }
}

public class Demo2 {

    public static void main(String[] args) {

        List<Bank> l = new LinkedList<Bank>();

        Bank b1 = new Bank("naseem1", "Darbhanga,bihar", 123, 1000);
        Bank b2 = new Bank("naseem2", "patna,bihar", 124, 1500);
        Bank b3 = new Bank("naseem3", "madhubani,bihar", 125, 1600);
        Bank b4 = new Bank("naseem4", "samastipur,bihar", 126, 1700);
        Bank b5 = new Bank("naseem5", "muzafferpur,bihar", 127, 1800);
        l.add(b1);
        l.add(b2);
        l.add(b3);
        l.add(b4);
        l.add(b5);
        Iterator<Bank> i = l.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }

}

...이 프로그램을 Eclipse에 복사하고 실행하면 ...에 대한 아이디어를 얻을 수 있습니다 String.toString.


5
toString의도하지 않았으며 UI 목적에 적합하지 않다는 것을 알고 있기를 바랍니다 .
Powerslave

@Powerslave는 왜 모든 Swing 구성 요소가 toStringGUI에 개체를 표시하는 데 사용하는지 설명 합니다. 풍부한 개체가 있고 GUI에 표시하고 싶다면 아니요, 추가 렌더러를 만들지 않으며 개체에서 문자열 속성을 추출하여 GUI에서 사용하지 않습니다. toString모든 오버 헤드를 피할 수 있도록 간단하고 구현하십시오 . 보다 깔끔한 방식으로이를 수행하려면 UI 전용 래퍼 클래스를 만들고 toString래피의 문자열 속성을 반환하는 메서드를 구현합니다 .
Timmos

1
@Timmos 친구들이 다리에서 뛰어 내리면 따라가겠습니까? Swing 개발자가 toString 함수를 사용 (읽기, 남용)한다고해서 여러분도 그렇게해야한다는 의미는 아닙니다.
Toby Caulk

2
기본 Swing API를 계속 사용하면 작업을 완료하는 가장 쉬운 방법입니다. 사용자 지정 렌더링을 원하면 구성 요소에 사용자 지정 렌더러를 설치하십시오. String으로 표현 된 객체를 표시하고 싶다면 toString ()을 구현하는 것이 사용자 정의 렌더러에 비해 훨씬 쉽습니다. 다리에서 뛰어 내리는 것과의 비교는 이상하다고 생각합니다.
Timmos

35

toString()메서드는 개체 의 텍스트 표현을 반환 합니다. 기본 구현이 이미 포함되어 java.lang.Object있으므로 모든 객체가java.lang.Object Java의 모든 객체에이 메소드가 있음을 보장합니다.

메서드를 재정의하는 것은 특히 디버깅과 관련하여 항상 좋은 생각입니다. 디버거는 toString()메서드 의 결과에 따라 개체를 표시하는 경우가 많기 때문 입니다. 따라서 의미있는 구현을 사용하되 기술적 목적으로 사용하십시오 . 애플리케이션 로직은 getter를 사용해야합니다.

public class Contact {
  private String firstName;
  private String lastName;
  public Contact (String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {return firstName;}
  public String getLastName() {return lastName;}

  public String getContact() {
    return firstName + " " + lastName;
  }

  @Override
  public String toString() {
    return "["+getContact()+"]";
  }
}

14

선택적으로 응용 프로그램 컨텍스트 내에서 사용할 수 있지만 훨씬 더 자주 디버깅 목적으로 사용됩니다. 예를 들어 IDE에서 중단 점에 도달하면 의미있는 내용을 읽기가 훨씬 쉽습니다.toString() 구성원을 검사하는 것보다 개체 .

toString()메서드가 수행해야하는 작업에 대한 정해진 요구 사항은 없습니다 . 관례 상 대부분의 경우 클래스 이름과 관련 데이터 멤버의 값을 알려줍니다. 보다 더 자주하지,toString() 메서드는 IDE에서 자동 생성됩니다.

toString()메서드의 특정 출력에 의존 하거나 프로그램 내에서 구문 분석하는 것은 나쁜 생각입니다. 당신이 무엇을 하든지 그 길을 따라 가지 마십시오.


2
마지막 진술에 대해 자세히 설명해 주시겠습니까?
Jean-Philippe Caruana 2013 년

13

toString () 은 객체의 문자열 / 텍스트 표현을 반환합니다. 디버깅, 로깅 등과 같은 진단 목적으로 일반적으로 사용되는 toString () 메서드는 객체에 대한 의미있는 세부 정보를 읽는 데 사용됩니다.

객체가 println, print, printf, String.format (), assert 또는 문자열 연결 연산자에 전달 될 때 자동으로 호출됩니다.

Object 클래스에서 toString ()의 기본 구현은 다음 논리를 사용하여이 객체의 클래스 이름 뒤에 @ 기호와이 객체의 해시 코드의 부호없는 16 진수 표현으로 구성된 문자열을 반환합니다.

getClass().getName() + "@" + Integer.toHexString(hashCode())

예를 들어, 다음

public final class Coordinates {

    private final double x;
    private final double y;

    public Coordinates(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Coordinates coordinates = new Coordinates(1, 2);
        System.out.println("Bourne's current location - " + coordinates);
    }
}

인쇄물

Bourne's current location - Coordinates@addbf1 //concise, but not really useful to the reader

이제 아래와 같이 Coordinates 클래스에서 toString ()을 재정의합니다.

@Override
public String toString() {
    return "(" + x + ", " + y + ")";
}

결과

Bourne's current location - (1.0, 2.0) //concise and informative

toString () 재정의의 유용성은 이러한 개체에 대한 참조를 포함하는 컬렉션에서 메서드를 호출 할 때 더욱 유용합니다. 예를 들어, 다음

public static void main(String[] args) {
    Coordinates bourneLocation = new Coordinates(90, 0);
    Coordinates bondLocation = new Coordinates(45, 90);
    Map<String, Coordinates> locations = new HashMap<String, Coordinates>();
    locations.put("Jason Bourne", bourneLocation);
    locations.put("James Bond", bondLocation);
    System.out.println(locations);
}

인쇄물

{James Bond=(45.0, 90.0), Jason Bourne=(90.0, 0.0)}

대신에

{James Bond=Coordinates@addbf1, Jason Bourne=Coordinates@42e816}

몇 가지 구현 포인터,

  1. 거의 항상 toString () 메서드를 재정의해야합니다. 재정의가 필요하지 않은 경우 중 하나는 java.util.Math 방식으로 정적 유틸리티 메서드를 그룹화하는 유틸리티 클래스입니다 . 재정의가 필요하지 않은 경우는 매우 직관적입니다. 거의 항상 알 것입니다.
  2. 반환 된 문자열은 간결하고 정보를 제공해야하며 이상적으로는 자명해야합니다.
  3. 적어도 두 개의 다른 객체 사이의 동등성을 설정하는 데 사용되는 필드, 즉 equals () 에서 사용되는 필드 메서드 구현에 는 toString () 메서드에 의해 뱉어 져야합니다.
  4. 반환 된 문자열에 포함 된 모든 인스턴스 필드에 접근 자 / 게터를 제공합니다. 예를 들어 Coordinates 클래스에서

    public double getX() {
        return x;
    }
    public double getY() {
        return y;
    }

toString () 메소드에 대한 포괄적 인 내용은 Josh Bloch 저서, Effective Java ™, Second Edition의 항목 10에 있습니다.


6

코딩 :

public class Test {

    public static void main(String args[]) {

        ArrayList<Student> a = new ArrayList<Student>();
        a.add(new Student("Steve", 12, "Daniel"));
        a.add(new Student("Sachin", 10, "Tendulkar"));

        System.out.println(a);

        display(a);

    }

    static void display(ArrayList<Student> stu) {

        stu.add(new Student("Yuvi", 12, "Bhajji"));

        System.out.println(stu);

    }

}

Student.java :

public class Student {

    public String name;

    public int id;

    public String email;

    Student() {

    }

    Student(String name, int id, String email) {

        this.name = name;
        this.id = id;
        this.email = email;

    }

     public String toString(){           //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
          return name+" "+id+" "+email;     
         }  


    public String getName(){

        return name;
    }

    public void setName(String name){

        this.name=name;
    }

    public int getId(){

        return id;
    }

    public void setId(int id){

        this.id=id;
    }

    public String getEmail(){

        return email;

    }

    public void setEmail(String email){

        this.email=email;
    }
}

산출:

[Steve 12 Daniel, Sachin 10 Tendulkar]

[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]

Pojo (Student.java) 클래스에서 toString ()을 사용하지 않으면 [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]. 이러한 종류의 문제를 피하기 위해 toString () 메서드를 사용하고 있습니다.


4

String 컨텍스트에서 Object (String이 아님)에 액세스 할 때마다 컴파일러에 의해 내부적으로 toString ()이 호출됩니다.

이는 이유

Map map = new HashMap();
System.out.println("map=" + map);

작동하며 자신의 클래스에서 Object의 표준 toString ()을 재정 의하여 String 컨텍스트에서도 객체를 유용하게 만들 수 있습니다.

(그리고 그것을 블랙 박스라고 생각하세요! 절대로 사람에게 제시하는 것 외에 다른 용도로 콘텐츠를 사용하지 마십시오)


3

올바르게 재정의 된 toString 메서드는 Java 로깅 및 디버깅에 도움이 될 수 있습니다.


2

클레 터스가 디버깅과 관련하여 답변 한 것 외에는 다음과 같이 객체를 출력 할 때마다 사용됩니다.

 System.out.println(myObject);

또는

System.out.println("text " + myObject);

1

toString의 주요 목적은 객체의 문자열 표현을 생성하는 것입니다. 즉, 반환 값은 항상 문자열입니다. 대부분의 경우 이것은 단순히 객체의 클래스 및 패키지 이름이지만 StringBuilder와 같은 경우에는 실제로 문자열 텍스트를 얻습니다.


0
/**
 * This toString-Method works for every Class, where you want to display all the fields and its values
 */
public String toString() {

    StringBuffer sb = new StringBuffer();

    Field[] fields = getClass().getDeclaredFields(); //Get all fields incl. private ones

    for (Field field : fields){

        try {

            field.setAccessible(true);
            String key=field.getName();
            String value;

            try{
                value = (String) field.get(this);
            } catch (ClassCastException e){
                value="";
            }

            sb.append(key).append(": ").append(value).append("\n");

        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    return sb.toString();
}

0

파이썬을 먼저 배우고 자바를 배우면. 나는 그것이 같은 역할을한다 생각 __str__()파이썬에서 방법을, 그것은이다 마술 방법 과 같은 __dict__()__init__()하지만 개체를 나타내는 문자열을 참조하십시오.


-1

toString()문자열 값으로 지정된 객체를 변환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.