본문 바로가기

언어/Java

컬렉션 프레임워크(Java Collection Framework)

※ 컬렉션 프레임워크(Java Collection Framework)

JCF라이브러리, 자료구조용 라이브러리. 크기가 가변적이다. 늘어난다.

cf) 배열 :  크기가 고정되어 있는 단점이 있지만 처리속도가 가장 빠른 자료구조형이다.

 

예전에는 자료구조형라이브러리는 Vector,  Hashtable 뿐이었는데 Java JDK 1.2 ver (=java 2 ver) 이후부터 자료구조형라이브러리가 많이 생김

 

컬렉션 객체의 종류

※ UML(Unified Modeling Language) 표기법에 따라 실선은 클래스 간의 연관 관계(Association)
점선은 의존성(Dependency), 집합(Aggregation), 합성(Composition) 등의 관계
여기서는 Java Util의 Collection 인터페이스를 List와 Set이 상속받고 있으며, 점선은 인터페이스를 구현한 하위클래스 관계(위에꺼로 부터 상속받는 하위클래스)이다. Map은 맵으로 부터 구현된 하위클래스란 뜻.

상위클래스는 하위클래스의 공통점을 모아둔 것.

 

※ Collection 계열

자료가 value만 저장하는 구조, 배열보다는 처리속도가 떨어짐

List는 index 제공, 마치 배열처럼 사용 가능 - 중복허용, 순차저장 허용(순서 유지됨).
Set은 index 제공안함 - 중복 안됨, 순차저장 안됨 ex) 로또숫자 관리

 

ArrayList : 스레드에 동기화처리 안됨, Vector에 비해 처리속도가 빠름, 배열처럼 쓰지만 크기를 가변적으로 늘려쓸 수 있음
Vector : 이미 스레드에 동기화처리 되어있음, 멀티스레드에서 처리속도가 ArrayList보다 좀 떨어짐, Vector는 추가/삭제할때마다 lock 걸고 끝나면 lock 해제. (동기화처리 = 잠금장치)

HashSet: Hashcode를 사용. 자료구조에서 Hash들어가면 Hashcode 값으로 검색
TreeSet : Tree가 들어가면 정렬됨

 

※ Collection 대표 메서드
- size() = 저장되있는 요소의 갯수 반환, 배열의 length처럼.

List는 크기를 배열처럼 표안에 순서대로 들어있다 생각, Set은 주머니에 들어있다고 생각하면 된다.

- add(object) = 자료 저장(자료가 저장될 때 최상위 Object 타입으로 upcasting되서 저장)

- iterator :
인덱스에 반환/조회하는 get(int) 메서드는 없음. 
대신 List에는 get(int) 메서드 있음, set은 get(int)는 없고 자료를 하나씩 다 iteration 다 반복시켜야함.

iterator 라는 메서드 컬렉션에서 제공, 요소 하나씩 찾아가는 반복을 하겠다는 뜻
-  remove() : 삭제할 때

 

 

※ Map 계열
값에 해당하는 key와 값을 같이 저장, Key를 제공하기 때문에 빠른 검색 가능

key-value 가 쌍을 이뤄서 저장됨. key는 중복되지 않는다. index 제공안함. 순차저장 안됨

 

HashTable : 스레드 동기화 처리됨, 속도↓
HashMap : 스레드 동기화 처리안됨, 속도↑
TreeMap은 키를 정렬해버림

 

Map 대표 메서드
- put(key object타입, value object타입): 자료추가, object 타입으로 String 이나 Product value값으로 자동 업캐스트
- size()
- remove(key)
- get(key) // 키에 해당하는 value를 찾을 때

※ Properties

Properties는 Hashtable의 자식 클래스이기 때문에 Hashtable의 특징을 그대로 가지고 있다.

Properties는 키와 값을 String 타입으로 제한한 컬렉션. 주로 확장자가 .properties인 프로퍼티 파일을 읽을 때 사용.

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger

= 왼쪽의 username 을 프로퍼티 이름이라고 하며, 오른쪽의 scott을 프로버티 value라고 한다.

일반적으로 프로퍼티 파일은 클래스 파일들과 함께 저장된다.

수정이 되면 재컴파일 해야하는데, user가 직접 결정하지 않고 Properties를 통해 클래스 생성해서 쓰면 컴파일 안해도 됨.

코드 수정 없이 프로퍼티 파일을 수정하여 원하는 클래스를 지정, 설정 정보를 변경할 수 있다.
ex) ProductDAOArray dao = new ProductDAOArray(); 이렇게 user가 객체 지정해야하는걸, 어떤 객체를 만들지 결정권은 my.properties에게 넘길 수 있다. "ProductDAOInterface"를 구현한 다양한 클래스들이 있을 때, 어떤 구현체를 사용할지 애플리케이션의 실행 시점에 결정하고 싶다면, 프로퍼티 파일에 해당 클래스 이름을 기록한 후, 애플리케이션에서 프로퍼티 파일을 읽어와 동적으로 클래스를 로드하고 객체를 생성할 수 있다. 

'언어 > Java' 카테고리의 다른 글

제네릭(element generic), ArrayList, HashSet 예시  (0) 2023.08.04
향상된 for문  (0) 2023.08.04
어노테이션(Annotation)  (0) 2023.08.04
상속 예제문제  (0) 2023.08.04
가변길이 매개변수  (0) 2023.08.04