열심히 끝까지

Java2 day13 본문

Java2(주말)

Java2 day13

노유림 2022. 5. 21. 21:16

JAVA2 day05
[13일차 수업내용]
1. Arrays
2. Comparable, Comparator
3. HashSet
4. Hashmap
===========================================================
1. Arrays
            - Arrays 클래스에는 배열을 다루는데 유용한 클래스가 정의
            - 클래스 내부의 모든 메소드는 static 메소드 ==> 인스턴스가 필요 없음

            ① 배열의 복사 - copyOf(), copyOfRange()
                        - copyOf()는 배열 전체를, copyOfRange()는 배열의 일부를 복사해서
                          새로운 배열을 만들어 냄
                        - copyOfRange()에 지정된 범위의 끝은 포함되지 않음

            ② 배열의 정렬과 탐색 - sort(), binarySearch()
                        - sort()는 배열을 정렬할 때, 
                          그리고 배열에 저장된 요소를 검색할 때는 binarySearch()를 사용
                        - binarySearch()는 배열이 정렬된 상태이어야 올바른 결과를 찾음

            ③ 문자열의 비교와 출력 - equals(), toString()
                        - toString()은 일차원배열에서만 사용할 수 있으며,
                          다차원배열에서는 deepToString()을 사용해야 함
                        - eqals()도 마찬가지로 일차원배열에서만 사용가능하므로,
                          다차원배열의 비교에는 deepEquals()를 사용해야 함

            ④ 배열을 List로 변환 - asList(Object... a)
                        - asList()는 배열을 List에 담아서 반환
                        - asList()가 반환한 List의 크기를 변경할 수 없으나 
                          저장된 내용의 변경은 가능
                        - 만약 크기를 변경할 수 있는 List가 필요하다면?
                          new ArrayList(Collection c); 생성자를 이용해 새로 만들어야 함

--------------------------------------------------------------
package arrays;

import java.util.Arrays;

public class ArraysEx {
            public static void main(String[] args) {
                        // copyOf(), copyOfRange()
                        int[] arr = {0, 1, 2, 3, 4};
                        int[][] arr2D = {
                                    {11, 12, 13},
                                    {21, 22, 23}
                        };

                        int[] arr2 = Arrays.copyOf(arr, arr.length);
                        // [0, 1, 2, 3, 4]
                        int[] arr3 = Arrays.copyOf(arr, 3);
                        // [0, 1, 2]
                        int[] arr4 = Arrays.copyOf(arr, 7);
                        // [0, 1, 2, 3, 4, 0, 0]
                        int[] arr5 = Arrays.copyOfRange(arr, 2, 4);
                        // [2, 3, 4] -> 답은 [2, 3] 마지막 4의 인덱스는 안찍어줌
                        int[] arr6 = Arrays.copyOfRange(arr, 0, 7);
                        // [0, 1, 2, 3, 4, 0, 0]

                        // toString()
                        System.out.println("arr : " + Arrays.toString(arr));
                        System.out.println("arr2 : " + Arrays.toString(arr2));
                        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));
                        System.out.println("arr2D : " + Arrays.toString(arr2D));
                        System.out.println("arr2D : " + Arrays.deepToString(arr2D));
                        System.out.println();

                        // equals(), deepEquals()
                        System.out.println(Arrays.equals(arr, arr2));
                        System.out.println();

                        String[][] str2D = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
                        String[][] str2D2 = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};

                        System.out.println("str2D : " + Arrays.toString(str2D));
                        System.out.println("str2D2 : " + Arrays.toString(str2D2));
                        System.out.println(Arrays.equals(str2D, str2D2));
                        System.out.println();
                        System.out.println("str2D : " + Arrays.deepToString(str2D));
                        System.out.println("str2D2 : " + Arrays.deepToString(str2D2));
                        System.out.println(Arrays.deepEquals(str2D, str2D2));
                        System.out.println();

                        // sort(), binarySearch()
                        int[] numArr = {0, 7, 5, 1, 2};
                        System.out.println("numArr : " + Arrays.toString(numArr));
                        System.out.println("index of 1 : " + Arrays.binarySearch(numArr, 1));
                        Arrays.sort(numArr);
                        System.out.println("===== After sorting =====");
                        System.out.println("numArr : " + Arrays.toString(numArr));
                        System.out.println("index of 1 : " + Arrays.binarySearch(numArr, 1));

                         // asList()
                        List list = Arrays.asList(1, 2, 3, 4, 5);
                        System.out.println("list : " + list);
                        System.out.println("list.size() : " + list.size());
                        // list.add(6); add는 쓸 수 없음
                        list = new ArrayList(list);
                        list.add(6);
                        System.out.println("list : " + list);
            }
}

====================================================================

