지금까지 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
메소드에 대해 보겠습니다.
반환 타입이 당연히 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
메소드를 통해 현재 자료구조에 존재하는 요소인지 아닌지를 판단해준 후, 후처리를 진행하는 것이 더 읽기 좋은 코드라는 생각을 했습니다.
물론, 알고리즘이나 코딩테스트에서는 자주 사용할 수도 있을 것 같지만, 그 외에는 아직 잘 모르겠네요.. 만약 이에 대한 추가적인 고민과 조언을 받게 된다면 포스팅에 업데이트 하겠습니다 😀