3.16(화)는 온라인강의 듣는 날이라 일차에서 뺐습니다.
저도 정리하면서 와일드카드 부분이 잘 이해안되서 서칭하다가..
이분이 참 정리 잘하신 것 같아요.
[3편] 제네릭이란? — 왜 모르는가? (tistory.com)
참고하시면 좋겠습니다.
사실 오늘, 프레임워크 Set<E>까지 나갔으나 복습하다가 너무 피곤해서 금요일즈음에 정리할까 합니다.
아 추가로 한달정도 됐는데(주말포함) 훈련지원비로 25만 5천원이 나왔습니다!
취업지원 수당은 25일에 접수되어 영업일 기준 14일 후에 (1일 출석 기준 18000원) 지원한다고 합니다.
2월16일 ~ 3월 16일 총 지원비로 약 50만원 정도 나오겠네요~
참고하시길 바랍니다.(취성패 2유형입니다.)
1. 와일드카드(Wildcard)
- 와일드카드 적용 전 예시

Box

UnBoxer

WildcardUnboxer
※ peekBox 제네릭 메소드를 보면 Box<Integer>, Box<String>의 인스턴스를 인자로 전달받
....도록 하기 위함이다.
※ 하지만, Box<T>를 Box<Object>로 정의하면 Box<Object>는 Box<String>과
....Box<Integer>와 상속관계를 형성하지 않으므로 안된다.
※ 즉, Object와 String이 상속관계에 있더라도 위의 상속관계와는 별개인 것이다.
- 와일드 카드 적용 예시

※ 물음표 기호로 표시되는 와일드카드를 이용해서 매개변수를 선언하였다.
※ Box<T>를 기반으로 생성된, Box<Integer> 인스턴스나 Box<String>
....인스턴스들을 인자로 받을 수 있다.
- 기능적인 측면에서 보면 와일드카드와 제네릭 메소드는 동일하고 상호대체 가능한 측면이
...있다. 하지만, 와일드카드가 간결하고 보편적으로 사용된다.
1) 와일드카드의 상한과 하한의 제한
- peekBox 인자로 Box<T>에서 T가 Number 또는 Number의 하위클래스인 제네릭 타입의
...인스턴스만 전달되도록 제한할 때, 다음과 같이 상한제한된 와일드카드를 사용한다.
※ Box<? extends Number> box
☞ box는 Box<T> 인스턴스를 참조하는 참조변수이다.
☞ 단 이때 Box<T> 인스턴스의 T는 Number 또는 이를 상속하는 하위클래스 이어야 한다.
- 하한 제한된 와일드카드는 다음과 같이 사용할 수 있다.
※ Box<? super Integer> box
☞ box는 Box<T> 인스턴스를 참조하는 참조변수이다.
☞ 단 이때 Box<T> 인스턴스의 T는 Integer 또는 Integer가 상속하는 클래스이다.
2) 언제 와일드카드에 제한을 걸어야 하는가? 상한 제한의 목적
상한제한이 없을 때의 오류 예시

Box

Toy

BoxHandler

BoundedWildcardBase
※ outbox 메소드를 보면 매개변수 box를 대상으로 get은 물론 set의 호출까지 가능하다.
※ 즉, outBox 메소드 내에서 실수로 set 메소드를 호출하여 임의의 인스턴스를 넣는 상황이
...발생할 수 있다.(프로그래머의 오류)
※ outBox(Box<? extends Toy> box)로 선언하여 get만 가능하고 set은 제한할 수 있다.
☞ 위 메소드의 매개변수로 Toy 인스턴스를 저장할 수 있는 상자만(Box<T> 인스턴스)
....전달된다는 사실을 보장할 수 없기 때문이다.
3) 언제 와일드카드에 제한을 걸어야 하는가? : 하한 제한의 목적
BoxHandler 를 보면 inbox 메소드가 있다. 여기서도 마찬가지로 get 메소ㄷ를 호출하는
...코드가 삽입될 수 있다.(프로그래머의 실수)
※ inBox(Box<? super Toy> box, Toy n) 으로 set만 가능하고 get은 제한할 수 있다.
4) 제한된 와일드카드 선언을 갖는 제네릭 메소드
- 메소드를 오버로딩 해야 하는 상황에서는 ‘Type Erasure’ 때문에 오버로딩이 불가하다.
public static void outBox(Box<? extends Toy> box) {...}
public static void outBox(Box<? extends Robot> box) {...} // 오버로딩 불가
// 두번째 매개변수로 오버로딩 가능(밑에 것)
public static void inbox(Box<? super Toy> box, Toy n) {...}
public static void inBox(Box<? super Robot> box, Robot n) {...}
- 그러므로 매개변수가 없을 때에는 제네릭 메소드로 정의를 한다.
public static <T> void outBox(Box<? extends T> box) {...}
5) 제네릭 인터페이스
제네릭 인터페이스 예시

