코드스테이츠 BE 16일차 - Java 컬렉션

coding infant·2022년 7월 14일

코드스테이츠BE

목록 보기
16/48

제네릭

                                    // 제네릭 사용시
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으로 구성

0개의 댓글