자바 collection 개념

2023. 11. 5. 16:30java

 

해당 게시글을 참고하여 정리하였습니다.

 

[Java] 자바 - Collection이란? (컬렉션과 제네릭)

자바 - Collection이란? (컬렉션과 제네릭) 컬렉션(collection)은 많은 데이터 요소를 효율적으로 관리하기 위한 자료구조를 말하며, ArrayList, LinkedList, HashMap 등이 여기에 포함됩니다. 그리고 이 컬렉션

kadosholy.tistory.com

 

순서가 있는가? 데이터의 중복을 허용하는가?

Set : 중복이 허용되지 않음

List : 순서가 있음 . 중복 허용.

Map : 키의 중복이 허용되지 않음. Value는 중복 가능

 

 

1. 데이터를 동적으로 추가할 수 있고,

2. 데이터를 삭제할 수 있으며,

3. 데이터의 포함여부를 확인할 수 있다.

4. null 여부를 검증할 수 있고 사이즈를 체크할 수 있다.

5. 사이즈, 반복자, 배열로 반환할 수 있다.

 

check point

Collection을 상속받는 ArrayList를 살펴보면서 해당 인터페이스에 대해 감을 잡아보자.

 

ArrayList는 AbstractListf라는 추상 클래스를 상속받고 여러 인터페이스를 다중 상속받고 있다.

 

 

 

1. remove할 때 해당 객체가 없다면 예외가 발생하는가?

 

List Interface에 정의되어있고 이를 ArrayList가 오버라이딩 했다.

    boolean remove(Object o);

 

    public boolean remove(Object o) {
        final Object[] es = elementData;
        final int size = this.size;
        int i = 0;
        found: {
            if (o == null) {
                for (; i < size; i++)
                    if (es[i] == null)
                        break found;
            } else {
                for (; i < size; i++)
                    if (o.equals(es[i]))
                        break found;
            }
            return false;
        }
        fastRemove(es, i);
        return true;
    }

AbstracList의 remove는 해당 코드로 작성되어있다.

여기서 생소한 부분은 found: 와 break found;이다.

해당 부분은 레이블(labeled) 문장을 사용한 제어문으로 break 시 found 밖으로 빠져나가서 return false를 만나지 않고

fastRemove를 실행할 수 있게 된다.

Object는 자바의 최상위 클래스로 모든 자료형을 다 받을 수 있고 같은 것이 있다면 가장 먼저 발견된 인덱스의 데이터를 삭제한다. 

예외를 발생시키지는 않고 성공 여부를 반환한다.

코드를 보면 예외를 발생시키지 않고 성공, 실패 여부만을 반환함을 알 수 있다.

 

elementData

transient Object[] elementData;

위의 코드로 필드 변수로 선언되어있고 초기 ArrayList 생성자에 의해 Object들이 담긴다.

 

 

2. removeAll은 어떻게 구현되는가?

    boolean batchRemove(Collection<?> c, boolean complement,
                        final int from, final int end) {
        Objects.requireNonNull(c);
        final Object[] es = elementData;
        int r;
        // Optimize for initial run of survivors
        for (r = from;; r++) {
            if (r == end)
                return false;
            if (c.contains(es[r]) != complement)
                break;
        }
        int w = r++;
        try {
            for (Object e; r < end; r++)
                if (c.contains(e = es[r]) == complement)
                    es[w++] = e;
        } catch (Throwable ex) {
            // Preserve behavioral compatibility with AbstractCollection,
            // even if c.contains() throws.
            System.arraycopy(es, r, es, w, end - r);
            w += end - r;
            throw ex;
        } finally {
            modCount += end - w;
            shiftTailOverGap(es, w, end);
        }
        return true;
    }

 

핵심은 위의 함수이고 collection을 비교하여 삭제하는걸 알 수 있다. 해당 함수는 collection이 null일 때 예외를 발생시킨다.

 

3. remove를 할 때 index로 삭제한 경험이 있는데 이건 뭘까?

메소드 오버로딩! 타입과 매개변수가 다르면 같은 이름의 메소드를 정의할 수 있다.

 

해당 코드 또한 List Interface에 정의되어있고 이를 ArrayList가 오버라이딩 했다.

    E remove(int index);
    public E remove(int index) {
        Objects.checkIndex(index, size);
        final Object[] es = elementData;

        @SuppressWarnings("unchecked") E oldValue = (E) es[index];
        fastRemove(es, index);

        return oldValue;
    }

 

@SuppressWarnings("unchecked") 어노테이션을 통해 unchecked 에러를 억제시키는 역할을 한다.

 

checked exception?

  • 컴파일 시점에 컴파일러에서 확인하는 예외
  • txt 파일을 가져오려는데 파일이 있는지 없는지는 컴파일 시점에 알 수 있다.

unchecked exception?

  • 런타임 시점에서 확인 할수 있는 예외
  • 배열의 크기를 입력받고 동적으로 할당받는데 배열보다 넘는 인덱스를 참조하는건 런타임 시점에 알 수 있다.

remove에는 이러한 주석이 있는데 개발할때 이러한 주석을 추가해도 좋겠다는 생각을 했다.

'java' 카테고리의 다른 글

자바 String Literal, String Object? immutable?  (0) 2023.11.05
자바 심화 체크리스트  (0) 2023.11.05
우테코 3회차 정리  (0) 2023.11.03
도메인/비지니스 로직  (0) 2023.11.03
[우테코] 프리코스 2주차 소감  (0) 2023.11.01