2023. 11. 5. 16:30ㆍjava
해당 게시글을 참고하여 정리하였습니다.
[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 |