- Set 인터페이스 종류

HashSet, TreeSet

 

 

- HashSet

데이터를 중복해서 저장할 수 없다. (중복은 자동으로 제거된다.)

저장 순서가 유지되지 않는다.

정렬을 하지 않는다.

하나의 null 값을 저장할 수 있다.

 


HashSet 사용해보기!

package day08;

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

public class HashSet1 {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<>();
        
        hashSet.add("김사과");
        hashSet.add("오렌지");
        hashSet.add("반하나");
        hashSet.add("배애리");
        hashSet.add("채애리");
        System.out.println("FIRST HashSet : " + hashSet);
        hashSet.add("이메론");
        hashSet.add("채애리");
        hashSet.add("반하나");
        System.out.println("SECOND HashSet : "  + hashSet);

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

        Iterator<String> iterator = hashSet.iterator();
        while(iterator.hasNext()){
            System.out.print(iterator.next() + " ");
        }

    }
}

위 코드의 결과

중복을 허용하지 않기 때문에, First와 Second 사이에 같은 값을 넣어도 추가되지 않는다.

HashSet의 경우 정렬을 하지 않기 때문에 특정 순서에 맞춰 출력되지 않는다. 따라서 iterator을 사용해서 정렬해주고 하나씩 출력해준다.

 


 

- TreeSet 클래스

데이터를 중복해서 저장할 수 없다. (중복은 자동으로 제거된다.)

저장 순서가 유지되지 않는다.

오름차순으로 정렬된다.

하나의 null 값을 저장할 수 있다.

이진 탐색 트리 구조로 이루어져 있다.

 

 

✔️ 이진 탐색 트리

추가, 삭제에는 시간이 걸리지만 정렬, 검색에 높은 성능을 자랑하는 자료구조이다.

 

 


TreeSet 사용해보기!

package day08;

import java.util.TreeSet;

public class TreeSet1 {
    public static void main(String[] args) {
        TreeSet<Integer> treeSet = new TreeSet<>();
        treeSet.add(10);
        treeSet.add(8);
        treeSet.add(34);
        treeSet.add(23);
        treeSet.add(90);
        treeSet.add(100);
        treeSet.add(34);

        System.out.println("FIRST : " + treeSet);
        treeSet.remove(23);
        System.out.println("SECOND : " + treeSet);

        System.out.println(treeSet.size());
        System.out.println(treeSet.first());
        System.out.println(treeSet.last());
        System.out.println(treeSet.higher(10));
        System.out.println(treeSet.lower(10));

        System.out.println();

        for(int i : treeSet) {
            System.out.print(i + " " );
        }


    }
}

위 코드의 결과

TreeSet의 경우 오름차순으로 정렬되기 때문에 데이터들이 오름차순으로 정렬되어있는 것을 확인할 수 있다. 또한 TreeSet도 중복을 허용하지 않는다.


 

- Map 인터페이스 종류

HashMap, TreeMap, HashTable

 

 

 

- HashMap 클래스

Map 인터페이스를 구현한 대표적인 클래스이다.

키와 값으로 구성된 요소 객체를 저장하는 구조를 가지고 있는 자료구조이다.

키는 중복될 수 없고, 값은 중복될 수 있다.

기존의 저장된 키와 동일한 키로 값을 저장하면 기존의 키의 값이 없어지고, 새로운 값으로 대체된다.

해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 뛰어난 성능을 가지고 있다.

특정한 값을 가지고, 그 값을 검색하기 때문에 성능이 좋은 편이다.

비동기식이다.

 


HashMap 사용해보기!

package day08;

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("melon","이메론");
        hashMap.put("cherry","채애리");
        hashMap.put("berry","배애리");
        hashMap.put("orange","오렌지");

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

        
        System.out.println("hashMap.get() : "+hashMap.get("melon"));       
        System.out.println("-----------------------------------------------");

        System.out.println("hashMap 키 값 나열 : " + hashMap.keySet());           
        System.out.println("반복문");
        for(String k : hashMap.keySet()) {
            System.out.println("key : " + k + ", value : " + hashMap.get(k));
        }
        System.out.println("-----------------------------------------------");

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

        Iterator<String> keys = hashMap.keySet().iterator();
        while(keys.hasNext()) {
            String key = keys.next();
            System.out.println("key : " +key +  ", value : " +hashMap.get(key));
        }

    }
}

 

위 코드의 결과

 


- HashMap 메소드

put(key, value)  :  HashMap에 key와 value 삽입

get(Object key) :  특정 key의 값을 가지고 온다.

keySet() : HashMap에 저장된 key값을 Set에 저장하여 반환한다.

entrySet() : HashMap에 저장된 key, value값을 엔트리(키와 값을 결합) 형태로 Set에 저장하여 반환한다.

 


 

