[211116] 교육 16일차

oxllz·2022년 1월 29일
0

교육

목록 보기
12/41

Collection

java 안에는 기본적으로 많이 사용하는 자료구조들이 제공된다.
크게 3가지 인터페이스를 상속받아 만들게 된다.

  • List ( ArrayList LinkedList ) : 순서개념있고 중복허용
  • Set ( HashSet TreeSet ) : 순서개념없고 중복불허
  • Map ( HashMap TreeMap ) : key=value 형태 , 중복불허

'이것들을 총칭해서 Collection 이라고 부른다'


List

import java.util.List;
import java.util.LinkedList;
import java.util.Iterator;
import java.util.ArrayList;
//
public class Test125 {
	public static void main( String[] args ) {
		// List<String> l = new LinkedList<String>();
		List<String> l = new ArrayList<String>();
		l.add("apple");
		l.add("banana");
		l.add("orange");
		l.add("kiwi");
		//
		System.out.println( l.size() );
		for( int i = 0 ; i < l.size() ; i++ ) {
			String t = l.get(i);
			System.out.println( t );
		}
		// 위쪽이 이해하기는 좋지만 java 에서 제공하는 하나씩 꺼내보는 표준방법은 아래다.
		Iterator<String> it = l.iterator();
		while( it.hasNext() ) {
			String t = it.next();
			System.out.println( t );
		}
	}
}

List : 인터페이스, LinkedList 는 이것을 상속받아 만들어진 클래스

List 를 상속받아 만들어진 클래스들의 특징

  • add( T t ) 를 이용하여 넣는다.
  • int size() 로 갯수를 센다.
  • T get( int i ) 로 특정 순서의 요소의 포인터를 얻는다.
  • Iterator 로 순차탐색을 진행한다.
  • "넣은 순서를 유지하는 형태로 자료를 보관한다."

인터페이스는 클래스간 호환성을 만든다. List 가 인터페이스니까
이를 상속받은 LinkedListArrayList는 상호간 호환성이 있다. ( 별도의 클래스지만 )

ArrayList 와 LinkedList

import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
//
public class Test129 {
	public static void main( String[] args ) {
		List<String> lst = new ArrayList<String>();
		// 현재의 시간을 long 형태의 정수로 밀리세컨드 단위로 출력한다.
        long time = System.currentTimeMillis();
		//
		for( int i = 0 ; i < 200000 ; i++ ) {
			lst.add( "apple"+i );
		}
		//
		while( lst.isEmpty() == false ) {
			lst.remove( 0 );
		}
		//
		time = ( System.currentTimeMillis() - time );
		System.out.println( time );
	}
}


ArrayList

  • 저장할때 배열을 이용한다.
  • 맨 뒤에 계속 추가되는 형태니까 속도가 훨씬 빠르다.
  • 공간이 모자라면 기종 공간의 2배 를 마련하여 옮겨간다.
  • 중간에 삭제가 일어나면 비어있는 자리를 뒤에서 당겨와 채워줘야 하므로 오버헤드가 크다.


LinkedList

  • 저장할때 Node 를 이용한다.
  • Node 간 연결을 해줘야 하니까 동작 속도가 느리다.
  • 중간 삭제가 일어나도 포인터를 Node.next 해주고 Node 하나만 삭제하면 되므로 부담이 적다.

Set

import java.util.Set;
import java.util.TreeSet;
import java.util.HashSet;
import java.util.Iterator;
//
public class Test126 {
	public static void main( String[] args ) {
		Set<String> l = new HashSet<String>();
		l.add("apple");
		l.add("banana");
		l.add("orange");
		l.add("kiwi");
		l.add("apple");
		//
		System.out.println( l.size() );
		//
		Iterator<String> it = l.iterator();
		while( it.hasNext() ) {
			String t = it.next();
			System.out.println( t );
		}
	}
}

Set 인터페이스에는 get 함수는 지원하지 않는다. Set 은 보관하되 순서개념이 없기 때문에 List보다 더 빠른 검색과 효율적인 보관을 제공한다.

TreeSet 은 내부적으로 이진트리를 써서 보관한다. - 중복입력을 허용하지 않는다. ( 위의 apple 은 한번만 들어감 )

HashSet 과 TreeSet 둘 모두 Set 인터페이스를 상속하므로 호환성이 생긴다.
HashSet 은 내부적으로 해쉬 알고리즘을 써서 보관한다.
( 동작하는 내부 사정은 다르지만 사용함수는 같으므로 사용자는 같은 방법으로 이용할 수 있다 )


Map

import java.util.Map;
import java.util.TreeMap;
import java.util.HashMap;
//
public class Test128 {
	public static void main( String[] args ) {
		Map<String,String> mp = new TreeMap<String,String>();
		mp.put("apple","사과");
		mp.put("banana","바나나");
		mp.put("orange","오렌지");
		mp.put("kiwi","키위");
		mp.put("apple","사과2"); // apple=사과 에서 apple=사과2 로 변경됨(중복 불허)
		//
		String val = mp.get("apple");
		System.out.println( val ); // 사과2
		//
		Map<Integer,String> mp2 = new HashMap<Integer,String>();
		mp2.put( 100, "apple" );
		mp2.put( 103, "banana" );
		// mp2 에서 banana 문자열 꺼내는 코드
		String val2 = mp2.get( 103 );
		System.out.println( val2 );
	}
}

위와같이 제너릭이 여러개 들어가는 경우도 있다.

이런 쌍을 key, value 라고 이야기한다. a=b 와 같은 형태로 정보를 저장한다. 보통 key 를 이용해서 value 를 얻어내는 형태로 사용한다.

같은 key 로 중복해서 입력하면 앞의 값은 밀어내고 없음 ( 마치 변수대입하듯 )

이러한 형태로 저장하는 인터페이스를 Map 이라 하고 , Dictionary 라고 하는 언어도 있다.
Map<String,String> 에서 앞이 key 에 해당하는 제너릭, 뒤가 value 에 해당하는 제너릭

0개의 댓글