[Movie.java]
public class Movie {
private int id;
private String title;
private String director;
private String genre;
private int runningTime;
public Movie() {
}
public Movie(int id, String title, String director, String genre, int runningTime) {
super();
this.id = id;
this.title = title;
this.director = director;
this.genre = genre;
this.runningTime = runningTime;
}
@Override
public String toString() {
return "Movie [id=" + id + ", title=" + title + ", director=" + director + ", genre=" + genre + ", runningTime="
+ runningTime + "]";
}
}
[MovieTest.java]
public class MovieTest {
public static void main(String[] args) {
IMovieManager mg = MovieManagerImpl.getInstance();
// 영화들 삽입
mg.add(new Movie(1, "제목1", "감독1", "장르1", 100));
mg.add(new Movie(2, "제목2", "감독2", "장르2", 200));
mg.add(new Movie(3, "제목3", "감독3", "장르3", 300));
mg.add(new SeriesMovie(4, "제목4", "감독4", "장르4", 400, 4, "ep4"));
mg.add(new SeriesMovie(5, "제목5", "감독5", "장르5", 500, 5, "ep5"));
// 리스트 가져오기
Movie[] list = mg.getList();
System.out.println("***********************getList()***********************");
System.out.println(Arrays.toString(list));
System.out.println(list.toString());
System.out.println();
}
}
위 코드를 작성하다가 궁금한 점이 생겼다. 코드를 보면 Movie
에서 toString()
메서드를 override
하고 있다.
그렇다면
System.out.println(Arrays.toString(list));
와System.out.println(list.toString());
의 출력값은 같을까?
그렇지 않음을 볼 수 있다. 윗줄의 출력이 System.out.println(Arrays.toString(list));
의 결과이고, 아랫줄의 출력이 System.out.println(list.toString());
의 결과이다.
둘다
toString()
메서드를 호출했는데 왜 이런 차이점이 발생할까?
Arrays.toString(arr)
는 java.util.Arrays
클래스에 정의된 정적 메서드이다. 이 메서드는 배열의 각 요소에 대해 toString()
메서드를 호출하고, 이를 문자열로 변환하여 반환한다. 즉, 배열의 모든 요소를 문자열로 변환하여 [element1, element2, ...]
형식의 문자열을 반환한다.
또한 override
를 하였을 경우 override
된 메서드가 호출된다.
arr.toString()
은 배열 객체 자체의 toString()
메서드를 호출하는 것이다. 자바에서 배열의 기본 toString()
메서드는 배열의 요소를 문자열로 변환하지 않고, 단순히 배열의 타입과 해시 코드를 포함하는 문자열을 반환한다. 이는 Object
클래스에서 상속된 기본 toString()
메서드를 사용하기 때문이다.
자바에서 배열 객체의 자체의 toString()
은 override
할 수 없다. 배열은 자바의 기본 데이터 타입으로, 배열 클래스(java.lang.Object
를 상속받은 배열 클래스)는 내부적으로 JVM
에 의해 관리되기 때문이다.
따라서 배열 객체 자체의 toString()
을 출력하면 무조건 배열타입과 해시코드를 포함하는 문자열이 반환된다.
결론적으로 내가 어떤 클래스에 toString()
을 오버라이드 했고, 해당 클래스 배열을 오버라이드 한 메서드를 통해 출력하고 싶다면 Arrays.toString()
을 사용해야한다.