java 안에는 기본적으로 많이 사용하는 자료구조들이 제공된다.
크게 3가지 인터페이스를 상속받아 만들게 된다.
'이것들을 총칭해서 Collection
이라고 부른다'
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 를 상속받아 만들어진 클래스들의 특징
인터페이스는 클래스간 호환성
을 만든다. List 가 인터페이스니까
이를 상속받은 LinkedList
와 ArrayList
는 상호간 호환성이 있다. ( 별도의 클래스지만 )
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
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 은 내부적으로 해쉬 알고리즘을 써서 보관한다.
( 동작하는 내부 사정은 다르지만 사용함수는 같으므로 사용자는 같은 방법으로 이용할 수 있다 )
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 에 해당하는 제너릭