본문 바로가기
2022-2/자바

[자바] 제네릭과 컬렉션

by 철없는민물장어 2022. 12. 18.
728x90
반응형
컬렉션(collection)
  • 요소(element) 객체들의 저장소
  • 고정 크기의 배열을 다루는 어려움 해소
  • 다양한 객체들의 삽입,삭제,검색 등의 관리 용이

컬렉션은 제네릭 기법으로 구현된다.

컬렉션의 요소는 객체만 가능하다

(int,char,double과 같은 기본 타입이 아니라 Integer,String같은 객체를 사용하여야 함)

 

오늘 알아볼 것들

  • Vector<E>
  • ArrayList<E>
  • LinkedList<E>
  • Iterator
  • HashMap<K,V>
  • Collections
  • 제네릭 클래스 만들기

Vector<E>

java.util.Vector

 

Vector<E> 클래스의 주요 메소드

  • boolean add(E element) : 맨 뒤에 element 추가
  • void add(int index, E element): index 위치에 element 삽입
  • int capacity() : 벡터의 현재 용량 리턴
  • boolean addAll(Collection<? extends E> c) : 컬렉션 C의 모든 요소를 벡터의 맨 뒤에 추가
  • void clear() : 벡터의 모든 요소 삭제
  • E get(int index) : index위치의 요소 리턴
  • boolean isEmpty() : 벡터가 비어있으면 true 리턴
  • E remove(int index): index위치의 요소 삭제
  • boolean remove(Object o) : 객체 o와 같은 첫 번째 요소를 벡터에서 삭제
  • int size(): 벡터가 포함하는 요소의 개수 리턴

이 외에도 많은 메소드가 있으니 벡터.자동완성을 이용해서 필요한 메소드를 찾아 써 보자.

Vector<Integer> v= new Vector<>();

Vector<myClass> v2 = new Vector<>();

v.add(1);
v.add(2);
v.add(2,3);

v2.add(new myClass());

 


ArrayList<E>

대부분의 기능이 Vector와 동일.

 

하지만 벡터와 달리 스레드 동기화 기능이 없음.


LinkedList<E>

Vector, ArrayList와 매우 유사하게 작동.

리스트의 중간에서 삽입과 삭제가 자주 일어나면 효율적일듯 하다.

 


Iterator

Vector<E>, ArrayList<E>, LinkedList<E>가 상속받는 인터페이스이다.

 

컬렉션의 순차 검색을 위해 사용할 수 있다.

  • boolean hasNext() : 방문할 요소가 남아 있으면 true 리턴
  • E next(): 다음 요소 리턴
  • void remove(): 마지막으로 리턴된 요소 제거

 

iterator 이용하여 순차검색하는 예시.

Vector<Integer> v = new Vector<>();
Iterator<Integer> it= v.iterator();

while(it.hasNext())
{
	int n=it.next();
    ...
    
}

HashMap<K,V>

key,value가 한 쌍으로 구성되는 컬렉션이다.

키를 이용해서 값을 검색할 수 있다.

 

HashMap<K,V>의 주요 메소드

  • void clear() : 해시맵의 모든 요소 삭제
  • V get<Object key): key에 일치하는 값 리턴. 키가 존재하지 않으면 null 리턴
  • V put(K key, V value): key와 value쌍을 해시맵에 저장
  • V remove(Object key): key를 찾아 키와 값 모두 삭제
  • int size(); 해시맵에 포함된 요소의 개수 리턴
  • Set<K> keySet() :해시맵의 모든 키를 담은 Set<K> 컬렉션 리턴
HashMap<String,String> dic = new HashMap<>();

dic.put("hello",안녕);
dic.put("potato",감자);

Scanner sc = new Scanner(System.in);
while(true)
{
	System.out.print("검색할 단어를 입력하세요");
    String word=sc.next();
    
    if(word.equals("quit")
    	break;
    
    String hangeul = dic.get(word);
    if(hangeul==null)
    	System.out.println("존재하지 않는 단어입니다");
    else
    	System.out.println(hangeul);
}

Collections 클래스 활용

 

정렬 기능: Collections.sort(myList), Collections.reverse(myList)

요소들의 최대,최솟값을 찾기: max(), min()

특정 값 검색하기: Collections.binarySearch(myList,"아바타") 

 


제네릭 만들기

클래스나 인터페이스 선언부에 일반화된 타입을 추가할 수 있다.

public class MyClass<T>{
	T value;
    void set(T a);
    {
    	value=a;
    }
    T get()
    {
		return value;
	}
}

 

제네릭 메소드도 선언할 수 있다.

class GenericMethodEx{
	
    static <T> void toStack(T[] a, GStack<T> gs)
    {
		for(int i=0;i<a.length;i++){
			gs.push(a[i]);
            }
	}
}

(여기서 GStack은 내가 만든 제네릭 클래스임)

 

 

 

728x90
반응형

'2022-2 > 자바' 카테고리의 다른 글

[자바] 인터페이스  (0) 2022.12.18
[자바] 스레드와 멀티태스킹  (0) 2022.12.18
[자바] 네트워크  (0) 2022.12.17
[자바] ArrayList<클래스> 형의 정렬방법  (0) 2022.12.12
[자바] 멀티스레드, synchronized  (0) 2022.12.01

댓글