Java 10일차

소윤정·2021년 6월 7일
0

JAVA

목록 보기
9/15

9일차, 10일차에 배우너 컬렉션 프레임워크는 자주 사용되는 클래스이므로 기억해두면 좋을 것같다.

Set 인터페이스(⭐️⭐️⭐️⭐️⭐️)

  • 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iterator)를 제공.
  • 반복자는 Iterator 인터페이를 구현한 객체를 말하는데, iterator() 메소드를 호출하면 얻을 수 있다.
  • List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.
  • 객체를 중복해서 저장할 수 없고, 하나의 Null만 저장할 수 있다.(집합은 순서와 상관없고 중복이 허용되지 않기 때문)

1. HashSet 클래스

  • 정렬을 하지 않는다.

중복을 걸러내는 과정

  1. hashCode()를 이용하여 저장되어 있는 객체들의 해시 코드 값을 비교
  2. equals()로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단

사용방법

HashSet<타입> 참조변수 = new HashSet();

  • add() : 요소 추가
  • size() : 요소의 개수 반환
  • remove() : 객체 삭제
import java.util.HashSet;
import java.util.Iterator;

public class HashSet1 {
    public static void main(String[] args) {
        HashSet<String> hashSet1 = new HashSet<>();
        HashSet<String> hashSet2 = new HashSet<>();

        hashSet1.add("김사과");
        hashSet1.add("반하나");
        hashSet1.add("오렌지"); // 데이터의 순서를 정해주지 않는다.
        System.out.println(hashSet1);
        hashSet1.add("김사과"); // 같은 데이터가 못들어간다.
        System.out.println(hashSet1);

        for(String s : hashSet1){
            System.out.print(s + " ");
        }

        System.out.println("요소의 개수 : " + hashSet1.size());

        hashSet2.add("김사과");
        hashSet2.add("반하나");
        hashSet2.add("배애리");
        System.out.println(hashSet2);

        Iterator<String> iterator = hashSet2.iterator();
        while(iterator.hasNext()){ // hasNext() 메소드는 가져올 객체가 있으면 true를 리턴하고 더 이상 가져올 객체가 없으면 false를 리턴
            System.out.print(iterator.next() + " ");
        }
    }
}
반복자
  • Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없기때문에 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자(Iteraotr)를 제공한다.
  • Iterator에서 하나의 객체를 가져올때는 next() 메소드를 사용한다. next() 메소드를 사용하기 전에 먼저 가져올 객체가 잇는지 확인하는 것이좋다. hasNext() 메소드는 가져올 객체가 있으면 true를 리턴하고 더 이상 가져올 객체가 없으면 false를 리턴한다.

2. TreeSet 클래스

  • 오름차순으로 정렬
  • 이진 탐색 트리 구조로 이루어져 있음
이진 탐색 트리
  • 추가와 삭제에는 시간이 걸리지만 정렬, 검색에 높은 성능을 자랑하는 자료구조

사용방법

TreeSet treeSet = new TreeSet();

  • first() : 최소값을 반환
  • last() : 최대값을 반환
  • add() : 요소 추가
  • remove() : 매개 변수로 전달된 값을 삭제
  • size() : 요소의 개수를 반환
  • pollFirst() : 제일 낮은 객체를 꺼내오고 컬렉션에서 제거
  • pollLast() : 제일 높은 객체를 꺼내오고 컬렉션에서 제거
  • lower() : 매개변수로 전달된 값보다 작은 데이터 중 최대값을 반환
  • higher() : 매개변수로 전달된 값보다 큰 데이터 중 최소값을 반환

Map 인터페이스

1. HashMap 클래스

Map<key, value> map = new HashMap<key, value>;

  • Map 인터페이스를 구현한 대표적인 클래스
  • 키와 값으로 구성된 요소객체를 저장하는 구조를 가지고 있는 자료구조
  • 키는 중복 저장될 수 없고, 값은 중복 될 수 있음
  • 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체
  • 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 뛰어난 성능을 가진다.
