toString() 메서드
toString() 메서드는 Java에서 객체를 문자열로 표현하기 위해 사용하는 메서드입니다.
모든 클래스는 Object 클래스를 상속받으며, toString() 메서드는 Object 클래스에서 기본적으로 제공됩니다.
toString 의 일반 규약은 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보' 라고 정의되어 있습니다.
toString()의 기본 동작
Object 클래스의 toString() 메서드는 다음과 같은 문자열을 반환합니다.
ClassName@HashCodeInHex
위에서 사람이 읽기 쉬운 형태의 유익한 정보라고 했는데 기대와 달리 전혀 간결하지도, 읽기 쉽지도, 유익하지도 않습니다. java.lang 패키지의 Object 클래스의 toString 메서드의 구현을 살펴보면 아래와 같습니다.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public class Main {
public static void main(String[] args) {
Example obj = new Example();
System.out.println(obj.toString());
// 출력: Example@<hashcode>
}
}
따라서 우리는 toString 이라는 메서드를 재정의 해줄 필요가 있습니다.
toString() 메서드 재정의
기본 구현은 객체의 메모리 주소를 출력하므로, 객체의 의미 있는 정보를 제공하려면 toString() 메서드를 재정의해야 합니다.
재정의 기본 규칙에는 객체의 주요 속성 값을 기반으로 의미 있는 문자열을 반환하거나, 디버깅 또는 로깅에 유용하도록 객체의 상태를 표현해야 합니다.
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@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.toString());
// 출력: Person{name='Alice', age=30}
}
}
toString 의 중요성, 생략
toSting 메서드는 디버깅과 로깅에 많이 쓰입니다.
Person person = new Person("Alice", 30);
System.out.println("Debugging: " + person);
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
System.out.println(people);
// 출력: [Person{name='Alice', age=30}, Person{name='Bob', age=25}]
여기서 코드를 보면 이상하다 라고 생각하시는 게 있으실 것입니다. 바로 people을 바로 호출해도 toString 메서드를 호출한 것과 같은 동일한 효과를 보실 수 있습니다. 왜 이런 걸까요?
그건 자바에서 편의성으로 생략기능을 제공해 주기 때문입니다. 따라서 people.toString() 이나 people이나 동일한 결과를 출력해 주는 것을 보실 수 있습니다.
생략을 해도 toString 은 override 를 꼭 해야 한다는 것을 기억하세요.
toString 은 언제 사용할까?
Stackoverflow 의 Is it ok to add toString() to ease debugging?? 를 읽어보면, toString 은 디버깅을 위해 설계된 메소드라고 합니다. 어떤 문제가 발생한 클래스가 toString 이 잘 구현된 클래스일 경우 스스로를 완벽히 설명하는 문자열이 로깅될 것이고 그렇지 않을 때 보다 훨씬 더 원인을 발견하기 쉬워질 것입니다.
그 외에 용도로 사용하면 어떨까?라는 궁금증이 있지만, 대부분의 여론은 디버깅에 사용하라는 것 같습니다.
'Java' 카테고리의 다른 글
자바의 Generic (1) | 2024.12.19 |
---|---|
자바의 오류처리: 예외(Exception) 와 트랜잭션 처리 (0) | 2024.12.18 |
String (0) | 2024.12.17 |
Java - Abstract (0) | 2024.12.11 |
업캐스팅 & 다운캐스팅 (1) | 2024.12.11 |