카테고리 없음

Quere 자료구조에서 add 와 offer의차이

JUNGKEUNG 2024. 7. 26. 23:26
반응형

Queue 인터페이스를 사용하는 도중 add와 offer는 같은 동작을 하는 것 같은데, 왜 분리되어 있을까? 어떤 차이가 있을까? 라는 생각이 들어 이번에 알아 보았다.

 

public interface Queue<E> extends Collection<E> {
	boolean add(E var1);
    
    @Contract(mutates = "this")
    boolean offer(E var1);
}

 

소스를 보면 둘다 boolean 으로 반환한다. 보통 Queue는 LinkedList 자료구조를 활용하기 때문에 LinkedList에서는 어떻게 구현하고 있는지 확인 해보자.

 

public boolean add(E e) {
    this.linkLast(e);
    return true;
}
public boolean offer(E e) {
    return this.add(e);
}

 

소스 코드로 구현 원리를 파악할 수는 있지만 offer도 결국 add를 사용하는 것처럼 보였다.

그렇다면 add와 offer가 분리된 명확한 이유를 알아보자.

 

 

add와 offer의 차이


Collection 인터페이스에서 add 메서드의 반환 값은 항상 true이다. 따라서 Queue 인터페이스를 구현한 클래스에서 add를 사용하면 요소가 성공적으로 추가되었는지에 대한 정보를 알 수 없다. 하지만 Queue의 제한된 용량을 초과하여 요소를 추가하는 경우 예외를 발생시킨다.

 

offer 메서드 역시 Queue 인터페이스를 구현한 클래스에서 사용하는 메서드로 요소가 성공적으로 추가되었을 때는 true를 반환한다. 그리고 Queue의 용량을 초과하여 요소를 추가할 경우에는 false를 반환한다. 따라서 요소가 추가되었는지에 대한 성공 여부를 확인할 수 있다.

 

 

Script


알고리즘 문제를 풀 때 Queue를 사용했는데, 만약 용량 제한이 있는 경우, 데이터를 추가하기 전에 용량을 확인하고자 하면 offer를 사용하는것이 좋을거 같다. offter 메서드는 데이터의 추가 성공 여부를 반환하기 때문에 용량을 체크 할 수 있기 때문이다.