0. JAVA 기초 (6)
- Collection Framework : 배열, 링크드리스트 등이 구현되어있는 종합 라이브러리 (java.util 패키지에 있음)
- Generic Programming : Collection Framework에서 채용하는 프로그래밍 기법 ( C++의 Template과 유사)
public class GenericPrinter<T extends Material> { // Material에서 상속받은 애들만 인자로 받겠다.
private T material;
public T getMaterial() {
return material;
}
public void setMaterial(T material) {
this.material = material;
}
}
public class GenericPrinterTest {
public static void main(String[] args) {
GenericPrinter<Powder> PowderPrintrer = new GenericPrinter<Powder>();
Powder powder = new Powder();
PowderPrintrer.setMaterial(powder);
}
}
- Generic Method : 제네릭 메소드는 매개 타입과 리턴 타입으로 타입 파라미터를 갖는 메소드를 말합니다.
public <타입 파라미터, ...> 리턴 타입 메소드명(매개변수, ...) { ... }
public <T> Box<T> boxing(T t) { ... }
[Link] https://palpit.tistory.com/667
[Java] 제네릭(generic) - 제네릭 메소드
제네릭은 여러 절로 구성되어 있습니다. Intro 제네릭 타입 멀티 타입 파라미터 제네릭 메소드 제한된 타입 파라미터 & 와일드카드 타입 제네릭 타입의 상속과 구현 제네릭 메소드(<t, r=""> R method(T t)) 제네릭..</t,>
palpit.tistory.com
- 앞에 붙은 타입 파라미터 <T>는 Local VAR와 같은 개념으로 생각하면 된다.
- Collection Framework : 배열, 링크드리스트 등이 구현되어있는 종합 라이브러리 (java.util 패키지에 있음)
- Collection Interface와 Map Interface로 구성된다.
List Interface : Collection의 하위 Interface
ex. ArrayList, Vector, LinkedList
- Vector는 멀티 쓰레드 프로그램에서 동기화를 지원
- Capacity와 size는 다른 개념. ArrayList에서는 element의 공간이 부족하면 더 큰 공간으로 메모리를 복사한다. (ex. {{1,2}, {4,5,6}})
- LinkedList
package hello;
import java.util.LinkedList;
public class HelloJava {
public static void main(String[] args) {
LinkedList<String> myList = new LinkedList<String>();
myList.add("A");
myList.add("B");
myList.add("C");
System.out.println(myList); // [A, B, C]
myList.add(1,"D");
System.out.println(myList); // [A, D, B, C]
myList.removeLast();
System.out.println(myList); // [A, D, B]
for(int i=0; i<myList.size(); i++) {
System.out.println(myList.get(i));
}
}
}
- HashSet : 기본적으로 Set인데 Hash형태로 저장함.
import java.util.HashSet;
import java.util.Iterator;
public class HelloJava {
public static void main(String[] args) {
HashSet<String> set = new HashSet<String>();
set.add("A");
set.add("B");
set.add("C");
set.add("A");
System.out.println(set); // [A, B, C]
Iterator<String> ir = set.iterator();
while(ir.hasNext()) { // 다음이 있으면
System.out.println(ir.next()); // next()로 가져온다.
}
}
}
- Iterator() : Collection이면 다 돌아볼 수 있게 하는 METHOD. enhanced for로 구현해도 된다.
- TreeSet : Set인데 정렬된 형태. Red-Black Tree를 이용한다(O(log n) 의 시간복잡도로 삽입, 삭제, 검색). 보통 Search에서 쓴다.
- 정렬을 위해 Comparable interface를 구현해야 한다. (add()할 때 알아서 compareTo를 참조할 것임)
- Comparable interface
public class Member implements Comparable<Member> {
// Comparable 인터페이스를 받아야, 무엇을 기준으로 정렬할 지 알려줄 수 있다.
@Override
public int compareTo(Member member) { // 양수이면 오름차순, 음수이면 내림차순
return (this.memberId - member.memberID); // int 기준
// String 기준으로 하려면 String 내의 compareTo로 비교하면 된다.
return this.memberName.compareTo(member.getMemberName());
}
}
- Comparator interface
public class Member implements Comparator<Member> {
// Comparable 인터페이스를 받아야, 무엇을 기준으로 정렬할 지 알려줄 수 있다.
@Override
public int comapre(Member member1, Member member2) {
return (member1.memberId - member2.memberID);
}
}
// 단 선언할 때,
treeSet = new TreeSet<Member>(); // 를
treeSet = new TreeSet<Member>(new Member()); // 으로 바꿔줘야함.
// Template 방식에서 쓸 때 클래스를 전달해 주어야 한다.
// 그렇지 않으면 compareTo를 호출한다.
// 정렬방식을 여러개 쓸 수 있는 것.
Map Interface :
HashMap :
import java.util.HashMap;
public class MemberHashMap {
private HashMap<Integer, Member> hashMap; // <Key, Value>
public MemberHAshMAp() {
hashMap = new HashMap<Integer, Member>();
}
public void addMember(Member member) {
hashMap.put(member.getMemberId(), member)
}
public boolean removeMember(int memberId) {
if( hashMap.containsKey(memberId)) {
hashMap.remove(memverId); // Key로 검색해서 지운다.
return true;
}
return false;
}
public void showAllMember() {
Iterator<Integer> ir_key = hashMap.keySet().iterator(); // key의 iterator
Iterator<Integer> ir_value = hashMap.values().iterator(); // values의 iterator (중복 제외)
while ( ir_key.hasNext() ) {
System.out.println(hashMap.get(ir_key.next()));
}
}
}
TreeMap : 위와 동.