자바 TreeSet 클래스
목차
자바 TreeSet 클래스는 이진 검색 트리를 구현한 자료형입니다. 역시 Set 인터페이스의 특징으로 중복이 제거됩니다.
binaray tree 에 따른 자동정렬과 unique element 가 이 자료구조의 특성입니다. 그리고 이진 검색 방식은 데이터가 쌓여있어도 가운데를 퉁쳐서 검색하기 때문에 순차적인 자료구조에 비해 속도가 빠릅니다.
이진 검색 트리는 대학의 알고리즘 수업에서 가르치는 가장 기본적인 자료구조입니다. 이진 검색 트리라는 말 그대로 2의 제곱 방식으로 증식하는 구조로 자료를 저장합니다. 각각의 자료 블록을 노드(Node)라고 하는데 그림으로 보면 아래와 같습니다.
처음에 숫자 5를 넣는다면 부모노드에 들어갑니다. 그 다음 6을 넣으면 오른쪽 자식 노드에 들어가고 3을 넣으면 왼쪽 자식 노드에 들어가는 방식으로 왼쪽이 아래쪽 숫자가 들어가고 오른쪽에 큰 숫자가 들어갑니다. 규칙에 따라 계속 숫자를 넣다 보면 오름차순으로 정렬이 됩니다.
이진 검색 검색 트리는 알고리즘으로 구현해보면 좀 어렵습니다. 컬렉션 프레임워크의 메소드 정도를 쓸 수 있더라도 알고리즘의 실제 구현은 다릅니다. 알고리즘 수업을 할 때 이진 검색 트리를 반드시 구현해 보는 것을 추천합니다. 참고로 이진검색과 이진검색 트리는 다른 것입니다.
C언어로 구현하는게 더 간지가 나지만 자바로도 구현할 수 있습니다. 알고리즘은 대체적으로 자바로 구현하는게 쉽습니다. 이중 포인터 같은 것을 쓰지 않기 때문이죠.
컬렉션 프레임워크에서 TreeSet 의 사용법 자체는 매우 쉽습니다.
TreeSet 클래스 예제
package com.kay; import java.util.TreeSet; public class Main { public static void main(String[] args) { TreeSet<Integer> numTree = new TreeSet<>(); numTree.add(3); numTree.add(2); numTree.add(5); numTree.add(4); numTree.add(7); numTree.add(9); numTree.add(8); numTree.add(1); // 중복테스트 numTree.add(1); numTree.add(8); for (Integer it : numTree){ System.out.print(it + ", "); } } } class MyMemo{ private int memoId; private String memoText; public MyMemo(int memoId, String memoText) { this.memoId = memoId; this.memoText = memoText; } public void showMemo(){ System.out.print("[instance] = " + this.toString() + ", "); System.out.print("[Id] " + memoId + ", "); System.out.print("[Text] \'" + memoText + "\'"); System.out.println(); } }
1, 2, 3, 4, 5, 7, 8, 9,
TreeSet 도 제네릭 클래스로 Integer 를 넣어 봤습니다. 1부터 9까지 아무렇게 넣어보면 중복을 제거해주고 오름차순으로 순서를 잡아줍니다. for 문이 돌아가니까 검색도 적당히 if 문을 넣어서 (it == 검색) 해주면 됩니다.
다른 컬렉션 프레임워크를 사용해봤다면 인터페이스가 같거나 비슷해서 TreeSet 을 사용하는 방법 자체는 그리 어렵지 않습니다.
요약
자바 TreeSet 클래스에 대한 대상의 설명과 Collection 의 사용법에 대하여 살펴봤습니다. 사실 Collection 을 만들어 놓은 것을 보면 알고리즘을 몰라도 대충 사용할 수 있게 만들어 놓은 측면도 있습니다. 사용하는 사람의 입장에서는 매우 편합니다. 프로그래머 일반 유저 할 것 없이 모든 것이 편하게 진화하는 것이 최근의 흐름으로 보입니다.
그렇다고 해서 알고리즘 공부를 게을리 하는 것은 별로 도움이 되지 않습니다. 그런 Collection 클래스라는 것도 시간이 지나면서 계속 진화할 것이고 원리적인 것을 파악하지 않으면 또 뒤쳐지기가 쉽습니다.
사용자 정의 자료형 VS 프레임워크 자료형 에 대한 논란은 꾸준히 있어왔습니다. 이것은 본인이 어떤 방향성을 추구하는 것과 관련이 있다고 봅니다. 앱 개발을 지향하는가 시스템 개발을 지향하는가? 예전에는 이런 질문이 필요없을 정도로 모든 것을 알아야 했다면 지금은 점점 더 기술이 복잡해지면서 ‘컴퓨터 프로그래밍 전체’ 라는 퉁치는 기술이라는 것은 없습니다. 표현하기를 ‘프로그래머는 죽을 때 까지 새로운 것을 배워야 한다, 모든 것을 마스터할 수는 없다’ 라는 생각으로 이어지기도 했는데요.
결국 이런 논란은 기술이 발전하면서 분야가 세분화 되면서 일어나는 일입니다. 기술자체가 얼마 없던 시대에는 같은 양의 노력을 해도 다방면을 취급할 수 있습니다. 문제는 점점 그게 어려워진다는 것 입니다.
개인적인 의견을 가져본다면 자신의 분야에 최선을 다하다 보면 다른 분야의 기술은 까막눈이 될 수도 있습니다. 다른 분야를 배우지 않아도 되는 기술이 있다면 그것을 채용하는 것도 하나의 열린 방법이라고 봅니다. 그것이 2000년대 이후에 컬렉션 프레임워크가 성공한 이유라고 볼 수 있습니다.
참고문서
Implementing a Binary Tree in Java | Baeldung
Binary Search Tree | Set 1 (Search and Insertion) – GeeksforGeeks
A Guide to TreeSet in Java | Baeldung
Java TreeSet Tutorial with Examples | CalliCoder
Java TreeSet (With Examples) (programiz.com)
TreeSet in Java – GeeksforGeeks