JAVA

[JAVA] Collection Framework

728x90
반응형

제네릭

하나의 참조형이 아닌 여러 참조 자료형으로 사용할 수 있도록 프로그래밍하는 것

제네릭 메서드 : 메서드 선언부나 메서드의 매개변수로 자료형 매개변수 T를 사용한 메서드

  • 제네릭은 여러 참조 자료형이 쓰일 수 있는 곳에 특정한 자료형을 지정하지 않고, 클래스나 메서드를 정의한 후 사용하는 시점에 어떤 자료형을 사용할 것인지 지정하는 방식이다
  • 자료형 매개변수는 T외에 다른 문자도 사용이 가능하다
  • 참조 자료형이 변환될 때 검증을 컴파일러가 하므로 안정적이고 형 변환 코드가 줄어드는 특징이 있다
  • 자료형을 명시하지 않고 사용할 수 있다(그러나 참조 자료형을 지정하는 것을 권유)
  • extends 예약어를 사용 : 제네릭 클래스에서 T자료형에 사용할 자료형을 제한할 수 있다

cf. 어떤 변수가 여러 참조 자료형을 사용할 수 있도록 Object 클래스를 사용하면 다시 원래 자료형으로 반환해 주기 위해 매번 형 변환을 해야 하는 번거로움이 발생한다. 

 

 

컬렉션 프레임워크

자바에서 필요한 자료 구조를 미리 구현하여 java.util 패키지에서 제공하는 것

자바 컬렉션 프레임워크를 사용하면 직접 개발하는 수고를 덜 수 있고, 잘 만들어진 자료 구조 클래스를 활용할 수 있다.

출처 : https://hyuntaekhong.github.io/blog/java-basic25/

 

 Collection 인터페이스와 Map 인터페이스 기반으로 이루어져 있다. Collection 인터페이스는 하나의 자료를 모아서 관리하는데 필요한 기능을 제공하고, Map 인터페이스는 쌍으로 된 자료들을 관리하는데 유용한 기능을 제공한다.

 

Collection 인터페이스

  • 메모리 안에 데이터를 구조화시켜서 담을 수 있도록 구성한 자료 구조
분류 특징
List 인터페이스 순서 o, 중복 o
ArrayList, Vector, LinkedList, Stack, Queue 등 
Set 인터페이스 순서 x, 중복 x
HashSet, TreeSet 등

 

Map 인터페이스

  • 하나가 아닌 쌍(key-value)으로 되어 있는 자료들을 관리
  • key값은 중복될 수 없다.
  • 기본적으로 검색용 자료구조이다. key값을 통해 value를 찾을 수 있다.

 


Collection 인터페이스


List 인터페이스

ArrayList 클래스

객체 순서를 기반으로 순차적으로 자료를 관리하는 프로그램을 구현할 때 사용한다.

 

Vector 클래스

 ArrayList와 비슷하지만 Vector 클래스는 동기화를 지원하는 차이점이 있다. 두 개 이상의 스레드가 동시에 실행되는 경우를 멀티스레드라고 한다. 멀티스레드가 실행되면 같은 메모리 공간에 동시에 접근하기 때문에 오류가 발생할 수 있다. 이때 접근 순서를 지정해주는 것이 동기화이다. 동기화를 하게되면 호출되는 순서를 기다려야 하기 때문에 상대적으로 느리다. 

 멀티스레드 환경이 아닌 경우 ArrayList 사용이 효율적이다. 메서드를 호출할 때 배열 객체에 잠금하고, 메서드 수행이 끝나면 잠금을 해제하기 때문이다. Vector의 모든 메서드는 호출될 때마다 잠금과 해제가 일어나므로 ArrayList보다 수행 속도가 느리다.

 현재 잘 사용하지 않는 방식이다.

 

*스레드 : 작업 단위

 

LinkedList 클래스

 배열은 중간에 자료를 삽입하거나 삭제할 때 나머지 자료를 이동시켜 빈 공간을 만들지 않고 연속된 자료 구조를 구현한다. 또한 처음 선언한 배열 크기 이상으로 요소가 추가되는 경우에는 크기가 더 큰 배열을 새로 생성해서 각 요소를 복사해야 하는 번거로움이 있다. 이런 점을 개선한 자료 구조를 Linked list라고 한다. 

 

 링크드 리스트의 각 요소는 다음 요소를 가리키는 주소 값을 가진다. 같은 List 인터페이스를 구현한 ArrayList에 비해 중간에 자료를 넣고 제거하는 데 시간이 적게 걸린다는 장점이 있고, 크기를 동적으로 증가시킬수 있다

 

 배열은 생성 시에 용량을 정해주고, 용량보다 더 많은 요소가 추가될 때 용량을 늘려가며 수행된다. 반면 링크드 리스트는 요소를 추가할 때마다 동적으로 요소의 메모리를 생성한다. 사용하는 자료의 변동이 많은 경우 링크드 리스트를, 자료 변동이 거의 없는 경우는 *배열을 사용하는 것이 효율적이다. 

cf. 요소의 i번째 위치를 찾는 경우에는 배열이 물리적 구조로부터 확인할 수 있기 때문에 효율적이다. 

 

출처 : https://freestrokes.tistory.com/84

 


Set 인터페이스

  • 순서와 상관없이, 중복을 허용하지 않는 경우 Set 인터페이스를 구현한 클래스를 사용한다.
  • 대표 클래스로 HashSet과 TreeSet이 있다.

 

HashSet 클래스

집합 자료구조를 구현, 중복을 허용하지 않는다. ArayList는 순서가 있는 자료 구조이기 때문에 추가한 순서대로 출력되는 반면, Hash는 자료가 추가된 순서와 상관없이 출력된다.

 

TreeSet 클래스

자료의 중복을 허용하지 않으면서 출력 결과 값을 정렬하는 클래스다.

이진 검색 트리를 활용해서 왼쪽 → 부모 → 오른쪽 순으로 오름차순 정렬한다.

 

※ 정렬 인터페이스

Comparable, Comparator 인터페이스 : 정렬을 구현하게 해주는 인터페이스다

CompareTo()는 객체가 TreeSet에 요소를 추가할 때 호출되는 메서드(=콜백 메서드)다. 

Comparator

 


Map 인터페이스

 

HashMap 클래스

Map 인터페이스를 구현한 클래스 중 가장 많이 사용

자료 추가 속도나 검색 속도가 상당히 빠르다는 장점이 있다.

서로 다른 key 값에 같은 index가 반환되는 충돌이 발생하는 경우가 있다. 해시 테이블에 데이터를 꽉 채우지 않고 적정 수준이 되면 테이블을 확장해서 충돌 발생 확률을 낮춘다.

 

cf. HashMap vs Hashtable

HashMap 사용을 권장한다. 

 

TreeMap 클래스

key값으로 자료를 정렬하기 위해 사용할 수 있다.

TreeSet과 같이 이진 검색 트리로 구현되었다.

key 값으로 정렬하기 때문에 key값에 해당하는 클래스에 Comparable이나 Comparator 인터페이스를 구현해야 한다. 

추가되는 순서와 상관없이 key값을 기준으로 정렬된다.

 

 

 

※ ArrayList와 HashMap에 대해서는 정확하게 숙지할 것 

 

 

 

 

 

 

 

 

'JAVA' 카테고리의 다른 글

[JAVA] 자바의 특징  (0) 2022.04.15