JAVA

[JAVA] List, Set은 선언된 변수만으로 컬렉션의 내용이 찍힌다

hail2y 2025. 1. 11. 19:32

AbstractCollection 추상 클래스

 

Collection 인터페이스는 List와 Set 인터페이스의 공통된 부분을 뽑아 정의한 것이다. 이 Collection 인터페이스를 일부 구현한 게 추상 클래스인 AbstractCollection이고, 그 아래 AbstractList와  AbstractSet이 있다. 이들 또한 추상 클래스들이고 우리가 많이 사용하는 ArrayList, HashSet 등이 이들을 상속하여 사용하고 있다. 

 

어찌됐건 내가 궁금했던 것은 List와 Set 인스턴스를 출력할 때 왜 변수만으로 객체 주소가 아니라 컬렉션의 내용이 출력되는지였다. 그 이유는 아래와 같이 이들의 조상인 AbstractCollection에서 toString() 메서드를 오버라이드했기 때문이다. 

AbstractCollection의 toString() 메서드

예제를 보면 쉽게 이해할 수 있다. 작성된 코드는 자바의 정석 예제를 일부 수정하였다. [참고:https://www.youtube.com/watch?v=JYcFX4O2kqM]

import java.util.*;

class Main {
    public static void main(String[] args) {
        Object[] objArr = {"1",new Integer(1),"2","2","3","3","4","4","4"};
        Set set = new HashSet();

        for(int i=0; i < objArr.length; i++) {
        set.add(objArr[i]);	// HashSet에 objArr의 요소들을 저장한다.
        }
        
        // HashSet에 저장된 요소들을 출력한다.
        System.out.println(set); // [1, 1, 2, 3, 4]
		
        List list = new ArrayList();
        for(int i=0; i < objArr.length; i++) {
            list.add(objArr[i]);	// HashSet에 objArr의 요소들을 저장한다.
        }
		
        // ArrayList에 저장된 요소들을 출력한다.
        System.out.println(list.toString()); // [1, 1, 2, 2, 3, 3, 4, 4, 4]
    }
}

https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html
https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html

 

이들의 공식 문서를 참고해 보면 위처럼 AbstractCollection으로부터 상속받은 메서드라고 나오는 것을 알 수 있다.