2. Comparable, Comparator
            - Arrays.sort()를 호출하면 컴퓨터가 알아서 배열을 정렬하는 것처럼 보이지만
              그게 아닌 사실 Comparable 인터페이스 구현에 의해 정렬이 된 것
            - Comparator와 Comparable은 모두 인터페이스로 컬렉션을 정렬하는데
              필요한 메소드를 정의하고 있으며, Comparable을 구현하고 있는 클래스들은
              주로 Integer와 같은 래퍼클래스, String과 같은 것들이며 기본적으로
              오름차순으로 정렬하도록 구현되어 있음
                        ==> Comparable을 구현한 클래스는 정렬이 가능하다는 것을 의미
            - compare()와 compareTo()는 선언형태와 이름이 약간 다를 뿐 두 객체를 비교한다는
              같은 기능을 목적으로 고안된 것
            - compareTo()의 반환값은 int이지만 실제로 비교하는 두 객체가 같으면 0,
              비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야 함
            - 마찬가지로 compare()도 객체를 비교해서 음수, 0, 양수 중의 하나를 반환하도록 구현해야 함
            - Comparable을 구현한 클래스들이 기본적으로 오름차순으로 정렬되어 있지만,
              내림차순으로  정렬한다던가 아니면 다른 기준에 의해서 정렬되도록 하고 싶을 때
              Comparator를 구현해서 정렬 기준을 제공할 수 있음
            
                        * Comparable                 기본 정렬을 구현하는데 사용
                        * Comparator                 기본 정렬 기준 외의 다른 기준으로 정렬하고자 할 때 사용

------------------------------------------------------
package compare;
            
import java.util.Arrays;
import java.util.Comparator;

public class ComparatorEx {
            public static void main(String[] args) {
                        String[] strArr = {"cat", "Dog", "lion", "tiger"};
                        System.out.println("정렬 전 : " + Arrays.toString(strArr));
                        Arrays.sort(strArr);
                        System.out.println("기본정렬 후 : " + Arrays.toString(strArr));
                        Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
                        System.out.println("대소문자 구분하지 않은 정렬 후 : " + Arrays.toString(strArr));

                        Integer[] numArr = {2, 1, 7, 5, 8};
                        Arrays.sort(numArr);
                        System.out.println("numArr : " + Arrays.toString(numArr));

                        // 역순정렬
                        numArr = new Integer[] {2, 1, 7, 5, 8};
                        Arrays.sort(numArr, new Descending());
                        System.out.println("numArr : " + Arrays.toString(numArr));
            }
}

// 역순정렬 클래스 구현 deep 하게 하고 싶으면 더 해볼 것
class Descending implements Comparator{
            @Override
            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;
                        }
                        return -1;
            }
}

=====================================================================

3. HashSet
            - HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set 인터페이스의 특징대로
              HashSet은 중복된 요소를 저장하지 않음
            - HashSet에 새로운 요소를 추가할 때는 add()나 addAll()를 사용하는데,
              만일 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면
              이 메소드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알림
            - 이러한 HashSet의 특징을 이용하면, 컬렉션 내의 중복 요소들을 쉽게 제거할 수 있음

-------------------------------------------------------
package hashSet;

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

public class HashSetEx01 {
            public static void main(String[] args) {
                        Object[] objArr = {"1", 1, "2", "2", "3", "3", "4", "4", "4"};

                        Set set = new HashSet();

                        for(int i = 0; i < objArr.length; i++) {
                                    System.out.println(set.add(objArr[i]));
                        }
                        System.out.println("set : " + set);
            }
}
------------------------
package hashSet;

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

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

                        set.add("abc");
                        set.add("abc");
                        System.out.println("set : " + set);

                        Person p1 = new Person(1111, "David");
                        Person p2 = new Person(1111, "David");
                        System.out.println(p1.equals(p2));
                        System.out.println("p1.hashCode : " + p1.hashCode());
                        System.out.println("p2.hashCode : " + p2.hashCode());
                        set.add(p1);
                        set.add(p2);
                        System.out.println("set : " + set);
            }
}

class Person{
            int id;
            String name;

            public Person(int id, String name) {
                        this.id = id;
                        this.name = name;
            }

            @Override
            public String toString() {
                        return id + " : " + name;
            }

            @Override
            public boolean equals(Object obj) {
                        if(obj instanceof Person) {
                                    Person tmp = (Person)obj;
                                    return this.id == tmp.id && this.name.equals(tmp.name);
                        }
                        return false;
            }

            @Override
            public int hashCode() {
                        return (id + name).hashCode();
            }
}
-----------------------------------------
package hashSet;

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

