* 24. 제너릭(Generic) 적용
① 다형적 변수 적용 전
각 타입별로 List 클래스를 만든다.
MemberList ↔ Member
BoardList ↔ Board
문제점 ? List의 기능은 같고 타입만 다르다 ! → 코드 중복 발생 !!
② 다형적 변수 적용
MemberHandler
→ ArrayList → Object "다양한 타입의 인스턴스(주소)를 담는다."
BoardHandler
장점 ? 타입별로 List를 만들 필요가 없다 !
문제점 ? 명시적 형변환이 필수적이고, 특정 타입만 다루도록 제한할 수 없다 ! (모두 Object의 자손)
③ Generic → Type Parameter
Object 를 What 대신 일반적으로 사용하는 E로 바꿔적어 준다. (elements)
일반적으로, 컬렉션 클래스나 제네릭 클래스를 구현할 때 요소(element)의 타입을 지정하기 위해 E를 사용
예를 들어, ArrayList<E>, LinkedList<E>, Set<E> 등과 같이 컬렉션 클래스에서 E는 실제 요소의 타입으로 대체.
마찬가지로, 제네릭 클래스에서도 E는 실제 사용할 타입으로 대체됨.
단, generic은 배열 레퍼런스를 생성할 수 없다.
때문에 배열 생성과 관련해서는 타입지정에 Object를 그대로 사용해주어야한다.
<기존>
기존의 코드는 형변환을 해주어야하고,
다른 타입이 return 되는 것을 막을 수가 없다 !
<generic 적용>
Member로 명시를 해주면
Member가 아닌 다른 타입은 오류가 발생한다 !
해결 !
<기존>
<generic 적용>
generic 문법을 통해서 명시적 형변환이 사라진 것을 볼 수 있다.
<Meber>와 <Board>의 모든 클래스,
즉 <추가>, <목록>, <조회>, <변경>, <삭제> 의 모든 클래스에 적용해주어야한다.
* 25. Iterator 패턴을 활용하여 데이터 조회기능을 객체로 추출하기 (캡슐화하기)
① 목록의 값을 조회하기
ArrayList ← get(index) INDEX
LikedList ← get(index) INDEX
Stack pop() ← LIFO
Queue poll() ← FIFO
Iterator 라는 데이터를 꺼내주는 객체를 통해서 일관된 방식으로 데이터를 조회한다.
* Iteratpr 패턴 구현
이해하기 쉽지 않은 내용이다 .. 그러나 java의 ArrayList라는 패키지에서
저장, 검색, 삽입, 삭제 등을 수행 해주기 때문에 우선은 전체적인 흐름을 이해하고
추후에 다시 깊게 클래스 바이너리 를 확인하면서 복습해야겠다.
import java.util.ArrayList;
문장은 java.util 패키지에 속한 ArrayList 클래스를 현재 소스 파일에서 사용하기 위해 import하라는 의미입니다.
ArrayList 클래스는 가변 크기의 배열을 구현한 자바 컬렉션 클래스로, 요소를 순차적으로 저장하고 검색, 삽입, 삭제 등을 수행할 수 있습니다. 제네릭을 사용하여 ArrayList를 특정 타입으로 파라미터화하면, 해당 타입의 객체만 저장할 수 있는 리스트를 생성할 수 있습니다.
예를 들어, ArrayList<ActionListener>는 ActionListener 인터페이스를 구현하는 객체들만 저장할 수 있는 리스트입니다. 이렇게 하면 ActionListener 객체들만을 관리하기 위한 편리한 인터페이스를 제공받을 수 있습니다.
또한, ArrayList 클래스는 Iterator를 반환하는 iterator() 메서드를 제공합니다. Iterator를 사용하면 ArrayList의 요소를 순회하고 조작할 수 있습니다. 이를 통해 간편하게 요소를 반복하고 제거하는 등의 작업을 수행할 수 있습니다.
따라서, import java.util.ArrayList;을 통해 ArrayList 클래스를 import하고, ArrayList<ActionListener>와 Iterator를 활용하여 제네릭과 반복 작업을 간편화할 수 있습니다.