ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 221219 자바 11. 컬렉션 프레임워크 (List, Set, Map)
    스타터스 백엔드 3기 2022. 12. 19. 14:42

    하루입니다.

     


     

    리뷰!!!

     

    java.lang, java.util 패키지

    java.lang.Object toString(), equals() overriding 해서 사용하자.
    java.lang.Integer
    (Wrapper class)

    기본형 변수를 참조형 변수로 변환하는 것이다. 이는 연산자를 미리 제공하여 메소드를 구현하는 것을 뜻한다.

    int i 는 + - * % 등 사용 가능하다.
    Integer in은 메소드에 사용 가능하다.

    java.lang.String
    문자열 관련 가장 많은 메소드를 가지고 있다.

    - 문자열에서 + 연산자를 사용할 때는 StringBuffer()를 사용하자.
    - split("정규표현식")            return String[]
    - join("분리자", String[])      return String

    java.lang.StringBuffer() 문자열 변경이 자주 일어난다면 사용하자.
    java.util.StringJoiner 문자열 분리 특화 메소드
    java.util.Math
    - FINAL 클래스라서 상속 불가하다.
    - staic 메소드 + static 변수를 사용하기에, 객체 생성 없이 사용 가능하다.
    - MATH.XXXX 로 사용 가능함
    - MATH.random() 은 0.0이라서 형변환 하고 + 1도 해줘야 함.

    java.util.Random
    Ramdom r = new Random();
    e.nextInt(100);         1에서 100까지의 난수 생성

     

     

     

    java.util 패키지, java.text 패키지

    java.util.Date
    날짜와 시간을 나타낸다. 
    Date d = new Date();
    대부분 메소드가 deprecated다. 사용을 자제하자.

    java.util.Calender
    국가마다 시간이 달라서 추상 클래스를 사용한다.
    Calender cal = Calender.getInstance();
    cal.get(Calender.YEAR);
    cal.set(2022, 11, 22 ... )           index 기준이니까 11이라고 적어야 12월이다.
    Date d = cal.getTime();
    Date da = new Date();
    cal.setTime(da);

    java.text.DecimalFormat
    # : 의미있는 0만                // 31.4
    0 : 의미없는 0도                // 31.40

    java.text.SimpleDateFormat
    SimpleDateFormat sf = new SimpleDateFormat();



     

     

     

     

    java.util 패키지

    문자열을 효율적으로 / 날짜와 시간 / 컬렉션 프레임워크

     

     

     

     

    컬렉션 프레임워크

    • 컬렉션(여러 데이터 저장) 프레임워크(규칙을 가지며 내부에서 사용된다)
    • public interface Collection<E> extends Iterable<E> {
    interface List interface Map  interface Set
    - 데이터 저장에 순서 있다.
    - 데이터 저장 중복 가능하다.
    - index, value

    - 데이터 = (key, value)
    - 데이터 저장에 순서 없다.
    - 같은 데이터 value 저장 가능하다.
    - 같은 데이터 key 저장 가능하다.
    - { key, value }

    - 데이터 저장에 순서 없다.
    - 데이터 중복 저장 불가하다.
    - value
    implements List
    extends Collection
    implements Map implements Set
    extends Collection
    - LinkedList
    - ArrayList
    - xxxList
    - HashSet
    - TreeSet
    - HashMap
    - HashTable
    - properties

     

     

     


     

     

    자바의 컬렉션 프레임워크

    배열 (컬렉션 아님 복습하는 거임)

    • 배열 길이는 고정되고, 수정이 불가하다.
    • 만약 int[] a = new int[5];      a = new int[10]; 이라고 해도, 5개 배열 100번지 하나 만들어지고 10개 배열 200번지 하나 만들어지고 이렇게 된다. 수정이 아님.
    • 길이를 정하고 시작한다.
    • 동일한 타입의 데이터만 저장할 수 있다.
    • 형변환이 가능하다.

     

     

    1. List - ArrayList

    • 데이터타입 한정 X
    • 갯수 한정 X
    • 최초의 갯수는 10개이다. 동적으로 크기가 변동된다.
    • 참조형변수 데이터만 저장한다. 기본형변수는 참조형변수로 변환하여 저장한다.

     

    ArrayList list = new ArrayList( );          ==>     10개 데이터 저장 갯수 생성, 10개씩 증가

    ArrayList  list = new ArrayList(5);        ==>     5개 데이터 저장 갯수 생성, 5개씩 증가

    ArrayList list = new ArrayList(5,2);      ==>     5개 데이터 저장 갯수 생성, 2개씩 증가

    Integer in = i;                                       ==>    기본형변수를 참조형변수로 변환

     

     

    메소드

    저장메소드 수정 삭제 조회
    add( ) set(  ,  ) remove( ) get( )

    add("java"),
    add(1), 
    add(3.14), 
    add(new A())

    - Object 타입으로 저장

    set (1, "a" ) remove( 1 ) .get( )
    .size( )            int
    .contatins( )    boolean
    .indexOf( )      int

    - Object 타입으로 return

     

     

     

     

    ArrayList의 추가와 삭제

    1. 삭제할 데이터 아래의 데이터를 한 칸씩 위로 복사해서 삭제할 데이터를 덮어쓴다.

    2. 데이터가 한칸씩 위로 이동했으므로 마지막 데이터는 NULL로 변경한다.

    3. size를 1 감소시킨다.

     

    private void fastRemove(Object[] es, int i) {
        modCount++;
        final int newSize;
        if ((newSize = size - 1) > i)
            System.arraycopy(es, i + 1, es, i, newSize - i);
        es[size = newSize] = null;
    }

     

     

     


     

     

     

    자바의 컬렉션 프레임워크

     

     

    0-1. List - LinkedList

    ArrayList LinkedList
    [0][1][2][3][4] ... [n][n+1][n+2] [100 | 값]200 ==> [200 | 값]300 -> [300 | 값] 400 -> ...
    순서대로 저장한다. 삽입 삭제 자주 작업할 때 사용하자.
    주로 조회 수정할 때 사용한다. 조회에 비효율적이다.

     

     

     

     


     

     

    자바의 컬렉션 프레임워크

    queue, stack : 컴퓨터의 저장 기법 중 하나이다.

    Stack Queue
    바구니처럼 위로 쌓는 형태 파이프에 데이터를 넣는 형태
    선입후출 (LIFO) 선입선출 (FIFO)
    push(); pop(); peek(); empty(); add(); remove(); element(); offer(); poll(); peek();
    자바 구현 클래스와 동일 자바 구현 인터페이스와 동일
    List 계열 : 동적 크기, 중복 저장 가능 동적 크기, 중복 저장 가능
    성적을 저장할 때 (중복 성적 있을 수도) 100 이하의 소수 구하기, 로또 번호 구하기

     

    1-1. List - Stack

    push( ); pop( );

    • pop()은 데이터 조회 후 객체를 삭제한다. 그래야 다음 데이터 조회 가능하기 때문이다.
    public static void main(String[] args) {
        Stack st = new Stack();		
        st.push(1);
        st.push(2);
        st.push(3);
    
        while(!st.isEmpty()) { 
            System.out.println(st.pop());	
        }
    }
    
    ------------------------------------------------------------------------
    
    3
    2
    1

    만약 꺼낼 객체가 없다면 뜨는 오류. Empty Stack입니다!!!

     

     

     

     

    peek( );

    • peek()은 맨 위에 저장된 객체를 반환한다. 객체를 꺼내지 않는다.
    public static void main(String[] args) {
        Stack st = new Stack();		
        st.push(1);
        st.push(2);
        st.push(3);
    
        while(!st.isEmpty()) { 
            System.out.println(st.peek()); 
        }
    }
    
    --------------------------------------------------------------------
    
    3
    3
    3
    3
    3
    3
    
    ...
    
    무한루프

     

     

     

     

     

    1-2. Queue

    Queue q = new LinkedList();
    q.offer(1);
    q.offer(2);
    q.offer(3);
    
    while(!q.isEmpty()) {
        System.out.println(q.poll());
    }
    
    -------------------------------------------------------
    
    1
    2
    3

     

     

     


     

     

    자바의 컬렉션 프레임워크

    2. Set - HashSet

    • 중복 데이터 저장 불가 (아예 size에 추가되지 않음)
    • 저장 순서 없다.
    public static void main(String[] args) {
        HashSet lottoSet = new HashSet(6);
    
        while(true) {
            int ran = (int)((Math.random()*45) + 1);
            System.out.println(ran);
            lottoSet.add(ran);
            System.out.println("갯수 : " + lottoSet.size());
            if(lottoSet.size() == 6) break;
        }
        System.out.println(lottoSet);
    }
    
    ------------------------------------------------------------------------
    
    33
    갯수 : 1
    
    16
    갯수 : 2
    
    7
    갯수 : 3
    
    11 
    갯수 : 4
    
    5
    갯수 : 5
    
    16  ---------------------->   중복
    갯수 : 5
    
    11  ---------------------->   중복
    갯수 : 5
    
    10
    갯수 : 6
    
    [16, 33, 10, 11, 5, 7]

     

     

    Iterator

    • 데이터를 반복적으로 조회하는 기능만 있는 컬렉션 종류이다.
    • 데이터를 저장하거나 수정하는 게 아닌, 오로지 조회하는 것이 목표이다.
    • 다음 데이터만 조회 가능하다.
    Iterator it = lottoSet.iterator();
    while(it.hasNext()) {
        System.out.print(it.next() + " ");
    }
    
    for(Object lotto:lottoSet) {
        System.out.println(lotto);
    }
    
    --------------------------------------------------------
    
    40 27 35 19 4 36 
    
    40
    27
    35
    19
    4
    36

     

     

     


     

     

    자바의 컬렉션 프레임워크

    3. Map - HashMap

    • key : 컬렉션 내의 key 중 유일해야 한다.
    • value : key와 달리 데이터의 중복을 허용한다.
    • 메소드 : .put();           ,get();        .keySet();    

     

    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("lee@email.com", "이길동");
        map.put("kim@email.com", "김길동");
        map.put("hong@email.com", "홍홍이");
        map.put("hong2@email.com", "홍길동");
        map.put("hong@email.com", "홍홍이");
    
        Object o = map.get("kim@email.com");
        System.out.println(map);
        System.out.println(o);
    
        // 키 조회
        Set keys = map.keySet();
        for(Object one : keys) {
            System.out.println("key: " + one + ", value: " + map.get(one));
    	}
    }
    
    ------------------------------------------------------
    
    {kim@email.com=김길동, hong2@email.com=홍길동, lee@email.com=이길동, hong@email.com=홍홍이}
    김길동
    key: kim@email.com, value: 김길동
    key: hong2@email.com, value: 홍길동
    key: lee@email.com, value: 이길동
    key: hong@email.com, value: 홍홍이

     

     

    package chap11;
    
    import java.util.HashMap;
    import java.util.Set;
    
    public class HashMapTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		HashMap map = new HashMap();
    		map.put("hong@email.com", new String[] {"홍홍홍", "010-0000-0000","02-0000-0000", "041-0000-0000"});
    		map.put("lee@email.com", new String[] {"이자바", "010-1111-1111"});
    		map.put("kim@email.com", new String[] {"김새싹", "010-2222-2222"});
    		map.put("hong@email.com", new String[] {"홍삼", "010-1111-1111","02-0000-0000", "041-0000-0000"});
    		
    		System.out.println(map.size());
    		Object o = map.get("kim@email.com");
    		System.out.println(map);
    		System.out.println(o);
    		System.out.println();
    		
    		// 키 조회
    		Set keys = map.keySet();
           	 	// key을 Set에 넣었다. Set에 있는 key들을 for문을 사용해서 빼낸다. Object 타입이다.
    		for(Object oneKey : keys) {
    		// map.get(key이름을 for문을 사용해 하나씩 꺼낸 것)을 사용해 나온 key 이름들을
                	// String 타입으로 형변환하여 String[] 배열 value에 담는다.
    			String[] value = (String[])(map.get(oneKey));
    			System.out.println("key: " + oneKey);
    			System.out.println();
    			for(String one : value) {
    				System.out.print(one + " : ");
    			}
    			System.out.println();
    		}
    	}
    }
    
    ------------------------------------------------------------------
    
    김새싹 : 010-2222-2222 : 
    key: lee@email.com
    
    이자바 : 010-1111-1111 : 
    key: hong@email.com
    
    홍삼 : 010-1111-1111 : 02-0000-0000 : 041-0000-0000 :

     

     

     


     

     

     

    Arrays 기타

    • Arrays.toString(arr)
    • Arrays.deepToString(arr2)
    • Arrays.copyOf(arr, 3)
    • Arrays.copyOfRange(arr, 2, 5)
    • Arrays.asList(ran);
    • Arrays.sort(ran);

     

    int[] ran = {4, 7, 2, 7, 56, 13, 28, 42};
    
    // 오름차순 정렬
    Arrays.sort(ran);
    System.out.println(Arrays.toString(ran));
    
    // 타입 변환 : 배열과 ArrayList (정적이냐 동적이냐 / 동일타입이냐 다른타입가능이냐)
    // 배열을 ArrayList로 변환
    List list = Arrays.asList(ran);
    // list.add(100);	// List는 인터페이스타입이기에 형변환이 필요하다. 컴파일 오류는 없다.
    
    // ArrayList를 배열로 변환
    ArrayList list2 = new ArrayList(5);
    list2.add("java");
    list2.add(10);
    list2.add(3.14);
    Object[] list_arr = new Object[list2.size()];
    list2.toArray(list_arr);
    System.out.println(Arrays.toString(list_arr));

     

     

     


     

     

    Comparator

    String[] animals = {"0-dog", "cat", ":snake", "lion"};
    [0-dog, :snake, cat, lion]
     
    String[] animals = {"Dog", "cat", "Snake", "lion"};
    [Dog, Snake, cat, lion]
     
    String[] animals = {"Dog", "cat", "Snake", "lion"};
    Arrays.sort(animals, String.CASE_INSENSITIVE_ORDER);
    [cat, Dog, lion, Snake]
     

     

    Comparator는 앞의 객체와 뒤의 객체를 사용해서 앞의 객체가 크면 +1, 뒤의 객체가 크면 -1, 두 객체가 같으면 0을 반환한다.

    System.out.println(mc.compare("abc", "def"));		// 음수 (처음이 더 작다)
    System.out.println(mc.compare("01", "01"));		// 0 (같다)
    System.out.println(mc.compare("b", "a"));		// 양수 (처음이 더 크다)
    
    -------------------------------------------------------------------------
    
    -3
    0
    1

     

     

     

    기본적으로는 오름차순이다. 내림차순으로 하고 싶다면 어떻게 해야 할까?

    위의 숫자 음과 양을 바꿔주면 된다. return에 -1을 곱하자.

    나만의 비교 메소드를 만들고 사용하자.

     

    public class ComparatorTest {
    
    	public static void main(String[] args) {
    		String[] animals = {"Dog", "cat", "Snake", "lion"};
    		
    		// 사전 순서
    		// 특수문자 > 숫자 > 대문자 > 소문자 > 한글	   ==>		오름차순
    		
    		Arrays.sort(animals, String.CASE_INSENSITIVE_ORDER);
    		System.out.println(Arrays.toString(animals));
    		
    		class MyComparator implements Comparator {
    			@Override
    			public int compare(Object o1, Object o2) {
    				if(!(o1 instanceof String && o2 instanceof String)) {
    					return -1;
    				}
    				String s1 = (String)o1;
    				String s2 = (String)o2;
    				
    				return s1.compareTo(s2) * -1;
    			}
    		}
    		MyComparator mc = new MyComparator();
    		System.out.println(mc.compare("abc", "def"));		// 음수 (처음이 더 작다)
    		System.out.println(mc.compare("01", "01"));		// 0 (같다)
    		System.out.println(mc.compare("b", "a"));		// 양수 (처음이 더 크다)
    		
    		Arrays.sort(animals, mc);
    		System.out.println(Arrays.toString(animals));
    	}
    }
    
    --------------------------------------------------------------------------
    
    오름차순 : [cat, Dog, lion, Snake]
    
    내림차순 : [lion, cat, Snake, Dog]

     

     


     

    ArrayListTest StackQueueTest HashSetTest ArraysTest ComparatorTest

Designed by Tistory.