public class HashSetEx03 {
            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);

                        // iterator()
                        Iterator it = setB.iterator();

                        // 교집합구하기
                        while(it.hasNext()) {
                                    Object tmp = it.next();
                                    if(setA.contains(tmp)) {
                                                setKyo.add(tmp);
                                    }
                        }
                        System.out.println("setKyo : " + setKyo);

                        // A 차집합
                        // setCha = setA;
                        it = setA.iterator();
                        while(it.hasNext()) {
                                    Object tmp = it.next();
                                    if(!setB.contains(tmp)) {
                                                setCha.add(tmp);
                                    }
                        }
                        System.out.println("setCha : " + setCha);

                        // 합집합
                        // setHab = setA;
                        it = setA.iterator();
                        while(it.hasNext()) {
                                    setHab.add(it.next());
                        }
                        it = setB.iterator();
                        while(it.hasNext()) {
                                    setHab.add(it.next());
                        }
                        System.out.println("setHab : " + setHab);

            }
}

====================================================================== 
4. HashMap
            - HashMap은 Map을 구현했으므로, 키(key)와 값(value)을 묶어서 하나의 데이터(entry)로
              저장한다는 특징을 가짐
            - HashMap은 키(key)와 값(value)를 Object 타입으로 저장(무엇이든 다 저장)
            - 즉, (Object, Object)형식으로 저장하기 때문에 어떠한 객체도 저장할 수 있지만
              주로 key값은 String대문자 또는 소문자로 통일해서 사용

                        * 키(key)            컬렉션 내의 키(key)중에서 유일해야 함
                        * 값(value)          키(key)와 달리 데이터의 중복을 허용

            - 키(key)는 저장된 값(value)을 찾는데 사용되는 것이기 때문에 컬렉션 내에서 유일해야 함
            - 즉, HashMap에 저장된 데이터를 하나의 키(key)로 검색했을 때 결과가 단 하나여야 함을 뜻함
            - 만일 하나의 키에 대해 여러 검색결과 값을 얻는다면 원하는 값이 어던 것인지 알 수 없기 때문

-----------------------------------------------------------

package hashMap;

import java.util.HashMap;
import java.util.Scanner;

public class HashMapEx01 {
            public static void main(String[] args) {
                        HashMap map = new HashMap();
                        map.put("myId", "1234");
                        map.put("asdf", "1111");
                        map.put("asdf", "1234");
                        // put(Object key, Object value) : map에 key, value entry를 추가
                        System.out.println("map : " + map);

                        Scanner s = new Scanner(System.in);
                        while(true) {
                                    System.out.println("id와 패스워드를 입력해주세요.");
                                    System.out.print("id > ");
                                    String id = s.nextLine().trim();      // trim() : 좌우 공백 제거

                                    System.out.print("password > ");
                                    String password = s.nextLine().trim();
                                    System.out.println();

                                    if(!map.containsKey(id)) { // 입력한 id가 map의 key 중 일치하는 값이 없다면
                                                System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
                                                continue;
                                    } else {
                                                if(!map.get(id).equals(password)) { 
                                                            // 입력한 id값에 대한 비밀번호가 일치하지 않는다면
                                                            // get(Object key) : key에 상응하는 value값을 반환한다.
                                                            System.out.println("비밀번호가 일치하지 않습니다.");
                                                } else {
                                                            System.out.println("id와 비밀번호가 일치합니다.");
                                                            break;
                                                }
                                    }
                        }
            }
}
----------------------------------------------

package hashMap;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class HashMapEx02 {
            public static void main(String[] args) {
                        HashMap map = new HashMap();
                        map.put("김자바", 90);
                        map.put("김자바", 100);
                        map.put("이자바", 100);
                        map.put("강자바", 80);
                        map.put("박자바", 90);

                        System.out.println("map : " + map);

                        // 1. key값을 Set(list는 중복이 안되기 때문에 set이 어울림)으로 변경
                        Set set = map.keySet();
                        System.out.println("참가자명단 : " + set);

                        // 2. value값을 Collection으로 변경
                        Collection value = map.values();
                        System.out.println("점수 목록 : " + value);

                        int total = 0;
                        double avg = 0.0;

                        Iterator it = value.iterator();

                        while(it.hasNext()) {
                                    total += (int)it.next();
                                    // int i = (Integer)it.next();
                                    // total += i;
                        }
                        System.out.println("총점 : " + total);
                        avg = (double)total / map.size();
                        // avg = (double)total/ value.size();
                        System.out.println("평균 : " + avg);

                        // Collections 클래스는 컬렉션을 다루기 위해 유용한 메소드들이 모여있다.
                        System.out.println("최대점수 : " + Collections.max(value));
                        System.out.println("최소점수 : " + Collections.min(value));
            }
}

'Java2(주말)' 카테고리의 다른 글

Java2 day15  (0) 2022.05.28
Java2 day14  (0) 2022.05.22
Java2 day12  (0) 2022.05.15
Java2 day11 보충  (0) 2022.05.15
Java2 day11  (0) 2022.05.14