gi_dor

[Java] CH 11 컬렉션 프레임웍 본문

First/Java

[Java] CH 11 컬렉션 프레임웍

기돌 2023. 6. 9. 14:12
728x90


https://www.youtube.com/@MasterNKS

 

남궁성의 정석코딩

자바의 정석 동영상 강의 채널입니다.(by 저자 남궁성)

www.youtube.com

 

HTML CSS JS SQL JSP Spring 하면서 다 까먹었다!   
그래서 다시 공부하게 되었다! List Set Map 이런게 있었지 까지만 기억난다 진짜 깔끔하게 다 까먹었다!!!

 

 

 


 

목차.


1. 컬렉션 , 프레임웍 ,  컬렉셕 프레임웍
2. List , Set , Map
3. Collection , List , Set , Map 메서드
4. ArrayList - List 
5. LinkedList
6. Stack & Queue
7. Iterator, Enumeration, Map과 Iterator
8. Arrays
9. Comparator , Comparable
10. HashSet
11. TreeSet
12. HashMap
13. Collections 클래스

 


 

 

컬렉션, 프레임웍 , 컬렉션 프레임웍 

 

 

▶ 컬렉션 : 물건을 모아놓은것 -> 여러객체(데이터)를 모아 놓은것
▶ 프레임웍 : frame - 특 work - 작업 -> 어떤 일을 할때 정해진 규칙에 맞게 하는 프로그래밍 방식


🔑 그래서 왜 생긴건데 ?

Web 떡상시절  (2000년대) 웹 개발자가 많이 필요했는데
  각자 자기 방식대로 프로그래밍 하다보니
다른 사람이  고치기에 너무 힘들어 표준화된 프레임웍이 유행했음 
덕분에 프로그래밍 방식이 비슷해서 다른 사람이 와서 유지보수를 해도 이해하기 쉬웠음.

 

Java 부족해서 Spring 힘든거임  , ' 어려운거 아니다 익숙하지 않아서 그런거다 쫄지마라 '.

 

▶ 컬렉션 프레임웍

  • 컬렉션(다수의 객체, 데이터) 를 다루기 위한 표준화된 프로그래밍방식
  • 컬렉션을 쉽고 편리하게 다룰수있는 다양한 클래스를 제공함
  • java.util 패키지에 포함

▶ 컬렉션 클래스 
다수의 데이터를 저장할수 있는 클래스 EX. Vector (구형) , ArrayList ,HashSet 


List  ,  Set  ,  Map
List 순서 O (순서가 있는 데이터 집합) 
중복 O (데이터의 중복 허용)

Ex . 대기자 명단
구현 클래스 : ArrayList , LinkedList , Stack , Vector
Set 순서 X (순서를 유지 하지 않는 데이터 집합)
중복 X  (데이터의 중복을 허용안함)

Ex .  양의 정수 집합 , 소수의 집합 , 집합
구현 클래스 : HashSet , TreeSet
Map key 와 value 가 쌍으로 이루어진 데이터 집합
순서 X
key - 중복 X
value - 중복 O

Ex . 우편번호 , 지역번호
구현 클래스 : HashMap , TreeMap , Hashtable ,Properties

https://hoon26.tistory.com/251

 

 

컬렉션이란?(Collection)[List, set, map]

* Collection? 사전적 의미 : 요소를 수집해서 저장하는 것. 자바에서 컬렉션 프레임워크란, 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.

hoon26.tistory.com

 

 

컬렉션이란?(Collection)[List, set, map]

* Collection? 사전적 의미 : 요소를 수집해서 저장하는 것. 자바에서 컬렉션 프레임워크란, 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.

hoon26.tistory.com

 


예시

List - 대기자 명단 , 순서가 있고 중복이 있음
1. 한디핵
2. 김그레이
3. 박지올
4. 한디핵 (동명이인)
5. 노로꼬
6. 염밀리
7. 신담률
8. 이블루
Set 집합 - 순서 상관 없고 중복도 없는 집합
4발달린 동물의 집합
고양이 , 호랑이 , 사자 , 개 , 코끼리  
Map  - 지역번호 
순서 상관없고 , id(key)는 중복허용안함 , pw(value)는 중복허용

02 - 서울 , 031 - 경기도
id - pw

 


Collection 인터페이스 - List 와 Set의 공통부분으로 만들어짐

