본문 바로가기

컴퓨터학원(복습)(수료)

자바(JAVA)기반 안드로이드 웹&앱 개발 18일차(와일드카드, 제네릭메소드, 제네릭 인터페이스, 컬렉션 프레임워크 중 List<E>)

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) 배열보다는 컬렉션 인스턴스가 좋다. : 컬렉션 변환

은 금요일에 이어서 하겠습니다..