제네릭(Generic)
필요성
제네릭 클래스 (Generic Class)
제네릭 클래스 예시
public class 클래스명<타입_매개변수> { }
public class 클래스명<타입_매개변수1, 타입_매개변수2> { }
public interface 인터페이스명<타입_매개변수> { }
public interface 인터페이스명<타입_매개변수1, 타입_매개변수2> { }
-----------------------------------
class Flower {...}
class SunFlower extends {...}
class Cosmos extends Flower {...}
class Candy {...}
class Basket<T> {
private T item;
public T getItem() {
return item;
}
public void setItem(T item) {
this.item = item;
}
}
public static void main(String[] args) {
// 사용방법
// Basket<구체적_타입_명시> example = new Basket<구체적_타입_명시>();
// Basket<구체적_타입_명시> example2 = new Basket<>(); // new 뒤로는 구체적 타입 생략 가능
Basket<Flower> flowerBasket = new Basket<>();
flowerBasket.setItem(new SunFlower()); // 다형성 적용
flowerBasket.setItem(new Cosmos()); // 다형성 적용
flowerBasket.setItem(new Candy()); // 에러
제한된 제네릭 클래스
extends 키워드 사용interface Plant {}
class Flower implements Plant {}
class SunFlower extends Flower {]
class Basket1<T extends Flower> {...} // 객체 생성시 Flower의 하위 클래스만 지정 가능
class Basket2<T extends Plant> {...} // 객체 생성 시 Plant 인터페이스를 구현한 클래스만 지정 가능
class Basket3<T extends Plant && Flower> {...} // 객체 생성 시 Flower의 하위클래스이면서 Plant 인터페이스를 구현한 클래스만 지정 가능
타입 매개변수
| 인자 | 의미 |
|---|---|
| < T > | Type |
| < E > | Element |
| < K, V > | Key, Value |
| < R > | Result |
| < ? > | Wild Card. 제한을 두지 않는 기호 |
래퍼클래스 (Wrapper class)
| 기본타입 | 래퍼 클래스 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
제네릭 메서드 (Generic Method)
컬렉션(Collection) : 여러 데이터들의 집합
컬렉션 프레임워크(Collection Framework)

| 기능 | 리턴타입 | 메서드 | 설명 |
|---|---|---|---|
| 객체 추가 | boolean | add(Object o) / addAll(Collection c) | 객체 킻 컬렉션 객체들을 컬렉션에 추가 |
| 객체 검색 | boolean | contains(Object o) / containsAll(Collection c) | 객체 및 컬렉션의 저장여부 리턴 |
| - | Iterator | iterator() | 컬렉션의 iterator 리턴 |
| - | boolean | equals(Object o) | 컬렉션 동일 여부 리턴 |
| - | boolean | isEmpty() | 컬렉션이 비어있는지 여부 리턴 |
| - | int | size() | 저장된 전 객체 수 리턴 |
| 객체 삭제 | void | clear() | 컬렉션의 모든 객체 삭제 |
| - | boolean | remove(Object o) / removeAll(Collection c) | 객체 및 컬렉션 삭제 후 성공여부 리턴 |
| - | boolean | retainAll(Collection c) | 주어진 컬렉션 제외 모든 객체 삭제 후 컬렉션의 변화 여부 리턴 |
| 객체 변환 | Object[] | toArray() | 컬렉션에 저장된 객체를 객체배열로 변환 후 리턴 |
| - | Object[] | toArray(Object[] a) | 배열에서 컬렉션의 객체를 저장 후 리턴 |
List < E >
ArrayList
LinkedList

LinkedList와 ArrayList 차이
| - | ArrayList | LinkedList |
|---|---|---|
| 데이터 추가 | 자동 인덱스 부여 | 데이터, 데이터와 연결된 요소의 주소값 저장 |
| 데이터 변경 | 다른 데이터를 복사 후 이동 | 추가,삭제에 따라 앞뒤 연결된 요소의 주소값 변경 |
| 데이터 검색 | 인덱스를 통해 접근 | 첫 요소부터 다음 주소값으로 순차적 검색 |
| 연속성 | 데이터 연속적 존재 | 데이터 불연속적 존재, 서로 연결되어있음 |
| 강점 | 데이터를 읽어들이는 경우 용이 | 데이터 변경에 용이 |
Iterator
iterator()가 정의되어있음iterator() 메서드를 호출하면 Iterator타입의 인스턴스 반환Iterator Method
| 메서드 | 설명 |
|---|---|
| hasNext() | 읽어올 객체가 남아 있으면 true를 리턴하고, 없으면 false리턴 |
| next() | 컬렉션에서 하나의 객체를 읽어옴. 이 때, next()를 호출하기 전 hasNext()를 통해 다음 읽어올 요소가 있는지 먼저 확인해야함 |
| remove() | next()를 통해 읽어온 객체 삭제. next()를 먼저 호출한 다음 remove()를 호출해야함 |
Set < E >
HashSet
TreeSet

Map < K, V >
HashMap
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "apple");
System.out.println(map.get(1)); // apple 출력
map.put(1, "banana");
System.out.println(map.get(1)); // banana 출력
}