Box

Toy

Getable Interface

Getable main
※ 제네릭 인터페이스의 T를 String으로 결정하면 Getable<T> 의 메소드를 구현할 때에도 String으로 명시하고 구현해야 한다.
1. 컬렉션 프레임워크
- 자료구조와 알고리즘 제네릭 기반의 클래스와 메소드로 미리 구현해 놓은 결과물이다.
1) List<E> 인터페이스를 구현하는 컬렉션 클래스들
.(1) ArrayList<E> 클래스
..- ArrayList<E> : 배열기반 자료구조, 배열을 이용하여 인스턴스 저장
..- LinkedList<E> : 리스트 기반 자료구조, 리스트를 구성하여 인스턴스 저장(포인터개념)
..- 인스턴스의 저장 순서를 유지한다.
..- 동일한 인스턴스의 중복 저장을 허용한다.
- ArrayList<E> 예시

ArrayList<E>
※ ArrayList<E> 형 참조변수가 아닌 List<E> 형 참조변수를 선언한 이유는 코드에 유연성을 제공하기 위함이다. 주로 List<E>에 선언된 메소드를 호출하기 때문에 굳이 ArrayList<E>형 참조변수를 선언할 필요가 없다.
- LinkedList<E> 클래스 예시
※ 위 예시에서 List<String> list = new LinkedList<>();로 선언하면된다.
☞ 인스턴스 저장 : 열차 칸 하나 추가로 연결하고, 그 열차 칸에 인스턴스를 저장한다.
☞ 인스턴스 삭제 : 해당 인스턴스를 저장하고 있는 열차 칸을 삭제한다.
.(2) ArrayList<E> vs LinkedList<E>
..① ArrayList<E>의 장점
...- 저장된 인스턴스의 참조가 빠르다.
..② ArrayList<E>의 단점
...- 저장 공간을 늘리는 과정에서 시간이 비교적 많이 소요된다.
...- 인스턴스의 삭제 과정에서 많은 연산이 필요할 수 있다. 따라서 느릴 수 있다.
..③ LinkedList<E>의 장점
...- 저장 공간을 늘리는 과정이 간단하다.
...- 저장된 인스턴스의 삭제 과정이 단순하다.
..④ LinkedList<E>의 단점
...- 저장된 인스턴스의 참조 과정이 배열에 비해 복잡하다. 따라서 느릴 수 있다.
(3) 저장된 인스턴스의 순차적 접근 방법 1: enhanced for 문의 사용
※ 위 예제에서
for(String s : list) {System.out.print(s + ‘\t’_;) 를 선언하면 된다.
- Collection<E>가 Iterable<T>를 상속하는데, ArrayList<E>, LinkedList<E> 클래스
...Collection<E> 인터페이스를 구현하고 있다. 그러므로 for-each문 사용이 가능하다.
(4) 저장된 인스턴스의 순차적 접근 방법 2: 반복자(Iterator)
- 저장된 인스턴스들을 순차적으로 참조할 때 사용하는 인스턴스이다.(일종의 지팡이)
- E next() : 다음 인스턴스의 참조 값을 반환
- boolean hasNext() : next 메소드 호출 시 참조 값 반환가능 여부 확인
- void remove() : next 메소드 호출을 통해 반환했던 인스턴스 삭제
- 반복자(Iterator) 예시

반복자
2) 배열보다는 컬렉션 인스턴스가 좋다. : 컬렉션 변환
은 금요일에 이어서 하겠습니다..