1. 소개
Java로 개발할 때 자주 마주치는 것이 “toString 메서드”입니다. 객체의 상태나 내용을 빠르게 확인하거나 디버깅 및 로그 출력을 할 때 중요한 역할을 합니다. 하지만 초보자나 중급 개발자도 “toString은 정확히 무엇을 하는 걸까?”, “왜 오버라이드가 권장되는 걸까?”, “다른 변환 메서드와는 어떻게 다른가?” 라는 궁금증을 가질 수 있습니다.
이 글에서는 Java의 toString 메서드를 기본 개념부터 실전 사용법, 트러블슈팅, valueOf와의 차이점, 실제 사례까지 자세히 설명합니다. 흔히 저지르는 실수와 해결 방법도 함께 소개하여 실제 개발 상황에서 문제를 예방할 수 있는 지식을 제공하고자 합니다.
“객체를 출력했는데 이상한 문자열이 나온다”거나 “toString이 정확히 언제 호출되는지 궁금하다”는 질문을 한 적이 있다면 이 가이드를 통해 답을 얻을 수 있습니다. 초보자든 Java를 더 깊이 파고들고 싶은 개발자든 유용한 예제와 실용적인 인사이트를 얻을 수 있을 것입니다.
2. Java toString 메서드란?
toString 메서드는 모든 클래스의 최상위인 Object 클래스에 정의된 표준 메서드입니다. 인스턴스가 가지고 있는 정보를 “문자열” 형태로 표현해 주며, Java 객체의 명함과 같은 역할을 합니다.
toString 메서드는 주로 다음과 같은 상황에서 사용됩니다.
- 객체를 문자열 형태로 표시하고 싶을 때
- 디버깅이나 로그 출력 시 객체의 내용을 빠르게 확인하고 싶을 때
기본 구현이 동작하는 방식
Java에서 새 클래스를 만들고 직접 toString 메서드를 작성하지 않으면 Object 클래스의 기본 구현이 사용됩니다.
이 구현은 다음과 같은 형식의 문자열을 반환합니다.
ClassName@HashCode (in hexadecimal)
예를 들어 다음 클래스를 보세요.
public class Product {
private String name;
private int price;
}
이 클래스로 인스턴스를 생성하고 System.out.println 으로 출력하면 다음과 같은 결과가 나옵니다.
Product@7a81197d
“ClassName@HashCode” 형식은 내부적으로 객체를 구분하는 데는 유용할 수 있지만, 사람 입장에서 객체의 실제 내용을 이해하기에는 거의 도움이 되지 않습니다.
toString이 자동으로 호출되는 경우
toString 메서드는 명시적으로 호출하지 않아도 다음 상황에서 자동으로 실행됩니다.
System.out.println(object)와 같이 객체를 직접 출력할 때- 문자열과 객체를
+연산자로 연결할 때 (예:"Value: " + obj)
Java는 객체를 “toString으로 표현할 수 있다”는 전제로 동작하기 때문에, 이 메서드의 동작을 이해하고 적절히 활용하는 것이 매우 중요합니다.
3. 기본 사용법 및 출력 예시
toString 메서드는 Java 전반에 걸쳐 다양한 상황에서 사용됩니다. 이 섹션에서는 표준 클래스에서의 동작과 사용자 정의 클래스에서 오버라이드하지 않았을 때의 결과를 실용적인 예제와 함께 설명합니다.
기본형 래퍼 클래스의 toString
Java는 int, double 등 기본형에 대한 래퍼 클래스를 제공하며(Integer, Double 등) 이들 클래스는 의미 있는 방식으로 toString 메서드를 이미 오버라이드하고 있습니다.
예시:
Integer num = 123;
System.out.println(num.toString()); // Output: 123
Double pi = 3.14;
System.out.println(pi.toString()); // Output: 3.14
이처럼 기본형 래퍼 클래스는 toString을 호출하면 값 자체를 문자열로 바로 얻을 수 있습니다.
사용자 정의 클래스에서 오버라이드하지 않은 경우
직접 클래스를 만들면 별도로 toString을 구현하지 않은 한 기본 구현(ClassName@HashCode)이 사용됩니다.
public class Product {
private String name;
private int price;
public Product(String name, int price) {
this.name = name;
this.price = price;
}
}
Product p = new Product("りんご", 150);
System.out.println(p.toString()); // Example: Product@4e25154f
이 출력은 클래스 이름과 16진수 해시 코드만 표시합니다. 내부 값이 포함되지 않아 대부분의 실제 상황에서 실용적이지 않습니다.
System.out.println 사용 시 동작
System.out.println(object)를 사용할 때, toString()이 내부적으로 자동 호출됩니다. 따라서 아래 두 줄은 동일한 출력을 생성합니다:
System.out.println(p); // toString is automatically called
System.out.println(p.toString()); // Explicit call
문자열 연결 시 암시적 toString 호출
“+” 연산자를 사용해 문자열과 객체를 연결할 때, Java는 자동으로 toString을 호출합니다.
System.out.println("Product info: " + p);
// Output example: "Product info: Product@4e25154f"
이 동작을 이해하면 디버깅이나 로깅 중에 예상치 못한 문자열 출력의 원인을 파악하는 데 도움이 됩니다.
4. toString 메서드 오버라이드 방법
Java에서 사용자 정의 클래스를 사용할 때, toString 메서드를 오버라이드하는 것은 매우 중요합니다. 이를 오버라이드하면 객체 정보를 명확하고 사람이 읽기 쉬운 형식으로 출력할 수 있어 디버깅과 개발 효율이 크게 향상됩니다.
오버라이드가 필요한 이유는?
앞서 설명했듯이, 기본 toString 구현은 “ClassName@HashCode”만 표시하여 객체의 내용을 드러내지 않습니다. 실제 개발 환경에서는 객체의 상태를 빠르게 파악해야 하는 경우가 많으며, 각 필드를 일일이 확인하는 것은 비효율적입니다. toString을 오버라이드하면 주요 필드 값을 한눈에 출력할 수 있어 가독성과 작업 흐름 효율이 향상됩니다. 또한, 자세한 정보가 로그나 오류 메시지에 자동으로 포함되어 빠른 문제 해결에 도움이 됩니다.
기본 문법 및 구현 팁
오버라이드된 toString 메서드의 기본 구조는 다음과 같습니다:
@Override
public String toString() {
return "ClassName{field1=" + field1 + ", field2=" + field2 + "}";
}
팁:
- 반환 타입은 String이어야 합니다.
- 실수를 방지하기 위해 @Override 어노테이션을 사용하세요.
- 중요한 필드만 출력하세요(민감하거나 private인 데이터, 혹은 과도하게 큰 데이터는 피하세요).
비교 표: 기본 vs. 오버라이드 출력 예시
| Output Example | Description |
|---|---|
| Product@7a81197d | Default implementation |
| Product{name=りんご, price=150} | Example of an overridden implementation |
구현 예시
아래는 이전 섹션에서 사용한 동일한 Product 클래스를 이용한 예시입니다:
public class Product {
private String name;
private int price;
public Product(String name, int price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Product{name=" + name + ", price=" + price + "}";
}
}
이 오버라이드를 적용하면 System.out.println(p)의 출력은 다음과 같이 됩니다:
Product{name=りんご, price=150}
이는 기본 출력보다 훨씬 이해하기 쉽습니다.
요약
toString 메서드를 오버라이드하는 것은 Java 개발에서 필수적인 기법입니다. 이를 통해 객체 정보를 명확하고 읽기 쉬운 형식으로 출력함으로써 일상적인 개발 및 디버깅이 훨씬 효율적으로 이루어집니다.
5. 실용 예시: 사용자 정의 클래스에서 toString 사용하기
toString 메서드를 오버라이드하는 것이 실제로 어떻게 유용한지 이해하기 위해, 이 섹션에서는 사용자 정의 클래스를 활용한 구체적인 예시를 제시합니다. 또한 초보자들이 흔히 겪는 함정과 기술도 강조합니다.
필드를 포함한 toString 오버라이드 예시
제품 정보를 관리하는 Product 클래스를 생각해 보세요. toString을 오버라이드하지 않으면 출력은 단순히 “Product@HashCode”가 됩니다. 하지만 아래와 같이 toString을 구현하면 내용이 즉시 명확해집니다.
public class Product {
private String name;
private int price;
private String category;
public Product(String name, int price, String category) {
this.name = name;
this.price = price;
this.category = category;
}
@Override
public String toString() {
return "Product{name=" + name + ", price=" + price + ", category=" + category + "}";
}
}
클래스의 인스턴스를 출력할 때:
Product apple = new Product("りんご", 150, "果物");
System.out.println(apple);
// Output example: Product{name=りんご, price=150, category=果物}
실제 사용을 위한 실용적인 팁
- 디버깅 중
toString을 오버라이드하면System.out.println이나 로그 출력으로 각 필드의 값을 직접 확인할 수 있습니다. - 배열이나 리스트 표시
Product객체의 배열이나 리스트를 출력하면, 오버라이드된toString메서드가 각 요소에 대해 호출되어 대량 검사가 훨씬 쉬워집니다.List<Product> products = Arrays.asList( new Product("みかん", 100, "果物"), new Product("バナナ", 120, "果物") ); System.out.println(products); // Output example: [Product{name=みかん, price=100, category=果物}, Product{name=バナナ, price=120, category=果物}]
- IDE 디버거와의 통합 많은 IDE(Eclipse, IntelliJ 등)는 브레이크포인트에서 객체 상세 정보를 표시할 때
toString출력을 사용합니다. 깨끗하고 읽기 쉬운toString을 작성하면 디버깅 효율성이 크게 향상됩니다.
초보자가 주의해야 할 일반적인 함정
- 모든 필드를 표시할 필요는 없습니다. 필요에 따라 민감하거나 개인적인 데이터를 제외하세요.
- 자신의
toString안에서 다른 객체의toString을 호출할 때 순환 참조에 주의하세요(예: A → B → A).
요약
toString을 오버라이드하면 개발, 디버깅, 그리고 프로덕션 환경에서의 문제 해결 시 가시성을 크게 향상시킬 수 있습니다.
이 샘플 구현을 참고하여 사용자 정의 클래스에 적극적으로 적용하세요.
6. 일반적인 문제와 트러블슈팅 (Q&A 형식)
toString 메서드는 편리하지만, 구현이나 사용이 잘못되면 예상치 못한 문제가 발생할 수 있습니다.
이 섹션에서는 자주 마주치는 오류와 질문을 Q&A 형식으로 정리하고, 원인과 해결책을 제시합니다. Q1. toString을 오버라이드하는 것을 잊으면 어떻게 되나요?
A1.
오버라이드하지 않으면 System.out.println이나 로그 출력에 “ClassName@HashCode” 형태만 표시되어 객체의 내부 상태를 파악할 수 없습니다.
배열이나 리스트에 저장된 복잡한 객체들의 경우, 항목을 구분하기가 매우 어려워집니다.
개발 및 디버깅 효율성을 유지하려면 필요할 때마다 반드시 toString을 오버라이드하세요.
Q2. null에 대해 toString을 호출하면 어떻게 되나요?
A2.
null에 대해 toString을 호출하면 NullPointerException이 발생합니다.
예시:
Product p = null;
System.out.println(p.toString()); // NullPointerException
가능한 경우 항상 null 여부를 확인하세요:
if (p != null) {
System.out.println(p);
} else {
System.out.println("Product is null");
}
Q3. toString이 재귀 호출을 일으켜 StackOverflowError가 발생하면 어떻게 해야 하나요?
A3.
한 클래스의 toString이 다른 클래스의 toString을 호출하고, 그 호출이 다시 원래 클래스의 toString으로 돌아오면 무한 재귀가 발생해 StackOverflowError가 발생합니다.
이는 부모‑자식 또는 양방향 참조에서 흔히 나타납니다.
가능한 해결책:
- 관계의 한쪽만 출력하도록 제한하기
- 요약 정보만 출력하기(예: ID 또는 핵심 필드)
Q4. 문자열 연결 시 toString이 자동으로 호출되는 이유는?
A4.
“+” 연산자를 사용해 문자열과 객체를 연결하면 Java는 자동으로 toString을 호출합니다.
기본 toString을 사용하면 예상치 못한 읽기 어려운 문자열이 나타날 수 있습니다.
이것이 toString을 오버라이드하는 것이 권장되는 또 다른 이유입니다.
Q5. toString을 구현할 때 보안 측면에서 주의해야 할 점은?
A5.
비밀번호, 개인 정보, 개인 키 등 민감한 데이터를 toString 출력에 절대 포함하지 마세요.
로그나 오류 메시지가 외부에 노출될 수 있으므로 안전하고 필요한 정보만 포함하세요.
요약
toString의 사소한 실수도 디버깅 효율을 크게 떨어뜨리거나 예상치 못한 오류를 일으킬 수 있습니다.
다음 사항을 기억하세요:
- 필요할 때 toString을 오버라이드하는 것을 잊지 말 것
- toString을 호출하기 전에 항상 null 여부를 확인할 것
- 순환 참조와 과도한 출력은 피할 것
이러한 일반적인 문제들을 인식하면 Java 개발이 훨씬 원활하고 안정적이 됩니다.
7. toString과 valueOf의 차이점 및 올바른 사용 방법
Java를 배우다 보면 비슷한 이름의 또 다른 메서드 “valueOf”도 만나게 됩니다.
두 메서드 모두 객체나 값을 문자열로 변환하는 데 사용되기 때문에 혼동하기 쉽습니다.
하지만 역할과 적절한 사용 사례는 다릅니다.
이 섹션에서는 두 메서드를 비교하고 올바른 선택 방법을 설명합니다.
비교: toString vs. valueOf
| toString() | valueOf() | |
|---|---|---|
| Defined In | Instance method of the Object class | Usually a static method of the String class |
| How to Call | obj.toString() | String.valueOf(obj) |
| Return Value | A string that represents the content of the object | A string created by converting the argument to type String |
| Behavior When Argument Is null | Throws NullPointerException | Returns the string “null” |
| Main Use Cases | Displaying object contents; debugging | Safely converting any value (including null) to a string |
toString을 사용해야 할 때
- 객체 상태를 사람이 읽기 쉬운 형식으로 표시하고 싶을 때
- 디버깅이나 로깅 중에 객체 내용을 확인하고 싶을 때
- 자신의 클래스에 맞게 출력을 커스터마이징하고 싶을 때(오버라이드)
valueOf를 사용해야 할 때
- 어떤 값이나 객체든 String으로 변환하고 싶을 때
- 값이 null일 가능성이 있어도 예외를 피하고 싶을 때
- null 안전성이 요구되는 표시나 로깅을 위해 값을 준비할 때
Object obj = null; System.out.println(String.valueOf(obj)); // Output: "null" System.out.println(obj.toString()); // NullPointerException
실용적인 사용 사례
- 클래스에서 명확하고 커스터마이징된 정보를 얻고 싶을 때 toString 사용
- null을 포함한 모든 것을 안전하게 문자열로 변환하고 싶을 때 String.valueOf 사용
추가 참고 사항
원시 타입의 경우 toString과 valueOf 모두 비슷한 결과를 반환합니다.
하지만 인수가 null일 가능성이 있을 때는 String.valueOf가 더 안전한 선택입니다.
8. toString의 실용적인 사용 패턴
toString 메서드를 적절히 구현하면 일상 개발 및 시스템 운영에서 많은 이점을 얻을 수 있습니다.
이 섹션에서는 실제 사용 사례와 팀 개발을 위한 모범 사례를 소개합니다.
디버깅 및 로그 출력
toString 메서드는 개발 및 운영 중 디버깅이나 로그 생성 시 매우 유용합니다.
예를 들어 예외가 발생하거나 실행 흐름을 추적하고 싶을 때, toString으로 객체 상세 정보를 출력하면 근본 원인 분석이 훨씬 빨라집니다.
Product p = new Product("バナナ", 120, "果物");
System.out.println(p); // Product{name=バナナ, price=120, category=果物}
Log4j나 SLF4J와 같은 로깅 프레임워크와 결합하면 오버라이드된 toString이 훨씬 명확한 로그 메시지를 생성합니다.

