1. 제네릭(generic)
제네릭(generic)이란 class, interface, method 등을 특정 타입(class)에 종속되지 않고 여러 다른 타입에 적용될 수 있도록 일반화된 타입 매개 변수를 말한다.
예를 들어 문자열인 멤버 id와 정수인 멤버 value가 있다. 만약 value가 정수가 아닌 문자열인 객체를 생성하고 싶다면 새로운 class를 만들어야 할 것이다. 혹은 id를 정수로 하고 싶은 경우나 id와 value를 모두 정수로 하고 싶은 경우에도 각각 새로운 class를 생성해야 할 것이다. 이러한 상황에서 같은 변수의 타입을 필요에 따라 변경 가능하도록 해주는 것이 generic 이다.
③ class 이름 뒤에 가 있음을 유의해 보라. Sample class 내에서 사용되는 두 가지 타입 A와 B에 대해 사용자가 임의로 지정할 수 있도록 해주겠다는 의미이다. 또한 멤버 변수 id는 A 타입으로, value는 B 타입으로 선언되었다. id는 사용자가 지정한 타입 A로 생성하고, value는 사용자가 지정한 타입 B로 생성한다는 의미이다.
1.1 제네릭 스택 만들기 예제
public class GenericStack<T> {
int tos;
Object[] stack;
int size;
public GenericStack(int size) {
tos = 0;
this.size = size;
stack = new Object[size];
}
public void push(T item) {
if(tos == this.size) {
return;
}
stack[tos++] = item;
}
public T pop() {
if(tos==0) {
return null;
}
tos--;
return (T)stack[tos];
}
public int size() {
return tos;
}
}
public class GenericStackApp {
public static void main(String[] args) {
System.out.println("String Stack");
GenericStack<String> stringStack = new GenericStack<String>(3);
stringStack.push("Seoul");
stringStack.push("Busan");
stringStack.push("Daegu");
int size = stringStack.size();
for(int n=0; n<size; n++) {
System.out.print("Stack size:" + stringStack.size());
System.out.println(" -> pop(): " + stringStack.pop());
}
System.out.println("Integer Stack");
GenericStack<Integer> intStack = new GenericStack<Integer>(3);
intStack.push(1);
intStack.push(3);
intStack.push(5);
for(int n=0; n<size; n++) {
System.out.println(intStack.pop());
}
System.out.println("intStack size: " + intStack.size());
}
}
1.2 제네릭 메소드
리턴 타입 앞에 타입 파라미터를 선언.
public <타입파라미터> 리던타입 메소드명(매개변수, ...) {
}
리턴 타입은 제네릭 메소드의 매개변수 타입에 따라 결정됨.
public <T> Box<T> boxing(T t) {...}
이렇게 Generic 객체 Box<T>를 만들었으면 매개변수 타입 T가 Box<T>의 리턴 타입을 결정.
Box<Integer> box1 = boxing(100); // 매개변수 (100)에 의해 <T>는 Integer로 유추
Box<String> box2 = boxing("홍길동");
1.3 제한된 타입 파라미터
타입을 제한할 수도 있음.
public <T extends 상위타입> 리턴타입 메소드명(매개변수, ...){
}
2. Collection
제네릭 기법으로 구현되어 있는데 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 만들어 놓은 java.util 패키지이다.
컬렉션의 요소는 객체만 가능하다. (기본 타입은 boxing, unboxing) 기법으로 객체로 자동 변환
2.1 List
객체를 인덱스로 관리하며, 인덱스로 객체를 검색, 삭제할 수 있는 기능 제공.
구현 클래스: ArrayList, Vector, LinkedList
- 순서를 유지하고 저장
- 중복 저장 가능
2.1.1 ArrayList
ArrayList<E>는 가변 크기 배열을 구현한 클래스이다.
객체의 번지를 저장한다.
빈번한 객체의 삽입, 삭제는 LinkedList를 사용하는 것이 적당하다.
2.2 Set
수학의 집합 개념.
구현 클래스: HashSet, TreeSet
- 순서를 저장하지 않음
- 중복 저장 안됨
2.3 Map
key와 value의 쌍으로 구성된 엔트리 객체를 다루는 컬렉션.
구현 클래스: HashMap, Hashtable, LinkedHashMap, Properties, TreeMap
- 키와 값으로 구성된 엔트리(쌍) 저장
- 키는 중복 저장 안됨
'JAVA' 카테고리의 다른 글
[JAVA] 5주차 | 멀티스레드 개념, 동기화 문제 (2) | 2023.06.02 |
---|---|
[JAVA] 4주차 | 테트리스 게임 만들기 (2) | 2023.05.22 |
[JAVA] 3주차(1) | Java.base모듈, Wrapper (0) | 2023.05.17 |
[JAVA] 2주차 | 패키지(package), getter와 setter (0) | 2023.05.10 |
[JAVA] 메소드 재정의 | toString, compareTo (0) | 2023.05.04 |