toString() 메서드toString() 메서드는 자바에서 모든 클래스의 부모 클래스인 Object 클래스에 정의된 메서드입니다. 객체를 문자열(String)로 표현할 때 사용되며, 객체의 정보나 상태를 출력하거나 디버깅할 때 유용합니다.
toString() 메서드의 선언:public String toString()
Object 클래스의 기본 toString() 구현은 클래스 이름과 16진수 해시코드를 반환합니다.public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Object obj = new Object();
System.out.println(obj.toString());
// 출력: java.lang.Object@1a2b3c4d (클래스 이름 + @ + 해시코드)
toString() 메서드의 역할toString() 메서드 오버라이드toString() 메서드는 클래스 이름과 해시코드만 반환하므로, 객체의 상태를 의미 있게 표현하려면 오버라이드가 필요합니다.class Person {
private String name;
private int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// toString() 오버라이드
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
System.out.println(person); // Person{name='Alice', age=30}
}
}
toString()은 자동으로 호출됩니다:System.out.println()으로 출력할 때.+)에서 객체가 포함될 때.Person person = new Person("Alice", 30);
System.out.println(person); // 자동으로 person.toString() 호출
System.out.println("Person info: " + person); // 자동으로 호출
toString() 구현 시 고려사항toString() 자동 생성많은 IDE(예: IntelliJ IDEA, Eclipse)에서는 클래스의 toString() 메서드를 자동으로 생성할 수 있는 기능을 제공합니다.
Generate → toString() 선택.@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
toString() 메서드와 주요 클래스toString() 메서드가 오버라이드되어, 객체 값을 문자열로 반환합니다.Integer num = 100;
System.out.println(num.toString()); // "100"
String 클래스String 클래스의 toString() 메서드는 객체 자체를 반환합니다.String text = "Hello";
System.out.println(text.toString()); // "Hello"
List, Set, Map 등의 컬렉션 클래스는 toString()을 오버라이드하여 요소들의 문자열 표현을 반환합니다.List<String> list = Arrays.asList("A", "B", "C");
System.out.println(list.toString()); // [A, B, C]
toString() 활용 사례Person person = new Person("Alice", 30);
System.out.println(person); // Person{name='Alice', age=30}
logger.info("Current User: " + user);
@Override
public String toString() {
return "{ \"name\": \"" + name + "\", \"age\": " + age + " }";
}
toString()와 다른 메서드 비교hashCode()hashCode()는 객체를 식별하는 고유한 정수 값을 반환합니다.toString()과 달리 객체의 문자열 표현이 아니라, 해시 값을 제공합니다.equals()equals()는 객체의 동등성을 비교하는 메서드로, toString()과는 기능적으로 다릅니다.toString()은 객체를 문자열로 표현하기 위한 메서드로, 모든 클래스에서 활용 가능한 유용한 도구입니다.아래는 제네릭에서 toString()을 재정의하여 System.out.println()으로 결과를 출력하는 간단한 예시 5가지입니다. 제네릭 클래스를 활용하여 다양한 타입을 처리하면서 toString() 메서드를 이용한 출력 결과를 확인할 수 있습니다.
class GenericPrinter<T> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
@Override
public String toString() {
return "Material: " + material.toString();
}
}
public class Main {
public static void main(String[] args) {
GenericPrinter<String> printer = new GenericPrinter<>();
printer.setMaterial("Hello, World!");
System.out.println(printer); // 출력: Material: Hello, World!
}
}
class GenericPrinter<T> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
@Override
public String toString() {
return "Number: " + material.toString();
}
}
public class Main {
public static void main(String[] args) {
GenericPrinter<Integer> printer = new GenericPrinter<>();
printer.setMaterial(42);
System.out.println(printer); // 출력: Number: 42
}
}
class Powder {
@Override
public String toString() {
return "재료는 Powder입니다";
}
}
class GenericPrinter<T> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
@Override
public String toString() {
return material.toString();
}
}
public class Main {
public static void main(String[] args) {
GenericPrinter<Powder> printer = new GenericPrinter<>();
printer.setMaterial(new Powder());
System.out.println(printer); // 출력: 재료는 Powder입니다
}
}
class GenericPrinter<T, U> {
private T material;
private U quantity;
public void set(T material, U quantity) {
this.material = material;
this.quantity = quantity;
}
@Override
public String toString() {
return "Material: " + material.toString() + ", Quantity: " + quantity.toString();
}
}
public class Main {
public static void main(String[] args) {
GenericPrinter<String, Integer> printer = new GenericPrinter<>();
printer.set("Powder", 5);
System.out.println(printer); // 출력: Material: Powder, Quantity: 5
}
}
class GenericPrinter<T> {
private T material;
public void setMaterial(T material) {
this.material = material;
}
@Override
public String toString() {
return "Type: " + material.getClass().getSimpleName() + ", Value: " + material.toString();
}
}
public class Main {
public static void main(String[] args) {
// String 타입
GenericPrinter<String> stringPrinter = new GenericPrinter<>();
stringPrinter.setMaterial("Hello");
System.out.println(stringPrinter); // 출력: Type: String, Value: Hello
// Integer 타입
GenericPrinter<Integer> intPrinter = new GenericPrinter<>();
intPrinter.setMaterial(123);
System.out.println(intPrinter); // 출력: Type: Integer, Value: 123
// Double 타입
GenericPrinter<Double> doublePrinter = new GenericPrinter<>();
doublePrinter.setMaterial(45.67);
System.out.println(doublePrinter); // 출력: Type: Double, Value: 45.67
}
}
System.out.println()은 항상 객체의 toString()을 호출하므로, 객체의 정보를 직관적으로 나타내려면 toString() 재정의는 필수입니다.