파일 저장 및 외부 시스템 연동
데이터를 텍스트 파일에 저장하거나 API를 통해 다른 시스템에 정보를 전송할 때, toString을 사용해 객체 데이터를 문자열로 변환할 수 있습니다.
toString 출력은 CSV나 JSON을 생성할 때 기본 자료로 활용될 수 있습니다.
UI(화면 표시)에서의 사용
Swing이나 JavaFX와 같은 Java GUI 프레임워크에서는 리스트나 테이블에 객체를 표시할 때 toString 메서드가 자주 사용됩니다.
toString의 반환값은 리스트 항목이나 테이블 셀에 직접 표시되는 경우가 많습니다.
DefaultListModel<Product> model = new DefaultListModel<>();
model.addElement(new Product("みかん", 100, "果物"));
// When the model is set to a JList or JTable, the toString output is used as the display text.
팀 개발을 위한 모범 사례
- 팀 전체에 걸쳐 toString에 대한 통일된 포맷 규칙을 설정합니다. 이는 로그와 디버깅 출력의 가독성과 일관성을 향상시킵니다.
- 대규모 데이터 구조를 요약하고 민감한 정보를 제외하는 등의 가이드라인을 설정합니다.
toString 메서드를 효과적으로 사용하면 개발 속도와 코드 유지보수성이 크게 향상됩니다.
9. 버전별 및 고급 정보
toString 메서드는 Java 초기 버전부터 존재했으며, 핵심 동작은 릴리즈 전반에 걸쳐 크게 변하지 않았습니다.
하지만 언어 기능과 코딩 스타일의 발전으로 개발자들이 toString을 구현하고 활용하는 방식에 영향을 미쳤습니다.
이 섹션에서는 버전 관련 주의사항과 최신 적용 사례를 다룹니다.
Java 버전별 차이점
- toString의 핵심 동작은 일관됩니다 Java 1.0부터 Object 클래스의 toString 메서드는 “ClassName@HashCode” 형식을 따왔습니다.
toString을 오버라이드하고 사용하는 방식은 모든 Java 버전에서 본질적으로 동일합니다. - 핵심 참고사항
- toString 동작 자체는 Java 버전 업데이트에 따라 변하지 않습니다.
- 일부 서드파티 라이브러리와 프레임워크는 toString 출력 맞춤 기능을 도입했습니다(예: Lombok의 @ToString 어노테이션).
현대 코딩 스타일 및 적용 사례
- 레코드 클래스 (Java 16 이상) Java 16에서 레코드가 도입되면서, 단순 데이터 캐리어는 자동으로 가독성 좋은 toString 구현을 생성합니다.
public record Book(String title, int price) {} Book book = new Book("Java入門", 2500); System.out.println(book); // Book[title=Java入門, price=2500]
- Lombok을 이용한 자동 구현 Lombok은 @ToString 어노테이션을 추가하기만 하면 toString 출력을 자동으로 생성합니다.
수동 구현에 시간이 많이 소요되는 대규모 프로젝트에 특히 유용합니다.import lombok.ToString; @ToString public class Item { private String name; private int price; }
요약
toString의 기본 동작은 Java 버전 전반에 걸쳐 일관되지만, 최신 기능과 라이브러리를 통해 개발자는 이를 보다 효율적이고 안전하게 구현할 수 있습니다.
프로젝트 요구사항과 팀 코딩 가이드라인에 따라 적절한 구현 방식을 선택하세요.
10. 요약 및 추천 관련 주제
toString 메서드는 객체 내용을 사람이 읽기 쉬운 형식으로 표현하는 Java 프로그래밍의 기본 기술입니다.
기본 구현은 충분한 정보를 제공하지 않으므로, 적절히 오버라이드하면 개발 효율성과 디버깅 생산성이 크게 향상됩니다.
이 글에서는 toString의 구조, 구현 방법, 흔한 실수와 트러블슈팅 팁, toString과 valueOf의 차이점 및 실용적인 사용 패턴을 다루었습니다.
제공된 샘플 코드와 가이드를 통해 초보자도 자신 있게 효과적인 toString 메서드를 구현할 수 있습니다.
핵심 요점
- toString는 Object 클래스에서 유래했으며 객체 정보를 사람이 읽기 쉬운 형태로 표시하는 데 사용됩니다.
- 기본 구현은 실용적이지 않으므로, 사용자 정의 클래스는 명확성을 위해 오버라이드해야 합니다.
- 구현 시 null 값, 순환 참조, 민감한 데이터를 주의해서 처리하세요.
- toString과 valueOf를 구분하는 방법을 이해하면 보다 유연하고 견고한 코딩이 가능합니다.
추천 관련 주제
- Java에서 equals와 hashCode 사용을 위한 모범 사례
- StringBuilder와 StringBuffer를 활용한 효율적인 문자열 처리
- IDE 도구(Eclipse, IntelliJ 등)를 활용한 실용적인 디버깅 기법
- Java에서 오류 처리(try-catch-finally)와 흔한 함정
- Lombok과 같은 유용한 라이브러리를 사용해 보일러플레이트 코드를 줄이기
To deepen your understanding further, explore the topics above.
You will find useful hints that help make your Java development more efficient, clean, and productive.
11. FAQ (자주 묻는 질문)
This section answers common questions about Java’s toString method—many of which also appear frequently in search suggestions.
Use this reference whenever you are unsure or encounter a related problem.
Q1. 항상 toString을 오버라이드해야 하나요?
A1.
필수는 아니지만, 객체 내용 확인이나 디버깅이 필요한 사용자 정의 클래스에서는 오버라이드하는 것이 강력히 권장됩니다. 기본 구현은 “ClassName@HashCode” 형태만 보여주어 실질적인 가치가 거의 없습니다.
Q2. valueOf와 toString의 차이점은 무엇인가요?
A2.
toString은 객체의 내용을 문자열로 반환하는 인스턴스 메서드입니다.
valueOf는 보통 String 클래스의 정적 메서드로, 어떤 값이나 객체든 문자열로 변환합니다.
핵심 차이는 null 처리에 있습니다:
- toString → NullPointerException 발생
- valueOf → 문자열
"null"반환
Q3. toString에 어떤 정보를 포함해야 하나요?
A3.
객체를 구별할 수 있는 특성이나 주요 필드를 포함합니다.
비밀번호, 개인 데이터 등 민감한 정보는 출력하지 않도록 합니다.
Q4. toString을 구현할 때 주의해야 할 점은 무엇인가요?
A4.
- 적절한 경우 null 값을 확인한다
- 순환 참조로 인한 무한 재귀에 주의한다
- 전체를 출력하기보다 큰 혹은 복잡한 데이터를 요약한다
- 보안 및 개인정보 보호에 유의한다
Q5. 오버라이드된 toString 출력값을 외부에 노출해도 안전한가요?
A5.
내용에 따라 다릅니다. 로그와 오류 보고서는 시스템 외부에서 접근될 수 있으므로, toString 출력에 민감하거나 기밀 정보를 절대 포함하지 않아야 합니다.
Q6. 재귀적이거나 계층 구조를 가진 클래스에 대해 toString을 어떻게 구현해야 하나요?
A6.
부모‑자식 관계나 양방향 링크와 같은 순환 구조는 무한 재귀를 일으켜 StackOverflowError를 초래할 수 있습니다. 효과적인 해결책은 다음과 같습니다:
- ID나 필수 필드만 출력한다
- 재귀 깊이를 제한한다
- 중첩 객체를 플레이스홀더(예:
[...])로 표시한다
Q7. IDE 디버거에서 toString 출력을 확인할 수 있나요?
A7.
예. 대부분의 IDE(Eclipse, IntelliJ 등)는 디버깅 중 객체를 검사하면 자동으로 toString 결과를 보여줍니다. toString을 맞춤 구현하면 디버깅 효율이 크게 향상됩니다.
toString 메서드는 겉보기엔 단순해 보이지만, 올바르게 사용하면 Java 개발 생산성과 코드 품질을 크게 높일 수 있습니다. 필요할 때마다 이 FAQ를 참고해 명확한 이해와 빠른 기억을 도우세요.
12. 다이어그램 및 비교 표
텍스트만으로는 toString과 valueOf 메서드의 차이점, 그리고 오버라이드된 출력과 오버라이드되지 않은 출력의 대비를 이해하기 어려울 수 있습니다. 이 섹션에서는 다이어그램과 비교 표를 활용해 핵심 포인트를 시각적으로 정리합니다.
[1] 비교: toString vs. valueOf
| Item | toString() (Instance Method) | String.valueOf() (Static Method) |
|---|---|---|
| Defined In | Object class | String class |
| How to Call | obj.toString() | String.valueOf(obj) |
| Handling of null | Throws NullPointerException | Returns the string “null” |
| Overriding | Recommended for custom classes | Not necessary (works with any type) |
| Main Usage | Displaying object contents; debugging | Safe and universal conversion to String |
| Customizability | High (fully customizable) | Low (fixed standard behavior) |
[2] toString 오버라이드 전후 출력 차이 (다이어그램)
[Before Override]
Product@3e3abc88
↑
(Only displays ClassName@HashCode)
[After Override]
Product{name=りんご, price=150, category=果物}
↑
(Displays meaningful field information!)
[3] toString 자동 호출 (개념 일러스트)
Product p = new Product("りんご", 150, "果物");
System.out.println(p);
// ↑ Automatically calls p.toString()
String text = "Product: " + p;
// ↑ Also automatically calls p.toString()
[4] 재귀 구조에서의 toString 예시
class Node {
Node child;
@Override
public String toString() {
// Calling child.toString() directly may cause infinite recursion
return "Node{" + "child=" + (child != null ? "[...]" : "null") + "}";
}
}
*재귀 클래스 구조에서는 순환 참조와 무한 루프를 피하는 것이 중요합니다.
이 다이어그램 및 표 모음은 toString 메서드가 어떻게 작동하는지, 그 이점 및 특별히 주의해야 할 핵심 포인트를 시각화하는 데 도움이 됩니다.
이 시각적 참조를 사용하여 더 명확하고 유지 보수가 쉬운 Java 애플리케이션을 설계하세요.


