# toString() 메소드가 호출 이유?
아래식에서 System.out.printf("list.get(%d) -> %s\n",i,list.get(i)); 이 부분이 정상작동되는게 이해가 안갑니다.
get()함수를 통해 객체를 읽어 들이는것까지는 알겠는데 여기서 toString()메소드까지 반환되어서 출력이 되는 이유를 모르겠습니다.
list.get(i).toString() 혹은 list.get(i)를 X(변수)에 넣어줘서 X(변수).toString()까지 해줘야하는게 아닌가요? 그런데 toString()함수를 안붙여도 정상적으로 출력이 되는 이유를 모르겠네요
## CODE <a class='btn btn-default' href='/codes/16308'>Link</a>
```
import java.util.ArrayList;
public class BookTest {
public static void main(String[] args) {
/* 1. Book을 담기 위한 ArrayList 객체를 만드시오. */
ArrayList<Book> list = new ArrayList<Book>();
/* 2. Book 객체를 생성하시오. */
Book onePieces = new Book("원피스",4500);
Book naruto = new Book("나루토",4000);
Book javaPrograming = new Book("자바 프로그래밍",24000);
/* 3. ArrayList 객체에 Book 객체들을 담으시오. */
list.add(onePieces); // 원피스 객체 담기
list.add(naruto); // 나루토 객체 담기
list.add(javaPrograming); // 자바 객체 담기
/* 4. 리스트에 담긴 모든 책 정보 출력 */
for(int i=0;i<list.size();i++){
System.out.printf("list.get(%d) -> %s\n",i,list.get(i));
}
}
}
class Book {
// 필드
private String title;
private int price;
// 생성자
public Book(String title, int price) {
this.title = title;
this.price = price;
}
// 메소드
public String toString() {
return String.format("Book { name: %s, price: %d }", title, price);
}
}
```
## INPUT
```
```
## OUPUT
```
list.get(0) -> Book { name: 원피스, price: 4500 }
list.get(1) -> Book { name: 나루토, price: 4000 }
list.get(2) -> Book { name: 자바 프로그래밍, price: 24000 }
```
sehongpark님의 답변
# toString() 메소드 출력 이유
레퍼런스 변수를 출력하면, 자동으로 toString() 메소드가 호출 됩니다. 그 이유는 자바의 암묵적 룰이기 때문입니다.
```
// 객체 생성
Hero hero = new Hero();
// 객체 출력
System.out.println(hero); // hero.toString() 메소드가 호출 되고, 이를 출력
```
gunyunghi님의 답변
앗 저도 잘 보고 갑니다.
likethebegin님의 답변
저도 이부분이 궁금했는데 감사합니다!