Set인터페이스 add메소드의 반환 타입

강상우·2021년 6월 30일
0

Java

목록 보기
2/2

개요

지금까지 Set 인터페이스의 구현체들의 add 메소드를 사용하면서 반환타입이 void일 것이라는 생각을 가지고 개발을 해왔습니다.
하지만 Set 인터페이스에 정의되어있는 메소드들이 무엇이 있을지 살펴보던 중, add 메소드에 반환 타입이 void가 아니라는 사실을 알게 되었습니다.
이 부분에 대해 기록을 해두려 합니다.

이전의 방식

간혹 코딩을 할 때, Set 자료구조에서 저장하고 있지 않은 원소를 처음 넣는 상황에 특정한 행위를 해야하는 코딩을 해야한다고 해보겠습니다.

int[] elements = {1, 2, 3, 1, 4, 5, 2, 3, 5};
Set<Integer> set = new HashSet<>();
for (int element : elements) {
    if (!set.contains(element)) {
        System.out.println(element + "는 처음 저장되는 요소입니다");
    }
    set.add(element);
}

지금까지는 이렇게 Set에서 정의해둔 contains 메소드를 이용하여 처음 저장되는 원소인지 아닌지를 판단했었습니다.

Set의 add 메소드의 반환타입

먼저 Set 메소드에 정의되어있는 add 메소드에 대해 보겠습니다.

반환 타입이 당연히 void일 것으로 생각했던 제 예상과 다르게 인터페이스에서는 boolean 타입으로 정의하고 있습니다.

Returns: true if this set did not already contain the specified element

인터페이스에서 작성해둔 반환 타입에 대한 내용을 보니, 현재 자료구조에 저장하려하는 요소가 아직 자료구조에 없을 경우에 true를 반환한다고 적혀있습니다.
즉, 처음 Set에 저장되는 요소가 삽입될 때는 true를 반환하게 되는 것입니다.
이를 통해서 조금 더 간결한 코드를 작성할 수 있을 것 같습니다.

새로운 방식

int[] elements = {1, 2, 3, 1, 4, 5, 2, 3, 5};
Set<Integer> set = new HashSet<>();
for (int element : elements) {
    if (set.add(element)) {
        System.out.println(element + "는 처음 저장되는 요소입니다");
    }
}

add 메소드의 반환타입을 활용하면 이러한 코딩을 할 수 있게 됩니다.

의문점 및 마무리

간결한 코드라는 입장에서 봤을 때는, 새로운 방식이 충분히 더 매력적으로 보입니다.
그런데 가독성 측면에서 봤을 때 과연 새로운 방식이 주는 이점이 있을까? 라는 의문을 가지게 되었습니다.
Set 자료구조의 특성 상, 중복이 존재하지 않는 자료구조이기 때문에, 현재 Set에 존재하지 않는 원소가 삽입될 때 true를 반환해주는 것은 올바른 반환타입이라고 생각합니다.

제 주관적인 생각이지만, 저는 contains 메소드를 통해 현재 자료구조에 존재하는 요소인지 아닌지를 판단해준 후, 후처리를 진행하는 것이 더 읽기 좋은 코드라는 생각을 했습니다.

물론, 알고리즘이나 코딩테스트에서는 자주 사용할 수도 있을 것 같지만, 그 외에는 아직 잘 모르겠네요.. 만약 이에 대한 추가적인 고민과 조언을 받게 된다면 포스팅에 업데이트 하겠습니다 😀

profile
https://sangwoo0727.github.io/ 기존 블로그 이전 중입니다.

0개의 댓글