제네릭(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 출력
}