JAVA Spring

0. JAVA 기초 (6)

Louis.T.Kim 2020. 3. 7. 18:17

- 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 : 위와 동.