기본적인 예제
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class HashMap1 {
    public static void main(String[] args) {
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("apple", "김사과");
        hashMap.put("banana", "반하나");
        hashMap.put("orange", "오렌지");
        hashMap.put("melon", "이메론");
        hashMap.put("berry", "배애리");
        System.out.println(hashMap); // {banana=반하나, orange=오렌지, apple=김사과, berry=배애리, melon=이메론}

        System.out.println(hashMap.get("orange"));

        System.out.println(hashMap.keySet()); // 키 값만 출력
        System.out.println(hashMap.entrySet()); // 모든 데이터 출력

        for(String k : hashMap.keySet()){
            System.out.println("[key] : " + k + ", [value] : " + hashMap.get(k));
        }
        System.out.println();

        for(Map.Entry<String, String> entry : hashMap.entrySet()){
            System.out.println("[key] : " + entry.getKey() + ", [value] : " + entry.getValue());
        }

        hashMap.remove("melon"); // 제거
        System.out.println(hashMap);

        hashMap.replace("berry", "배리"); // 변경

        Iterator<String> keys = hashMap.keySet().iterator();
        while(keys.hasNext()){
            String key = keys.next();
            System.out.println("[key] : " + key + ", [value] : " + hashMap.get(key));
        }
    }
}
  • put() : 요소 저장(키, 값)
  • get() : 키를 통해 값 반환
  • keySet() : 키의 모든 집합을 반환
  • entrySet() : 키와 값의 모든 집합을 반환
  • replace() : 대체

TreeMap 클래스

TreeMap<key, value> treeMap = new TreeMap<key, value>();

  • 이진 트리를 기반으로 한 Map 클래스
  • 키와 값이 저장된 Map, Entry를 저장함
  • 키를 기준으로 오름차순 정렬
  • HashMap보다 성능이 떨어짐

HashTable 클래스

Map<key, value> map = new Hashtable<key, value>;

  • 자바는 HashMap을 지원하기 때문에 HashTable을 구현하거나 사용하는 경우가 많이 없다.

  • 키와 값의 데이터를 테이블에 저장

    HashMap과 HashTable 차이점?
    동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다.

Properties 클래스

  • HashTable을 상속받아 구현
  • HashTable은 키와 값을 (Object, Object)의 형태로 저장, Properties는 (String, String)의 형태로 저장
  • 애플리케이션 환경설정과 관련된 속성을 저장하는데 사용


연습문제

/*
    백준 2920번 음계
 */

import java.util.Scanner;
public class Sort {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] data = new int[8];
        boolean ascending = true;
        boolean descending = true;

        for(int i = 0; i < data.length; i++){
            data[i] = sc.nextInt();
        }

        for(int i = 1; i< data.length; i++){
            if(data[i] > data[i-1]) descending = false;
            if(data[i] < data[i-1]) ascending = false;
        }
        if(ascending) System.out.println("ascending");
        else if(descending) System.out.println("descending");
        else System.out.println("mixed");

    }
}

연습문제2
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

/*
    백준 1874번 스택 수열
 */
public class Main3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Stack<Integer> s = new Stack();
        ArrayList<Character> result = new ArrayList<>();

        int num = sc.nextInt();
        int cnt = 1;
        for(int i=0; i < num; i++){
            int x = sc.nextInt();
            while(cnt <= x){
                s.push(cnt);
                cnt += 1;
                result.add('+');
            }
            if(s.peek() == x){
                s.pop();
                result.add('-');
            } else {
                System.out.println("NO");
                return;
            }
        }
        for(int i =0; i<result.size(); i++){
            System.out.println(result.get(i));
        }
    }
}

배운점

개념을 보며 이해할때는 이해가 갔다고 생각했는데 마지막에 있는 연습문제2개를 직접풀어보려 하니 막상 못풀었다,, 이렇게 코드를 볼땐 생각보다 쉬운 코드인데 너무 어렵게 생각하려니까 안되는 것같았다ㅜ

0개의 댓글

관련 채용 정보