*제네릭(Generic) 프로그래밍
: 변수의 선언이나 메서드의 매개변수를 하나의 참조 자료형이 아닌 여러 자료형을 변환 될 수 있도록 프로그래밍 하는 방식
- 실제 사용되는 참조 자료형으로의 변환은 컴파일러가 검증하므로 안정적인 프로그래밍 방식이다.
- 컬렉션 프레임워크에서 많이 사용되고 있음
* 컬렉션 프레임 워크 : 자바에서 데이터 저장 및 관리를 위한 클래스와 인터페이스의 집합
ex ) List, Set, Map, Queue 인터페이스
- 제네릭 클래스 정의
- 여러 참조 자료형으로 대체 될 수 있는 부분을 하나의 문자로 표현 => 자료형 매개변수
public class GenericPrinter<T>
=> 제네릭 클래스로 <> 다이아몬드 연산자 안에 있는 T가 자료형 매개변수(E, V, T를 주로 넣음)
* 다이아몬드 연산자 내부에서 자료형 생략 가능 -> ArrayList<String> list = new ArrayList<>(); 가능
* 제네릭에서 자료형 추론 -> var list = new ArrayList<String>(); 가능
- 제네릭 클래스 사용
GenericPrinter<Powder> powerPrinter = new GenericPrinter<Powder>();
powderPrinter.setMaterial(new Powder());
Powder powder = powderPrinter.getMaterial();
=> 이미 T 부분에 Powder 참조자료형 넣어서 -> getMaterial호출 시 강제 형변환 필요 x
- 대입된 자료형 명시 x 경우
GenericPrinter powderPrinter2 = new GenericPrinter ();
powderPrinter2.setMaterial(new Powder());
Powder powder = (Powder)powderPrinter.getMaterial();
=> <T> 명시안하면 getMaterial();을 Powder형으로 강제 형변환 해야 함
- <T extends 클래스>
: T가 사용될 클래스를 제한
ex) extends Material
- Naterial은 추상 클래스
- Material에서 상속받아야 프린터 재료로 사용 가능
- Material을 extends한 클래스는 Material에서 정의된 메서드 공유 가능
- Material의 추상 메서드를 하위 클래스인 Powder, Plastic에서 재정의 해아함
- 제네릭 클래스 활용 - 자료형 매개변수가 하나 이상인 경우
<제네릭 메서드 일반 형식>
ex) 자료형 매개변수 2개일 때 제네릭 메서드
public static <T, V> double makeRectangle(Point<T, V> p1, Point<T, V> p2)
*컬렉션 프레임워크★★★★★
: 프로그램 구현에 필요한 자료구조(Data Structure)를 구현해 놓은 라이브러리 (java.util 패키지)
=> 개발 시간 절약하면서 최적화된 알고리즘 사용 가능
★인터페이스 구조를 알면 사용하기에 더 편리하다
=> 클래스가 인터페이스로 그룹지어져 있기 때문에 인터페이스만 알면 하위 클래스에서 같은 이름의 메서드를 사용하기 때문에 클래스 명만 바꿔주면 똑같이 사용 가능
*인터페이스 구조
- 인터페이스 - Collection - List, Set / Map - Hashtable, HashMap, TreeMap
- 클래스 - ArrayList, Vector, LinkedList / HashSet, TreeSet / Properties
- Iterator(반복자) : 리스트를 순회할 수 있게 해주는 객체(데이터베이스 커서와 유사)로 어디서든 사용 가능 / 인덱스가 없는 Set에서 주로 유용하게 사용
◼ Collection 인터페이스
: 하나의 객체를 관리하기 위한 메서드가 정의된 인터페이스
- 주요 메서드
참고 - 컬렉션 프레임워크
- 하위 인터페이스
• List
: 객체를 순서에 따라 저장하고 관리하는데 필요한 메서드가 선언된 인터페이스
=> 순서가 있는 자료 관리(인덱스) / 중복 허용 (ArrayList, Vector, LinkedList, Stack, Queue)
✔️List - ArrayList, Vector 클래스
: 객체 배열을 구현한 클래스
- Vector : 자바 2부터 제공된 클래스로 멀티 쓰레드 상태에서 리소스에 대한 동기화가 필요한 경우 사용(잠금과 해제가 일어나 실행 속도가 느리다)
* 멀티 쓰레드 : 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것
* 동기화(synchronization) : 두 개의 쓰레드가 동시에 하나의 리소스에 접근할 때 순서를 맞추어 데이터에 오류가 발생하지 않게 하는 것
- ArrayList : 일반적으로 더 많이 사용하는 클래스이다
=> ArrayList에 동기화 기능이 필요한 경우 Vector로 안바꾸고 다음과 같이 코드 사용
Collection.synchronizedList(new ArrayList<String>());
✔️List - LinkedList 클래스
: 논리적으로 순차적인 자료구조가 구현된 클래스
- 다음 요소에 대한 참조값을 가짐
- 요소의 추가/ 삭제에 드는 비용이 배열보다 적음(배열의 단점을 개선한 자료구조)
- ArrayList() 단점
- 기본 배열은 길이를 정하여 선언하기 때문에 -> 배열 길이 변경 불가능
- 중간의 요소를 비워둘 수 없기 때문에 -> 배열 요소 위치 하나하나 변경해야함
=> 요소를 추가하거나 제거하기 매우 어렵다.
- LinkedList() 추가와 삭제
=> 주소값만 변경하면 요소를 바로 추가하거나 삭제할 수 있다.
- 링크드 리스트 vs 배열
=> 자료의 변동(삽입, 삭제)가 많을 때는 링크드 리스트를 사용 / 자료 변동이 거의 없을 때는 배열 사용(배열은 어떤 요소의 위치 찾기에 적절)
✔️ Stack과 Queue 구조 - 배열 활용
=> Stack과 Queue의 기능은 클래스가 이미 있지만 ArrayList / LinkedList 활용하여 사용할 수 있음
- Stack : Last In First Out (LIFO) - 맨 마지막에 추가 된 요소가 먼저 꺼내지는 자료구조 (ex) 뒤로가기, 최근 자료 추출 기능 등)
=> remove() 메서드를 활용하여 마지막 인덱스 번호를 입력함으로써 삭제한다.
- Queue : First In First Out (FIFO) - 먼저 저장된 자료가 먼저 꺼내지는 자료구조 (ex) 선착순, 대기열 기능)
=> [0] 인덱스의 요소를 remove() 메서드를 활용해 삭제한다.
• Set
: 순서가 없는 자료 관리 / 중복 미허용 (HashSet, TressSet)
- 유일한 값이나 객체를 관리할 때 사용 (ex) 아이디, 주민번호, 사번 등)
- 요소를 가져오는 get(i) 메서드 제공 안됨 -> 대신 next()메서드로 다음에 있는 요소를 가져올 수 있음
✔️Set - HashSet 클래스
: 중복을 허용하지 x
=> 저장되는 객체의 동일함 여부를 알기 위해 HashSet클래스에 equals(), hashCode()메서드 재정의 필요
속도 향상을 위해 사용
//hashCode()메서드 재정의 - 회원 아이디 반환
@Override
public int hashCode() {
return memberId;
}
//equals()메서드 재정의 - 매개변수 회원아이디가 자신의 회원아이디와 같을 때 true 반환
@Override
public boolean equals(Objext obj) {
if(obj instanceof Member) {
member member = (Member)obj;
if(this.memberId == member.memberId)
return true;
else
return false;
}
returnfalse;
}
}
* hashCode()
: 인스턴스 주소값 비교하여 동일함 여부 판단
* equals()
: 객체 내부의 값을 비교하여 동일함 여부 판단
✔️Set - TreeSet 클래스
: 객체의 정렬에 사용하는 클래스로 중복 허용X, 객체 정렬(오름차순/내림차순)의 기능을 함
* 이진 검색 트리(binary search tree)
- 자식 노드의 좌측은 부모의 값을 기준으로 작은 값이, 우측은 큰 값이 들어있다.
- 값을 읽을 대는 좌 -> 우
자식 -> 부모 순서로 읽는다.
=> 값을 크기 순으로 정렬 가능
* 객체 비교를 위해 Comparable / Comparator 인터페이스 구현 필요
- Comparable -> compareTo() 메서드 구현 필요
: 매개변수와 객체 자신(this) 비교 (1개)
- Comparator -> compare() 메서드 구현 필요
: 두 개의 매개변수 비교
=> 일반적으로 Comparable을 더 많이 사용하며 이미 구현되어 있을 경우에 Comparator를 이용한다.
◼ Iterator
: Collection의 개체를 순회하는 인터페이스
- 호출
Iterator ir = memberArrayList.iterator();
- 선언된 메서드
*hashNext() -> hasNext()
📄예제) Iterator 사용하여 순회
public boolean removeMember(int memberId) {
Iterator<Member> ir = arrayList.iterator();
while(ir.hasNext()) { // hasNext() -다음에 가져올 값이 있으면 true 값 반환
Member member = ir.next(); // next() - 다음에 있는 요소 반환
int tempId = member.getMemberId(); // member인스턴스의 memberId tempId변수에 대입
if(tempId == memberId) { // 만약 회원 아이디가 매개변수와 같으면
arrayList.remove(member); // 해당 회원 삭제
return true; // true 반환
}
}
//끝날 때까지 삭제하려는 값을 찾지 못한 경우
System.out.println(memberId + "가 존재하지 않습니다.");
return false;
}
◼ Map 인터페이스
: 쌍(pair)으로 이루어진 객체를 관리하는데 사용(key - value 쌍)하는 인터페이스로 검색을 위한 자료구조이다.
ex) 값을 저장, 검색, 삭제에 활용
value는 중복될 수 있지만 key는 중복될 수 없다. (파이썬 딕셔너리 기능과 유사)
=> key의 유일성의 여부를 위해 equals(), hashCode() 메서드 재정의 필요
- 주요 메서드
- 하위 클래스
• HashMap 클래스
: Map 인터페이스를 구현한 클래스 중 가장 일반적으로 사용하는 클래스로 pair 자료를 쉽고 빠르게 관리할 수 있음
*HashTable 클래스는 자바2 부터 제공된 클래스로 Vector 처럼 동기화 를 제공 함
✔️객체 순회 - Iterator()
=> iterator() 메서드는 하나의 Collection 객체만을 반환 -> 따라서 쌍으로 이루어진 객체는 각각 순회(key값을 가져와서 key 값에 해당하는 value 찾아야함)
public void showAllMember() {
Iterator<Integer> ir = hashMap.keySet().iterator();
while(ir.hasNext()) {
int key = ir.next(); //key 값
Member member = hashMap.get(key); //value 값
System.out.println(member);
}
System.out.println();
}
=> keySet()으로 key값이 Set객체로 반환 --> Set객체에 iterator 메서드 호출 -> get(key)로 value값 반환
*각각 순회하지 않고 한번에 value값 반환하는 법
=> HashMap의 values() 메서드 사용 - value를 collection으로 반환
public void showAllMember() {
Collection<Member> value = hashMap.values(); //value값 Map에 반환
Iterator<Member> ir = value.iterator(); //iterator 호출
while(ir.hasNext()) { //다음 value가 있으면
Member member = ir.next(); //member 인스턴스에 value값 대입
System.out.println(member); //value값 출력
}
System.out.println();
}
• TreeMap 클래스
: key 객체를 정렬하여 key-value를 pair로 관리하는 클래스로 key 에 사용되는 클래스에 Comparable, Comparator 인터페이스를 구현해야한다.(Commparable이 구현되어 있는 클래스의 경우 따로 구현할 필요X)
'개발 공부 > Java' 카테고리의 다른 글
[Java] - 람다식, 스트림 (0) | 2023.11.15 |
---|---|
[Java] - 내부 클래스 (0) | 2023.11.14 |
[Java] - 기본 클래스 (0) | 2023.11.10 |
[Java] - 인터페이스 (0) | 2023.11.08 |
[Java] - 추상 클래스 (0) | 2023.11.08 |