-TreeMap 클래스

이진트리를 기반으로 한 Map 컬렉션이다.

TreeSet과의 차이점은 TreeSet은 값만 저장하는 구조라면, TreeMap은 키와 값이 저장된 key, value를 저장한다.

Key는 오름차순으로 정렬한다.( 숫자는 값으로, 문자열은 유니코드로)

HashMap보다 성능이 떨어진다. (데이터를 저장할 때, 삭제할 때)

검색이 필요한 경우, 효율성면이 좋다,

 

 

 

-HashTable 클래스

키와 값을 1:1 형태로 저장하는 구조이다.

키는 값을 식별하기 위한 고유한 키, 값은 키가 가진 값이다.

동기화가 되어있다.

HashMap에서는 값을 null로 입력이 가능하지만, HashTable에서는 null값을 입력할 수 없다.

 

 


과제👀
    학생 관리 프로그램을 만들어보자

    메뉴
    1. 학생입력         (학번, 이름, 나이, 연락처)
    2. 학생 리스트  --> 학번으로 오름차순
    3. 학생 검색
    4. 학생 삭제
    5. 종료

 

Student 클래스

package Assignment;

public class Student {
    private int no;
    private String name;
    private int age;
    private String hp;

    Student(){};
    public Student(int no, String name, int age, String hp) {
        this.no = no;
        this.name = name;
        this.age = age;
        this.hp = hp;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getHp() {
        return hp;
    }

    public void setHp(String hp) {
        this.hp = hp;
    }

    @Override
    public String toString() {
        return "[학번 : " + no + ", 이름 : " + name + ", 나이 : " + age + ", 전화번호 : " + hp+ "]";
    }
}

 

 

메인 메소드

package Assignment;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;

public class StudentList {
    public static void main(String[] args) {
        /*학생 관리 프로그램을 만들어보자

        메뉴
        1. 학생입력         (학번, 이름, 나이, 연락처)
        2. 학생 리스트  --> 학번으로 오름차순
        3. 학생 검색
        4. 학생 삭제
        5. 종료*/

        Scanner sc= new Scanner(System.in);
        ArrayList<Student> students = new ArrayList<>();
        Student temp = new Student();

        System.out.println(" 👨‍🎓 학생 관리 프로그램 👩‍🎓");

        while(true) {
            System.out.println("메뉴를 선택하세요.");
            System.out.println("1. 학생 입력, 2. 학생 리스트 보기 3. 학생 검색 4. 학생 삭제 5. 종료");
            int menu = sc.nextInt();
                if(menu == 5) break;

            switch(menu) {
                case 1:
                    System.out.println("학생 학번을 입력하세요.");
                    int no = sc.nextInt();
                    System.out.println("학생 이름을 입력하세요.");
                    String name = sc.next();
                    System.out.println("학생 나이를 입력하세요.");
                    int age = sc.nextInt();
                    System.out.println("전화 번호를 입력하세요.");
                    String hp = sc.next();

                    Student newSt = new Student(no,name,age,hp);
                    students.add(newSt);
                    for(int i = 0;  i < students.size()-1; i++) {
                        for(int j = i+1; j < students.size(); j++) {
                            if(students.get(i).getNo() > students.get(j).getNo()) {
                                temp = students.get(i);
                                students.set(i, students.get(j));
                                students.set(j, temp);
                            }
                        }
                    }
                    System.out.println("학생 입력이 완료되었습니다. ");
                    break;

                case 2:
                    for(int i = 0; i < students.size(); i++) {
                        System.out.println(students.get(i));
                    }
                    break;
                case 3:
                    System.out.println("검색할 학생의 이름을 적어주세요.");
                    String findStu = sc.next();

                    boolean isFind = false;
                    for(int i = 0; i < students.size(); i++) {
                        if(findStu.equals(students.get(i).getName())){
                            System.out.println("⭕ 학생 검색이 완료되었습니다.⭕");
                            System.out.println(students.get(i));
                            isFind = true;
                        }
                    }
                    if(!isFind) System.out.println("❌검색한 학생이 존재하지 않습니다.❌");
                    break;
                default:
                    System.out.println("삭제할 학생의 이름을 적어 주세요.");
                    String delName = sc.next();

                    boolean isDel = false;
                    for(int i = 0; i < students.size(); i++) {
                        if(delName.equals(students.get(i).getName())){
                            students.remove(i);
                            isDel = true;
                            System.out.println("학생 정보가 삭제되었습니다.");
                        }
                        System.out.println(students.get(i));
                    }
                    if(!isDel) System.out.println("학생 ");
                    break;

            }
        }
    }
}

 

 

복사했습니다!