나의 IT일지
컬렉션 프레임 워크 본문
상황에 따라서 자료가 어떻게 저장되어야 효율적으로 데이터를 사용할 수 있는지 달라진다. 그래서 상황에 따라 자료를 어떻게 저장하는지 정의할 필요가 있다. 이때, 자료들을 저장할 때, 효율적인 구조형태를 자료구조라고 하며, 상황에 따라서 자료를 효율적으로 사용하기 위해서 자료구조를 사용한다.
그리고 자바에서는 이러한 자료구조에 저장되어 있는 데이터를 효율적으로 다루기 위한 클래스의 집합이 있는데, 이를 컬렉션 프레임 워크라고 한다.
컬렉션 프레임 워크
프레임 워크란 문제를 해결하기 위해서 사용 방법을 정해놓은 기본 틀, 골조로, 객체를 저장해서 데이터를 효율적으로 다루기 위한 자료구조의 프레임 워크를 컬렉션 프레임 워크라고 한다.
컬렉션 프레임 워크란 정의된 자료구조를 통해서 객체를 효율적으로 추가, 삭제, 검색할 수 있도록 하는 인터페이스와 실제 객체를 저장하는 컬렉션 클레스로, 해당 인터페이스를 통해 데이터를 효율적으로 다루기 위한 자료구조를 클래스로 구현해 놓는다.
컬렉션 프레임워크는 기능을 구현할 수 있도록 Collection인터페이스를 제공하며, 해당 Collection인터페이스을 최소한으로 구현한 AbstractCollection클래스를 제공한다. 그래서 모든 자료구조는 AbstractCollection클래스를 부모클래스로 지정되며, 자료구조를 구현하는 인터페이스는 주로 Collection인터페이스를 상속받는다.
컬렉션 프레임 워크에서는 Collection 인터페이스 외에도, 자료구조를 만들 수 있는 틀인 Set, List, Queue, Map 인터페이스가 있으며, Set, List, Queue는 Collection 인터페이스를 상속 받지만, Map은 Collection 인터페이스를 상속받지 않는다.
- Set
- List
- Queue
- Map
컬렉션 프레임 워크의 인터페이스에서는 컬렉션 클래스의 추가, 삭제, 검색의 기능을 구현할 수 있도록 저장되어 있으며, 해당 인터페이스의 메서드를 오버라이딩해서 자료구조의 기능을 구현한다.
- add(데이터 타입 객체) : 지정요소 추가
- Contains(Object 객체) : 객체 obj 존재 여부
- isEmpty() : 컬렉션이 비여있는지의 여부
- iterator() : 컬렉션에 저장되어 있는 데이터 선회하는 iterator 생성
- Iterator = 컬렉션 요소에 접근해서 반복적으로 요소에 접근할 수 있도록 도움을 주는 객체
- remove(Object 객체) : 객체 제거
- size() : 요소 갯수
제너릭 기법
컬렉션 클래스에는 저장되는 데이터는 상황에 따라 사용하는 타입이 가지각색이다. 그래서 컬렉션 클래스는 제너릭 기법을 사용해서 사용하기 전에 타입을 선언한다.
제너릭 기법이란 기존의 클래스나 메서드가 모든 종류의 타입이 다룰 수 있도록 타입을 정하지 않고 일반화해서 선언하는 기법으로, 메서드에 제네릭 기법 사용하는 제네릭 메서드와 클래스에 제네릭 기법 사용하는 제네릭 클래스가 있다.
이때, 제너릭 기법을 통해 클래스나 메서드를 구현할 때에는 클래스명 뒤나 메서드명 앞에 <E>,<K>,<V>와 같이 알파벳을 추가해서 타입을 정하고, 클래스나 메서드를 사용할 때에는 클래스명 뒤나 메서드명 앞에 알파벳 대신 클래스 타입을 추가한다.
알파벳 | 정의 |
E | 변수나 자료구조의 노드들의 데이터 타입을 지정 (데이터 타입 파라미터) |
T,S,U | 변수의 자료형 타입, 클래스 타입을 지정 (변수 타입 파라미터) |
K | 키 타입 지정, hashMap에서 사용 |
V | 값 타입 지정, hashMap에서 사용 |
- 제네릭 메서드
- 구현 : 접근 통제자 <알파벳> 리턴타입 메서드명(알파벳 변수) { ... }
- 사용 : <클래스 타입>메서드명(클래스 타입에 맞는 값); → 이때, <클래스 타입>은 생략이 가능
package pack0526;
class Value{
<T> void typeSearch(T x) {
if (x instanceof Integer) {
System.out.println(x + "는 정수");
}
else if (x instanceof Float||x instanceof Double) {
System.out.println(x + "는 실수");
}
else if (x instanceof Character) {
System.out.println(x + "는 문자");
}
else if (x instanceof String) {
System.out.println(x + "는 문자열");
}
else if (x instanceof Boolean) {
System.out.println(x + "는 논리형");
}
}
}
package pack0526;
public class Code1 {
public static void main(String[] args) {
Value v = new Value();
v.<Integer>typeSearch(3);
v.typeSearch(3.14);
v.typeSearch(3.14f);
v.typeSearch('a');
v.typeSearch("A");
v.typeSearch(true);
}
}
- 제네릭 클래스
- 구현 : class 클래스명 <알파벳> { ... }
- 사용 : 구현한 클래스명 <클래스 타입> 변수 = new 구현한 클래스명<클래스 타입>( ) → 클래스 타입이 없을경우 Object클래스로 생성
package pack0526;
class A<T>{
T x;
T y;
}
public class Code2 {
public static void main(String[] args) {
A<Integer> a2 = new A<Integer>(); //Integer
a2.x = 1;
a2.y = 2 ;
A<String> a3 = new A<String>(); //String
a3.x = "hello";
a3.y = "World";
System.out.println("a2 :"+(a2.x + a2.y));
System.out.println("a3 :"+(a3.x + a3.y));
}
}
'프로그래밍 언어 > Java' 카테고리의 다른 글
List 컬렉션 (0) | 2023.05.27 |
---|---|
Set 컬렉션 (0) | 2023.05.26 |
Format 클래스 (0) | 2023.05.24 |
기타 API 클래스 (0) | 2023.05.23 |
Scanner 클래스 (0) | 2023.05.22 |