자료구조

[자료구조]Java Collection에 대하여

Dodledd 2024. 2. 7. 20:57

오늘은 글을 쓰지 않은 이틀 동안 배운 자바의 프레임워크 중 Java Collections Framework(JCF)에 대하여 알아보도록 하겠다!

 

Collection이란?

Java에서 Collection은 데이터들의 집합소라고 보면 된다.

-> 그럼 무슨 특별한 데이터길래 집합해서 따로 모아놓은 거야?라고 생각이 들 수도 있다.

그럼 무슨 특별한 데이터인지 쉽게 알아보자.

현실세계의 정리방법, 효율적인 운영방법 이런 것들을 데이터 세계로 옮길 때 어떻게 해야 데이터 세계에서 효율적으로 정리, 활용이 가능할까 하며 천재들이 생각한 방법이다. 우리는 이것을 자료구조라고 부른다.

 

각 자료구조들마다 특징이 있다. 순서를 잘 지키는 녀석.. 검색이 빠른 녀석.. 저장을 잘하는 녀석... 등등

비유는 여기까지 하고 진짜 알아보자. [각주:1]

 

먼저 밑에 표를 봐보자

 

이게 뭐지 싶겠지만 그냥 있는 그대로 받아들이면 된다.

우리는 상속(extends)과 구현(implements)을 공부했기때문에 이 표를 보기에는 그렇게 어렵지 않다.

 

먼저 1대장 Iterable [각주:2]

 

그 밑 2대장의 Collection은 크게 3개의 자식을 두고있다.

이번 글에서는 간단하게 특징만 파악하고 더 자세한 특징과 사용법은 따로 작성을 하도록 하겠다!

첫째자식 List !

List의 자식으로

  1. LinkedList : 마치 지하철같은 열차를 생각하면 된다. 1호차는 2호차를 가리키고 있고 그 2호차는 3호차를 가리키고 있고... 느낌으로 서로 뒷 객체의 주소값을 참조(링크)하고있다, 단방향 양방향 포인터 구조가 있다.
  2. Stack : 값 하나를 넣으면 그 위로 차곡차곡 올라가는 벽돌을 쌓는 기분이다. 선입후출. 먼저넣은건 가장 나중에 볼 수 있다.
  3. Vector : 구시대 ArrayList의 조상님 격이다. 다른점으로는 메소드의 synchronized의 키워드가 있다.[각주:3]
  4. ArrayList : 우리가 사용했던 배열과 비슷한 형태이다. 인덱스로 접근하여 조회, 삽입이 가능하다.

둘째자식 Set!

Set에 자식에는

  1. HashSet : 접근해서 값을 가져오거나 할 때 아주 빠른 성능을 내는 자식이다. 대신 정렬(순서유지)가 되지 않으며 중복을 허용하지 않는다.
  2. TreeSet : 이진 탐색 트리 형태로 데이터를 저장한다. 이 친구는 정렬은 기본 타입형에 대해 기본으로 제공한다. String, Int....  하지만 객체끼리 정렬하는 기준같은 건 기본으로 제공하지 않아서 개발자가 직접 정렬방법을 지정해줘야한다. 마찬가지로 중복을 허용하지 않는다.

셋째자식 Queue

Queue의 자식에는

  1. LinkedList : 분명 위에서 봤던 친구 같은데 같이 있다. 기능상 List에 있는 거랑 똑같지만 족보가 좀 꼬여있어 보인다.
  2. PriorityQueue : 우선순위를 정의해서 넣어줄 수 있다. 선입선출, 선입후출 이런거 없이 그냥 우선 순위 높은 녀석이 먼저 탈옥한다.

 

입양한 자식 Map!

이 친구는 진짜 입양한 자식이다. Collection 인터페이스를 상속받고 있지않지만 Collection으로 분류가 됐다.(제가 그런 거 아닙니다.)

Map을 구현한 클래스들은 다들 키(Key), 값(Value)의 쌍을 가지고 있다. Key값은 중복을 허용하지 않지만 Value 값은 괜찮다며 덮어씌워버린다.

  1. Hashtable : 병렬처리를 하거나 자원의 동기화가 필요한 경우에 사용, Key값의 중복을 허용하지 않지만 Value값은 중복을 허용하여 두 개의 Key가 한 개의 값(Value)를 가리킬 수 있다. null 입력이 불가능하다.
  2. HashMap : Map을 대표하는 자식이다.Hashing을 사용하기 때문에 많은 양의 데이터를 검색하는데 뛰어난 성능을 보이며 Entry객체[각주:4] 를 저장하는 구조를 가지고 있다.
  3. TreeMap : TreeSet 과 동일하게 이진 탐색 트리 형태로 데이터를 저장하지만 Set의 자식이 아닌 Map의 자식이기 때문에 Map의 특성을 따라간다 = Entry 객체 형태로 저장, 정렬과 검색에 특화된 자료구조이다.

 

 

 

 

 

 

 

 

 

  1. 원래 모르는 단어나 글을 보면 어렵다. 그럴 땐 우리 뇌를 속여야 한다. 이거 별거 아닌데?  (쉬운 거 생각하며) 이거 아니야? [본문으로]
  2. 왜 Collection은 Iterable을 상속했을까? 그 이유는 크게 보면 자바의 1목적인 객체지향이라서 그렇다. Iterable 인터페이스 안에는 iterator가 추상메소드로 선언이 되어있다. 알게모르게 우리가 Collection에 속해있는 List, Set, Queue를 출력하고 싶을 때 사용했던 메소드이다. 그럼 Iterable 인터페이스의 역할이 Collection에 속해있는 하위 클래스들에서 iterator 메소드를 무조건 구현하게 하기 위해서 라는 것을 알 수 있다..  [본문으로]
  3. synchronized는 멀티 쓰레드 환경에서 하나의 변수에 여러개의 쓰레드가 접근하려 할 때 그것을 막고 나는 한 개의 쓰레드만 받고 모든일이 끝나면 다시 열어놓을거야. (한 마디로 멀티 쓰레드 환경에서 안전하게 작동가능하다). 하지만 치명적인 단점도 있다. 그건 나중에 알아보자 [본문으로]
  4. 키(Key)와 값(Value)를 각각 Key 객체, Value 객체로 저장하는 것 [본문으로]