boolean add (Object o)  
boolean addAll(Collection c)
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가한다
boolean remove(Object o)
지정된 객체를 삭제한다
boolean removeAll(Collection c)
지정된 Collection에 포함된 객체들을 삭제함
void clear() 전체 삭제
boolan isEmpty()
Collection이 비어있는지 확인한다.
int size()
Collection에 저정된 객체의 개수를 반환함
boolean contains(Object o)
boolean contatinsAll(Collection c)
지정된 객체 (o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인
boolean equals(Object o)
동인한 Colllection인지 비교하기

List 인터페이스  - 순서 O 중복 O

추가
void add(int index , Object element)
boolean addAll(int index , Collection c)
지정된 위치(index)에 객체 (element) 또는 컬렉션에 포함된 객체들을 추가함 
삭제
Object remove (int index) 
지정된 위치에 있는(index)에 위취에 객체를 삭제하고 , 삭제된 객체를 반한다, 
읽어오기 , 객체 가져오기
Object get(int index)
지정된 위치 (index)에 있는 객체를 반환
변경
Object set(int index)
지정된 위치 (index)에 객체(element)저장함
검색 -  어떤 객체가 몇번째 저장 되어있는지 , 객체의 저장된 위치를 알려줌
int indexOf(Object o)   - 왼 쪽 에서 오른 쪽으로
지정된 객체의 위치(index)를 반환
(List의 첫번째 요소부터 순방향으로 찾음)
검색
int lastIndexOf(Object o)  - 오른쪽에서 왼 쪽으로 찾음
지정된 객체의 위치(index)를 반환
(List의 마지막 요소부터 역방향으로 찾는다)
정렬
void sort(Comparator c)
지정된 범위 (from ~ to) 에있는 객체를 뽑아냄
List subList(int fromIndex , int toIndex)

Set 인터페이스 - 순서 X 중복 X

boolean add(Object O)   
지정된 객체 (o) 를 Collection 에 추가한다
void clear()
Collection의 모든 객체를 삭제한다
boolean contains(Object o)
지정된 객체가 Collection에 포함되어 있는지 확인한다
boolean equals(Object o)
동일한 Collection 인지 비교한다
int hashCode()
Collection의 hash code 반환
boolean isEmpty()
Collection 이 비어있는지 확인한다
Iterator iterator()
Iterator를 얻어서 반환함
boolean remove(Object o)
지정된 객체를 삭제
int size()
Collection에 저장된 객체의 개수를 반환

 

// 집합 관련 메서드 (Collection에 변화가 있으면 true , 아니라면 false 반환)

boolean addAll(Collection c) // 지정된 Collection(c)의 객체들을 Collection에 추가한다 (합 집합)
boolean containsAll(Collection c) // 지정된 Collection 의 객체들이 Collection에 포함되어 있는지 확인한다 (부분 집합)
boolean removeAll(Collection c) // 지정된 Collection에 포함된 객체들을 삭제한다 (차 집합)
boolean retainAll(Collection c) // 지정된 Collection에 포함된 객체만을 남기고 나머지는 Collection에서 삭제한다 (교 집합 )

Map 인터페이스 - 순서 X 중복 (key X , value O)

삭제
void clear()
Map의 모든 객체 삭제

Object remove(Object key)
지정한 key 객체와 일치하는 key - value 객체를 삭제한다
검색
boolean containsKey(Object key)
지정된 key와 일치하는 Map의 key 객체가 있는지 확인

boolean containsValue(Object value)
지정된 value 객체와 일치하는 Map의 value 객체가 있는지 확인

Object get(Object key)
지정한 key 객체에 대응하는 value 객체를 찾아서 반환한다
추가
Object put(Object key, Object value)
Map에 value 객체를 key객체에 연결 하여 저장함

void putAll(Map t)
지정된 Map의 모든 key-value 쌍을 추가함
읽기
Set entrySet()
Map에 저장되어있는 key - value 쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환

Set keySet()  
Map에 저장된 모든 key 객체를 반환

Collection values() 
Map에 저장된 모든 value 객체를 반환

 


구현 클래스

 



ArrayList - List 

기존 vector 개선한 버전 , 구현원리와 기능적으로 동일 하다고함 (근데 vector 설명 책에서 못본거 같은데 ?)

List인터페이스를 구현 하므로 , 저장순서가 유지되고 중복을 허용함  - 순서 O  중복 O

데이터 저장공간으로 배열을 사용함

 

public class ArrayList extends AbstractList
	implements List, RandomAccess, Cloneable, java.io.Serializable {
		...
	transient Obejct[] elementData; // Obejct 배열, 모든 종류의 객체를 담을 수 있다.
		...
}

ArrayList 의 메서드

생성자
ArrayList()  // 기본 생성자
ArrayList(Collection c)
ArrayList (int initialCapacity)  // 배열의 길이
추가 
성공 - true , 실패 - false
boolean add(Object o) 
void add(int index , Object element)  // 어디에 저장할지 위치 선정가능
boolean addAll(Collection c) 
boolean addAll(int index ,Collection c)
삭제

boolean remove (Object o)
Object remove(int index)  // 특정위치 삭제
boolean removeAll(Collection c)
void clear() // 모든 객체 삭제
검색

int indexOf(Object o) // 객체가 몇번째 저장되어있는지 , 못찾으면 -1 반환함

int lastIndexOF(Object o)	// 오른쪽에서 왼쪽으로 객체가 몇번째에 있는지 찾음

boolean contains(Object o)	// 특정된 객체가 있는지 ?

Object get(int index)	// 특정위치에 있는 객체 읽기
	
Object set(int index, Object element)	// 특정위치에 있는 객체를 바꿈 , 변경

List subList(int fromIndex , int toIndex) // from ~ to-1 객체 뽑아냄

Object [] toArray()  	// ArrayList의 객체 배열을 반환

boolean isEmpty()	// 비어있는지

void trinToSize() 	// 빈공간 제거

int size() //	저장된 객체 갯수 반환

 

실습

package ch11_1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.*;

public class ArrayListExample {
    public static void main(String[] args) {

        System.out.println("예제 11-1 ");
        // 기본길이 10 인 (capacity) ArrayList 생성
        ArrayList list1 = new ArrayList(10);
        // ArrayList에는 객체만 저장가능
        // autoboxing에 의해서
        // list1.add(5); 라고 작성해도  lst1.add(Integer(5)); 라고 인식함

        //list1.add(new Integer(5));
        list1.add(5);
        list1.add(new Integer(4));
        list1.add(new Integer(2));
        list1.add(new Integer(0));
        list1.add(new Integer(1));
        list1.add(new Integer(3));
        System.out.println("list1 = "+ list1);

        ArrayList list2 = new ArrayList(list1.subList(1,4)); // list1 = [5 4 2 0 1 3]
        System.out.println("list2 = " + list2);              // 4 2 0

        // Collection != Collections
        // Collection 인터페이스 , Collections 유틸클래스
        Collections.sort(list1);
        Collections.sort(list2);
        System.out.println("list1 = " + list1);
        System.out.println("list2 = " + list2);

        list1.containsAll(list2);
        // list1이 lsst2에 모든 요소를 포함 하고있는가 ?
        System.out.println("list1.containsAll(list2) = "+list1.containsAll(list2));
        
        list2.add("B");
        System.out.println("list2 = " + list2);
        list2.add("C");
        System.out.println("list2 = " + list2);
        list2.add(3,"AA");
        System.out.println("list2 = " + list2);

        System.out.println("--------------------------");
        System.out.println("list1 = " + list1);
        System.out.println("list2 = " + list2);

        list2.set(3,"A");
        System.out.println("list2 = " + list2);
        System.out.println(" ----------------------");
        System.out.println("list1에서 list2와 겹치는 부분만 '남기고' 나머지는 삭제함 " );
        System.out.println("list1.retainAll(list2) =  "+ list1.retainAll(list2));
        System.out.println("list1 = " + list1);
        System.out.println("list2 = " + list2);

        System.out.println("-------------------------");
        list1.add(10);
        list1.add(1);

        list1.remove(1); // 인덱스가 1인 객체를 삭제  0 2 4 10 1 중에 2 삭제
        list1.remove(new Integer(1)); // 값 1을 삭제함 0 4 10 1 중에  1삭제


        // list2에서 list1에 포함된 객체들을 삭제한다
        for(int i = list2.size()-1; i >=0 ; i--){
            if(list1.contains(list2.get(i)))
                list2.remove(i);    // 인덱스가 i인 곳에 저장된 요소를 삭제
        }


        System.out.println("list1 = " + list1);
        System.out.println("list2 = " + list2);

    }
}

 

✔ ArrayList 저장된 객체의 삭제 과정

ArrayList에 저장된 세번째 데이터 (data[3] 아님 data[2] 임) 를 삭제하는 과정  list.remove(2) 를 호출함

1️⃣ ArrayList에 저장된 첫번째 객체부터 삭제하는 경우 

for(int i = 0; i<list.size; i++){
	list.remove(i);
    }

✔ 다 지워지지 않고 값이 남아있음 
그러면 어떻게 삭제하지 ? ▶ 반대로 뒤에서 부터 삭제

2️⃣ ArrayList에 저장된 마지막 객제부터 삭제하기

for(int i = list.size()-1; i>=0; i--){
	list.remove(i);
    }

 

 


배열의 장단점 

▶ 장점 
배열은 구조가 간단하고 데이터를 읽는데 걸리는 시간이 짧다 (접근시간)

▶ 단점
◾ 크기를 변경할수 없다
- 크기를 변경해야 하는 경우 새로운 배열을 생성 후 데이터를 복사 해야함

배열의 저장공간이 부족해 새로운 배열을 만들 때 어떻게 해야하나 ?
🔑 기존 배열보다 더큰 배열을 생성 (보통 기존의 배열에 2배 크기로 만듬) → 기존내용을 복사 →  참조를 변경함

◾ 비 순차적인 데이터의 추가 , 삭제에 시간이 많이 걸린다
- 데이터를 추가하거나 삭제하기위해 다른 데이터를 옮겨야함
- 그러나 순차적인 데이터 추가 (끝에 추가) 와 삭제 (끝부터 삭제)는 빠르다.


LinkedList

 배열의 단점을 보완함.

배열과 다르게 링크드리스트는 불연속적으로 존재하는 데이터를 연결 한다 (link)

 

 

◾ 링크드 리스트 - 연결리스트 . 데이터의 접근성이 나쁨 (불 연속적)

 

◾ 더블리 링크드 리스트 - 이중 연결리스트 , 접근성 굿

 


ArrayList vs LinkedList  - 성능비교

 

1️⃣ 순차적으로 데이터를 추가 / 삭제 - ArrayList 가 빠름

2️⃣ 비순차적으로 데이터를 추가 / 삭제 - LinkedList 가 빠름

3️⃣ 접근시간 - ArrayList 가 빠름

🔑 인덱스가 n인 데이터의 주소 =  배열의 주소 + n * 데이터 타입의 크기

 

컬렉션 읽기 - 접근시간 추가 / 삭제  
ArrayList (배열 기반) 빠름 느림 ◾ 순차적인 추가삭제는 더 빠름
◾ 비효율적 메모리 사용 - 성늘을 높이려고 배열을 크게 설정함
LinkedList (연결 기반) 느림 빠름 ◾ 데이터가 많을수록 접근성 떨어짐

Stack  &  Queue

 

 Stack은 클래스 , Queue는 인터페이스 인거 이제 알았네;;

 

▶ 스택 Stack : LIFO구조  , 마지막에 저장된 것을 제일먼저 꺼낸다
Last InFirst Out

✔ 배열에 적합
◾ 데이터를 순차적으로 추가 , 제거 하기 때문임

Stack st = new Stack();

boolean empty(); // stack이 비어있는지 알려줌

Object peek();	// stack의 맨위에 저장된 객체를 반환  (꺼내지 않고 보기만 한다고 생각하면됨)

Object pop();	// stack의 맨위에 저장된 객체를 꺼낸다
Object push(Object item);	// stack에 객체(item)를 저장함

int search(Object o);	// stack에서 주어진 객체 를 찾아서 위치를 반환 . 못찾으면 -1 반환
						// 0이아닌 1부터 시작함

 


▶  큐 QUEUE : FIFO 구조  . 제일먼저 저장한것을 제일 먼저 꺼내게된다
First In First Out

✔ 링크드 리스트가 적합
◾ 항상 첫번째로 저장된 데이터를 삭제하기 때문 (왼 → 오)
◾ 삭제시 자리 이동이없음 
◾ 데이터의 복사가 발생하기 때문에 비효율적이다.

Queue que = new LinkedList();

boolean add(Object o)	// 지정된 객체를 Queue에 추가함 . 성공시 true , 저장공간부족시 exception뜸

Object remove();	// 삭제 , 객체를 꺼내서 반환  , 예외 발생

Object element();	// 삭제없이 요소를 읽음 , Queue 비어있으면 예외 발생

boolean offer(Object o);	// Queue에 객체를 저장,추가 . 성공하면 true ,실패시 false

Object poll();	// Queue에서 객체 꺼내서 반환 비어있으면 null뜸 예외 발생x

Object peek();	// 삭제 없이 요소 읽어옴 , 비어잇으면 null 예외 발생 x

실습

package ch11_1;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class Stack_Queue {
    public static void main(String[] args) {

        Queue que = new LinkedList();       // queue는 인터페이스야 ~ 클래스 아니야 ~ 잊지마~~~~

        que.add("1번 요소");
        que.add(2);
        que.add("세 번째 요소");
        que.add(new Integer(4));
        System.out.println("que = " + que);
        
        int size = que.size();
        System.out.println("que size = " + size);

        Stack stc = new Stack();            // stack은 vector 클래스 상속받아서 add() 메서드도 사용가능하다고함
        stc.add("1번");
        stc.add(new Integer(2));
        stc.add(3);
        stc.add("네 번째 요소");

        System.out.println("stc = " + stc);
        System.out.println("======================================");

        que.offer("0");
        que.offer(1);
        que.offer(new Integer("3"));
        que.offer("사");

        System.out.println("que = " + que);
        System.out.println();

        stc.push("0");
        stc.push(1);
        stc.push(new Integer(2));
        stc.push("오");

        System.out.println("stc = " + stc);

        System.out.println(" QUEUE  = " +  que);
        while(!que.isEmpty()){
            System.out.println(que.poll()); // poll() 메서드는 Queue에서 객체를 하나씩 반환함  비어있으면 null반환
        }                                    // 가장 먼저 넣은 거를 가장먼저 뱉어냄  First In First Out

        System.out.println(" -----------------------------");

        System.out.println("stc = " + stc);
        while (!stc.isEmpty()){
            System.out.println(stc.pop());  // pop() 메서드는 Stack의 맨위에 부터 저장된 객체를 꺼냄
        }                                   // 마지막에 넣은걸 가장 먼저 뱉어냄  Last In First Out


        Stack st = new Stack();
        st.push("오");
        st.push("늘");
        st.push("따");
        st.push("라");
        st.push("집");
        st.push("에");
        st.push("가");
        st.push("고");
        st.push("싶");
        st.push("다");

        System.out.println(st);

        Queue q =  new LinkedList();
        q.offer("집에서");
        q.offer("잠");
        q.offer("자");
        q.offer("고");
        q.offer("싶");
        q.offer("다");



        while(!q.isEmpty()){
            System.out.println(q.poll());
        }


    }
}

 

 


 Iterator , Enumeration , ListIterator ,  Map과 Iterator


◾ 컬렉션에 저장되어있는 데이터를 읽어오는데 사용되는 '인터페이스'
Enumeration 은 Iteraor의 구버전
◾ ListIterator 는 Iterator의 접근성을 향상 시킨것 - ( 단방향 → 에서 양방향 ⇄ )
Iterator 만 알면됨 !

🔑 Iterator  메서드

boolean hasNext() - 확인 , 읽어올 요소가 남아있는지 확인한다
Object next() -  읽기,다음 요소를 읽어온다  , 호출전에 hasNext()를 호출해서 읽어올 요소가 있는지 확인하는게 안전함.

🔑 Enumeration (구형 버전) 메서드

boolean hasMoreElements() - 확인 , 읽어올 요소가 남아있는지 확인
Object nextElement() - 읽기, 다음 요소를 읽어옴

 Iterator

◾ 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화 한것
◾ 컬렉션에 iterator() 호출해서 Iterator를 구현한 객체를 얻어서 사용

 

List list = new ArrayList();
Iterator it = list.iterator();  // Iterator 객체를 반환

// iteraor() 가 Collection인터페이스의 정의되어있어서
// 자손인 List , Set 이 가지고있는 메서드임

while (it.hasNext()) {	// hasNext()로 읽어올 요소가 있는지 확인
	System.out.println(it.next());	// next() 요소 읽어오기
    }

 

Map과 Iterator

◾ Map에는 iterator() 가 없다 , Collection 인터페이스를 상속받지 않음. 
◾ Map에 저장된 요소를 가져 오려면 ? Set 또는 Collection으로 변경후  iterator() 사용

Iterator iterator = map.keySet().iterator();	
// Set s = map.keySet();
// Iterator iterator = set.iterator();

Iterator it1 = map.values().iterator();
Iterator it2 = map.eatrySet().iterator();

.


 

 Arrays

java.util.class 에 속해있음

🔑 Arrays 와 Array 

◾ Arrays

Array (배열)를 다루기 위한 조작 기능을 가진 클래스
모두 static 메서드

◾ Array

정적배열  -  고정 크기의 배열 , 크기를 프로그래머가 미리 지정함
길이가 고정 - 변경하고 싶다면 새로운 크기의 배열을 만들고 기존 데이터를 복사함
기본형 , 참조형 모두 받을수 있음
메서드는 따로 없음


- toString()

toString(arr[]);
deepToString(arr[][]);

// 다차원 배열을 toString()으로 할시 배열의 주소가 나옴

- copyOf()		배열의 복사

copyOf(); // 배열전체
copuOfRange();	// 배열 일부분만 from <= x < to 복사

- fill() ,  setAll()   배열채우기

fill(arr,(i)); // 배열의 모든 요소를 지정된 (i) 값으로 채움 
setAll(arr,(i)-> (int)(Math.random()*5)+1); // 배열을 채우는데 쓸 함수

- sort() , binarySearch()	 배열 정렬과 검색

sort(arr[]); // 배열 정렬 , 작은것부터 순서대로 
binarySearch(index); //  배열이 정렬된 상태에서 index에 위치한 값 찾아내기

-- equals() , deepEquals();

equals(arr2,arr3);
deepEquals(arr4,arr5) - 다차원 배열의 비교

-- 배열을 List로 변환 - asList(Object....a)
asList(Object....a);
List list = new ArrayList (Arrays.asList(1,2,3,4,5,6));

실습

package ch11_1;

import java.lang.reflect.Array;
import java.util.Arrays;

public class Arrays_Ex {
    public static void main(String[] args) {
        int[] arr = {0,1,3,5,2,4,6,9,10};
        int[][] arr2 = {{11,6,21},{27,17,19}};

        // 배열 출력 toString()
        System.out.println("arr = "+ Arrays.toString(arr));
        System.out.println("arr2 = "+ Arrays.toString(arr2));
        System.out.println("arr2 = "+ Arrays.deepToString(arr2));

        // 배열 복사 copyOf()

        int[] arr3 =  Arrays.copyOf(arr,arr.length);
        int[] arr4 = Arrays.copyOf(arr,3);
        int[] arr5 = Arrays.copyOfRange(arr,2,4);
        int[] arr6 = Arrays.copyOfRange(arr,0,7);

        System.out.println("arr3 = " +Arrays.toString(arr3) );
        System.out.println("arr4 = " +Arrays.toString(arr4) );
        System.out.println("arr5 = " +Arrays.toString(arr5) );
        System.out.println("arr6 = " +Arrays.toString(arr6) );
        
        int[] arr7 = new int[6];
        Arrays.fill(arr7,10);
        System.out.println("arr7 = " + Arrays.toString(arr7));

        Arrays.setAll(arr7,(i)-> (int)(Math.random()*45)+1);
        System.out.println("arr7 = " + Arrays.toString(arr7));


        String[][] starr2 = new String[][]{  {"aaa","bbb"}, {"AAA","BBB"} };
        String[][] starr3 = new String[][]{  {"aaa","bbb"}, {"AAA","BBB"} };

        System.out.println(Arrays.equals(starr2,starr3));
        System.out.println(Arrays.deepEquals(starr3,starr2));

    }
}

 

Comparator , Comparable

 

🔑 객체 정렬에 필요한 메서드 (정렬 기준)를 정의한 인터페이스
✔ 사용 하려면 인터페이스 내에 선언된 메서드를 구현 해야겠네 ?

 

💎 두 인터페이스는 객체를 비교 할수 있도록 만든다.

 

// 기본형 은 < , > == 쉽게 비교 가능함
int a = 1;
int b = 2;

if(a>b){
 	 System.out.println("a가 큼");
  } else if(a==b){
 	 System.out.println("a랑 b랑 같음");
  } else{
  	System.out.println("b가 큼");
    }
    
    
    
    class Student {
 
	int age;			// 나이
	int classNumber;	// 학급
	
	Student(int age, int classNumber) {
		this.age = age;
		this.classNumber = classNumber;
	}
}


	Student a = new Student(17, 2);	// 17살 2반
	Student b = new Student(18, 1);	// 18살 1반
    // ... 참조형은 뭐 어떻게 비교 하라고
참조형은 사용자가 기준을 정해 주지 않아서
어떤 객체가 더 높은 우선순위를 가지는디 판단 할수 없다.

어떤걸 기준으로 우선순위를 정해서 비교 할것인가?
age ? , classNum ? 어떤기준 ?

이 문제를 위해   'Comparable 또는 Comparator가 쓰인다'

 https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

 

Comparable - 기본 정렬 기준을 구현하는데 사용 (default 정렬)
Comapartor - 기본 정렬 기준외에 다른 기준으로 정렬 할 때 사용

비교 하는 대상이 존재시 , 왼쪽이 크면 양수 , 오른쪽이 크면 음수 , 동일 하다면 0 으로 반환함.

 public interface Comparable{
 	int compareTo(Object o);	// 자신과 다른객체 (o)를  비교
    }


public interface Compartor{
	int compare (Object o1 , Object o2);	// o1, o2 두객체를 비교함
  	  boolean equals(Object obj);
       // o1, o2를 비교해서 정수 값으로 반환함
  	  // 결과값이 0 이면 같음 , 양수 = 왼쪽이 큼 / 음수 = 오른쪽이큼
    }
    

Comparable - campareTo(o)
Comparator - compare(o1 ,o2)

✔  Comparable - campareTo(o)   

✔   Comparator - compare(o1 ,o2)  

진짜 헷갈린다!

🔑 compara() 와 compareTo()는 두 객체의 비교 결과를 반환 하도록 작성

Comparable은 "자기 자신과 매개변수 객체를 비교"

 Comparator는 "두 매개변수 객체를 비교"


package ch11_1;

import java.util.Arrays;
import java.util.*;
public class Ex_Comparator_Comparable {
    public static void main(String[] args) {

        String [] stArr = {"cat","Dog","lion","tiger"};

        Arrays.sort(stArr);  // String의 Comparable 구현에 의한 정렬 이라고함...
        System.out.println("stArr = " + Arrays.toString(stArr)); //stArr = [Dog, cat, lion, tiger]

        Arrays.sort(stArr,String.CASE_INSENSITIVE_ORDER);   // 대소문자 구분안함
        System.out.println("stArr = " + Arrays.toString(stArr)); //stArr = [cat, Dog, lion, tiger]

        Arrays.sort(stArr, new Descending()); // 역순정렬
        System.out.println("stArr = " + Arrays.toString(stArr)); //stArr = [tiger, lion, cat, Dog]

    }
}
class Descending implements Comparator{
    public int compare(Object o1, Object o2){
        if(o1 instanceof Comparable && o2 instanceof  Comparable){
            Comparable c1 = (Comparable)o1;
            Comparable c2 = (Comparable)o2;
                return c1.compareTo(c2) * -1; // -1 곱해서 기본 정렬 방식을 역으로 변경
        }
        return -1;
    }
}

https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary

 

Comparator (Java Platform SE 8 )

Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. In the foregoing description, the notation sgn(expression) designates the mathematical s

docs.oracle.com

https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#method.summary

 

Comparable (Java Platform SE 8 )

This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method. Lists (and arrays) of o

docs.oracle.com



HashSet - 순서 x 중복 x

Set 인터페이스를 구현한 대표 컬렉션

◾ HashSet 

- Set 인터페이스를 구현한 대표적인 클래스
- 순서를 유지하려면 LinkedHashSet클래스를 사용
- 객체를 저장 하기전에 기존에 같은 객체가있는지 확인
- 같은 객체가 없으면 저장하고 , 있으면 저장하지 않는다.

 

HashSet()  // 생성자

HashSet(Collection c) // 생성자

HashSet(int initialCapacity) // 초기용량 

boolean add(Object o)	// 추가
boolean addAll(Collection c)	// 

boolean remove(Object o)	// 삭제
boolean removeAll(Collection c)	// 삭제 ,교집합
boolean retainAll(Collection c)	// 조건부 삭제 , 차집합
void clear()	// 모두삭제

boolean isEmpty()	// 비어있는가 ?
int size()	// 저장된 객체수 
Object[] toArray()	// set에 저장되어있는 객체를
Object[] toArray(Object[] a)	// 객체 배열로 반환

boolean contains(Object o) 	// 포함되어있는지 true / false
boolean containsAll(Collection c)  // 여러객체가 모두 포함 되어있는지 
Iterator iterator()

 

package ch11_1;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Hash_Ex1 {
    public static void main(String[] args) {
        Object[] obj ={"1",new Integer(1),"2","2","3","3","4","4","4"};
        Set set = new HashSet();

        for(int i = 0 ; i<obj.length; i++){
            set.add(obj[i]);    // HashSet에 obj 요소들 저장하기
        }

        System.out.println("set = " + set);
        // set= 1,1,2,3,4
        // 왜 이런 결과일까 ?

        // 1. Set 특징 , 순서 x 중복 x 이기 때문에  2,3,4의 중복들은 제거가 되었음
        // 2. 그러면 1 ,1 이거 두개는 ? String 인스턴스, Integer 인스턴스로 서로 다른 객체임 중복이아님

        // HashSet에 저장된 요소들을 출력함
        Iterator it = set.iterator();

        while (it.hasNext()){ // has.Next() 읽어올 요소가 있는지 확인하기
            System.out.println(it.next());  // next() 요소 하나 꺼내오기
        }



    }
}

 

package ch11_1;

import java.util.*;

public class Hash_Ex2 {
    public static void main(String[] args) {
        Set set = new HashSet();

        // set의 크기가 6보다 작은동안 1 ~ 45 사이의 난수를 저장
        for(int i = 0; set.size()<6; i++){
            int num = (int)(Math.random()*45)+1;
        //    set.add(new Integer(num));
            set.add(num);
        }

        List li = new LinkedList(set); // set의 모든 요소를 list에 저장
        Collections.sort(li);   // list 저장
        System.out.println("li = " + li);   // list 출력
    }
}
package ch11_1;

import java.util.HashSet;
import java.util.Iterator;

public class Hash_Ex3 {
    public static void main(String[] args) {

      HashSet setA = new HashSet();
      HashSet setB = new HashSet();
      HashSet setHab = new HashSet();
      HashSet setKyo = new HashSet();
      HashSet setCha = new HashSet();

      setA.add("1");
      setA.add("2");
      setA.add("3");
      setA.add("4");
      setA.add("5");

        System.out.println("setA = " + setA);
      setB.add("4");
      setB.add("5");
      setB.add("6");
      setB.add("7");
      setB.add("8");

        System.out.println("setB = " + setB);


        // 교 집합  A랑 B중에 공통점
        Iterator it = setB.iterator(); // set B 45678
        while(it.hasNext()) {
            Object tmp = it.next();
            if(setA.contains(tmp))  // SetA에 4가 있는가 , 5가있는가 6이있는가 7이있는가 8이 있는가
                setKyo.add(tmp);
        }


        it = setA.iterator();
        while(it.hasNext()){
            Object tmp = it.next();
            if(!setB.contains(tmp)) // Set B에 없는것만 저장
                setCha.add(tmp);
        }

        it = setA.iterator();
        while(it.hasNext())
            setHab.add(it.next());

        it = setB.iterator();
        while(it.hasNext())
            setHab.add(it.next());

        System.out.println("A ∩ B = " + setKyo);
        System.out.println("A ∪ B = " + setHab);
        System.out.println("A - B = " + setCha);



    }
}

 

package ch11_1;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSet_Ex5 {
    public static void main(String[] args) {
        Object[] obj = {2,"2","2",new Integer(2),"3","3","1",1,new Integer(1),"4",4,new Integer(4)};
        Set set = new HashSet();
        
        for(int i = 0; i<obj.length; i++){
            System.out.println(obj[i] +"="+  set.add(obj[i]));
        }
        System.out.println("set = " + set);

        Iterator it = set.iterator();

        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}


 TreeSet

 

◾ TreeSet

- 범위검색과 정렬에 유리한 컬렉션 클래스
- HashSet보다 데이터 추가 , 삭제에 시간이 더 걸림



12. HashMap
13. Collections 클래스

728x90