728x90
Object의 기본 메서드 toString
- Java의
Object클래스는 기본적으로toString메서드를 제공하며, 이는 기본적으로클래스_이름@16진수_해시코드형식의 문자열을 반환합니다.
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
기본 toString 예제
- 인스턴스를 출력하면 자동으로
toString메서드가 호출됨
public class Foo {
private String name;
private int code;
public Foo(String name, int code) {
this.name = name;
this.code = code;
}
public static void main(String[] args) {
Foo foo = new Foo("name", 1);
System.out.println(foo.toString()); // Foo@36baf30c
System.out.println(foo); // Foo@36baf30c
}
}
toString 메서드 재정의
- 객체의 고유 정보(예: 필드 값)를 출력하려면
toString메서드를 재정의해야 합니다.
class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return String.format("이름: %s, 나이: %d세", this.name, this.age);
}
}
public class Main {
public static void main(String[] args) {
Person p1 = new Person("홍길동", 54);
System.out.println(p1); // 이름: 홍길동, 나이: 54세
}
}
toString 규약
- 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야 합니다.
- 모든 하위 클래스에서 이 메서드를 재정의하는 것이 좋습니다.
toString의 중요성
toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 디버깅이 용이합니다.toString이 자동으로 호출되는 경우:- 객체를
println,printf, 문자열 연결 연산자(+),assert구문에 넘길 때 - 디버거가 객체를 출력할 때
- 오류 메시지를 로깅할 때
- 객체를
실전에서 toString 구현
- 객체가 가진 주요 정보를 모두 반환하는 것이 좋습니다.
- 객체가 너무 크거나 상태가 복잡하면 무리가 있을 수 있습니다.
- 반환값의 포맷을 문서화할지 결정해야 합니다.
포맷 명시 예
/**
* 이 전화번호의 문자열 표현을 반환한다.
* 이 문자열은 "XXX-YYY-ZZZZ" 형태의 12글자로 구성된다.
* XXX는 지역 코드, YYY는 프리픽스, ZZZZ는 가입자 번호다.
* 각각의 대문자는 10진수 숫자 하나를 나타낸다.
*
* 전화번호의 각 부분의 값이 너무 작아서 자릿수를 채울 수 없다면,
* 앞에서부터 0으로 채워나간다. 예를 들어 가입자 번호가 123이라면
* 전화번호의 마지막 네 문자는 "0123"이다.
*/
@Override
public String toString() {
return String.format("%03d-%03d-%04d", areaCode, prefix, lineNum);
}
포맷 비명시 예
/**
* 이 약물에 관한 대략적인 설명을 반환한다.
* 다음은 이 설명의 일반적인 형태이나,
* 상세 형식은 정해지지 않았으며 향후 변경될 수 있다.
*
* "[약물 #9: 유형=사랑, 냄새=테레빈유, 겉모습=먹물]"
*/
@Override
public String toString() {
// 구체적인 구현 내용
}
toString 반환 값에 포함된 정보 제공
toString반환 값에 포함된 정보를 얻을 수 있는 API를 제공해야 합니다.toString값을 파싱하지 않아야 하며, 성능 저하와 시스템 망가짐을 방지할 수 있습니다.
toString을 재정의하지 않아도 되는 경우
- 정적 유틸리티 클래스:
toString을 제공할 이유가 없습니다. - 열거 타입: 이미 완벽한
toString을 제공하므로 재정의할 필요가 없습니다.
이렇게 정리하면 toString 메서드를 재정의하는 이유와 방법, 그리고 주의사항을 잘 이해할 수 있습니다. toString 메서드는 객체의 상태를 명확하고 유익하게 표현하기 위한 중요한 도구이며, 이를 적절히 재정의하면 클래스 사용과 디버깅이 훨씬 수월해집니다.
728x90
'Programming Language > Java' 카테고리의 다른 글
| [이펙티브 자바]Item.14-Comparable을 구현할지 고려하라. (0) | 2024.11.25 |
|---|---|
| [이펙티브 자바]Item.13-clone 재정의는 주의해서 진행하라 (1) | 2024.11.20 |
| [이펙티브 자바]Item.11-equals를 재정의하려거든 hashCode도 재정의하라 (0) | 2024.05.14 |
| [이펙티브 자바]tem.10-equals는일반 규약을 지켜 재정의하라 (0) | 2024.05.14 |
| [이펙티브 자바]Item.09-try-finally보다는 try-with-resources를 사용하라 (0) | 2024.05.06 |