제네릭
// 제네릭 사용시
class Basket { // class Basket<T> {
private String item; // private T item;
Basket(String item) { // public Basket(T item) {
this.item = item; // this.item = item;
} // }
public String getItem() { // public T getItem() {
return item; // return item;
} // }
public void setItem(String item) { // public void setItem(T item) {
this.item = item; // this.item = item;
} // }
/*
class BasketString { private String item; ... }
class BasketInteger { private int item; ... }
class BasketChar { private char item; ... )
class BasketDouble { private double item; ... }
*/
// 제네릭 사용시 번거로움 줄일 수 있음
}
위의 Basket 클래스 인스턴스화 가능
Basket basket1 = new Basket("기타줄")
-> Basket 클래스 내의 T를 String으로 바꿔라
Basket basket2 = new Basket(1);
// 위와 같이 인스턴스화 하면 Basket 클래스는 아래와 같이 변환
class Basket {
private Integer item;
public Basket(Integer item) {
this.item = item;
}
public Integer getItem() {
return item;
}
public void setItem(Integer item) {
this.item = item;
}
}
[제네릭]
타입을 구체적으로 지정하지 않고, 추후에 지정할 수 있도록 일반화 해두는 것.
작성한 클래스 또는 메서드의 코드가 특정 데이터 타입에 얽매이지 않게 해둔 것
제네릭 클래스 : 제네릭이 사용된 클래스
[타입 매개 변수 T]
<> 꺽쇠 안에 넣어 클래스 이름 옆에 작성, 클래스 내부에서 사용할 타입 매개변수 선언
클래스 몸체에서 T를 임의 타입으로 사용
class Basket {
private T item;
}
여러 타입 매개변수 사용시 아래와 같이 선언
class Basket<T, K, V, E, N, R> {...}
T type
K key
V value
E element
N number
R result
class Basket {
private T item1; // O
static T item2; // X
}
static이 붙은 클래스 변수(모든 인스턴스가 공유하는 변수) 또는 메서드에는 타입 매개변수 사용 불가
[제네릭 클래스]
특정 타입 지정되지 않은 클래스. 제네릭 클래스 인스턴스 할 때 타입을 지정해줘야
타입 매개변수에 치환될 타입으로 기본 타입 지정 불가능
int : Integer
double : Double 사용
Basket<String> basket1 = new Basket<String>("Hello"); // 또는 Basket<String> basket1 = new Basket<>("Hello");
Basket<Integer> basket2 = new Basket<Integer>(10); // 또는 Basket<Ingeger> basket2 = new Basket<>(10);
Basket<Double> basket3 = new Basket<Double>(3.14); // 또는 Basket<Double> basket3 = new Basket<>(3.14);
class Flower {...}
class Rose extends Flower {...}
class RosePasta {...}
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<Flower> flowerBasket = new Basket<>();
flowerBasket.setItem(new Rose()); // 다형성 적용
flowerBasket.setItem(new RosePasta()); // 에러
}
new Rose()를 통해 생성된 인스턴스는 Rose타입. Rose 클래스는 Flower 상속. Basket의 item에 할당.
[제한된 제네릭 클래스]
class Flower {...}
class Rose extends Flower {...}
class RosePasta {...}
// 제네릭 클래스 정의
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<Rose> roseBasket = new Basket<>();
Basket<RosePasta> rosePastaBasket = new Basket<>();
}
class Flower { ... }
class Rose extends Flower { ... }
class RosePasta { ... }
class Basket<T extends Flower> {
private T item;
...
}
public static void main(String[] args) {
// 인스턴스화 Flower클래스의 하위 클래스만 지정하도록 제한
Basket<Rose> roseBasket = new Basket<>();
Basket<RosePasta> rosePastaBasket = new Basket<>(); // 에러
interface Plant { ... }
class Flower implements Plant { ... }
class Rose extends Flower implements Plant { ... }
class Basket<T extends Plant> {
private T item;
...
}
public static void main(String[] args) {
// 인스턴스화
Basket<Flower> flowerBasket = new Basket<>();
Basket<Rose> roseBasket = new Basket<>();
interface Plant {...}
class Flower implements Plant {...}
class Rose extends Flower implements Plant {...} // extends 사용. 특정 클래스만 타입 지정 가능
class Basket<T extends Plant> { // 또는 class Basket<T extends Plant & Flower>
private T item; // 특정 클래스 상속 & 특정 인터페이스 구현 클래스로 지정 가능
}
public static void main(String[] args) {
// 인스턴스화
Basket<Flower> flowerBasket = new Basket<>();
Basket<Rose> roseBasket = new Basket<>();
}
[제네릭 메서드]
클래스 내부의 특정 메서드만 제네릭으로 선언 가능
class Basket {
...
public <T> void add(T element) {
...
}
}
제네릭 메서드의 타입 매개변수 ≠ 제네릭 클래스의 타입 매개변수
class Basket<T> { // 1 : 여기에서 선언한 타입 매개변수 T와
...
public <T> void add(T element) { // 2 : 여기에서 선언한 타입 매개변수 T는 서로 다른 것입니다.
...
}
}
// 제너릭 메서드 타입 지정은 메서드 호출될 때 지정됨
Basket<String> basket = new Bakset<>(); // 위 예제의 1의 T가 String으로 지정됩니다.
basket.<Integer>add(10); // 위 예제의 2의 T가 Integer로 지정됩니다.
basket.add(10); // 타입 지정을 생략할 수도 있습니다
메서드 매개변수는 static 메서드에서도 사용 가능
class Basket {
...
static <T> int setPrice(T element) {
...
}
}
컬렉션 프레임워크
객체들을 효율적으로 추가, 삭제, 검색할 수 있는 컬렉션 만들고, 관련된 인터페이스와 클래스를 포함시킨 것
컬렉션 : 여러 데이터들의 집합.
컬렉션 프레임워크 : 컬렉션을 다루는 데 필요한 메서드를 미리 정의해 놓은 것
[컬렉션 프레임워크 구조]
Collection - List (LinkedList, Stack, Vector, ArrayList), Set (HashSet, SortedSet->TreeSet)
Map - Hashtable, HashMap, SortedMap -> TreeMap
List : 데이터 순서 유지. 중복 가능
Set : 데이터 순서 유지 x. 중복 불가
Map : 키(key)와 값(Value)의 쌍으로 데이터 저장하는 컬렉션 구현에 사용. 데이터 순서 x. 키 - 중복 불가. 값 - 중복 가능
[Collection 인터페이스]
List, Set으로 구성