본문 바로가기
Java

자바 Map 인터페이스

by code2772 2022. 10. 6.

[ 목차 ]

    728x90
    반응형
    ✔ Map 인터페이스 :
    - 키와 값을 한 쌍으로 이루어지는 데이터의 집합으로 순서가 없고, 키는 중복으로 허용하지 않지만 값운 중복으로 허용
    HashMap, TreeMap, HashTable
    
    HashMap 클래스
    - Map 인터페이스를 구현한 대표적인 클래스
    - 키와 값으로 구성된 요소객체를 저장하는 구조를 가지고 있는 자료구조
    - 키는 중복될 수 없고, 값은 중복될 수 있음
    - 기존의 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체(키 값은 중복X)
    - 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 뛰어난 성능
    - 비동기식(여러개의 프로그램을 동시에 처리, 시간이 오래걸리면 다음 문장으로 이동 후 동작하는 방식)
    
    
    TreeMap 클래스
    - 이진트리를 기반으로 한 Map 컬렉션
    - TreeSet과의 차이점은 TreeSet은 값만 저장하는 구조라면 TreeMap은 키와 값이 저장된 Key, value를 저장
    - 키는 오름차순으로 정렬됨(숫자 : 값, 문자열 : 유니코드)
    - HashMap보다 성능이 떨어짐(데잍터를 저장할 떄, 삭제할 때)
    - 검색이 필요한 경우 효율성이 좋음
    
    HashTable 클래스
    - 키와 값을 1:1형태로 저장
    - 키는 값을 식별하기 위한 고유한 키, 값은 키가 가진 값
    - 동기화
    - HashMap에서는 값을 null이 입력이 가능하지만 HashTable에서는 null입력이 불가능

     

    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("🤷‍♀️apple", "김오과");
            hashMap.put("😍apple", "김중과");
            hashMap.put("😁apple", "김장과");
            hashMap.put("🙌apple", "김종과");
            hashMap.put("🍊apple", "김진과");
    
            System.out.println(hashMap); // tostring , 눈으로 보기위해 그저 찍어본것
            //{😁apple=김장과, 😍apple=김중과, 🍊apple=김진과, ✔apple=김사과, 🙌apple=김종과, 🤷‍♀️apple=김오과}
    
            System.out.println(hashMap.get("✔apple"));// 키 값을 통해 내용을 찾아보자
            //김사과
    
            System.out.println(hashMap.keySet());// 키 값만 가저오기
            //[😁apple, 😍apple, 🍊apple, ✔apple, 🙌apple, 🤷‍♀️apple]
    
            for (String k : hashMap.keySet()) {
                System.out.println("key : " + k + ", value : " + hashMap.get(k));// 값을 받아와 출력
            }
    
            System.out.println(hashMap.entrySet()); // 값을 받아서 반환한것이며 사용간에 entrySet을 이용하자.
            //[😁apple=김장과, 😍apple=김중과, 🍊apple=김진과, ✔apple=김사과, 🙌apple=김종과, 🤷‍♀️apple=김오과]
    
            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();//키 값만 사용해서 keySet()
            while(keys.hasNext()){// next() : 현제값을 반환해주고  그 다음으로 키를 넘긴다.
                String key = keys.next();// 먼저 저장하고 유지하기 위해 사용 밑에서 key를 두번 사용하면 서로 다른 값에 저장된다.
                System.out.println("key : "+key+", value : "+ hashMap.get(key));
            }
    
        }

     

    1. 중첩 클래스
    - 내부 클래스(Inner Class)
        클래스 또는 메소드 안에 또 다른 클래스를 생성하는 것
        내부 클래스는 외부 클래스의 모든 멤버를 자신의 멤버처럼 사용
        static 내부 클래스를 제외한 내부 클래스는 항상 외부 클래스 객체를 통해서 생성

     

    class OuterClass{
        private int num1 = 10;
    
        public void method1(){
            System.out.println("num1:"+num1);
        }
        public void printInner(){//외부에서 객체를 생성해서 내부것으 사용할 수 있다.
        InnerClass innerClass = new InnerClass();
        innerClass.method2();
    //    innerClass.num2 = 10  // 외부 클래스에서 내부 클래스의 private 접근이 가능
        }
        public class InnerClass{// 내부에 있는 클래스로 클래스명 동일해도 상관없다.
            private int num2 =20;
    
            public void method2(){
                System.out.println("OuterClass.num1 : "+ num1);
                System.out.println("InnerClass.num1 : "+ num2);
            }
        }
    
    
    }
    
    public class InnerClass1 {
        public static void main(String[] args) {
            OuterClass outerClass = new OuterClass();
            outerClass.method1(); //num1:10
            outerClass.printInner(); //OuterClass.num1 : 10 InnerClass.num1 : 20
            System.out.println();
    
            OuterClass.InnerClass innerClass = outerClass.new InnerClass();
            // 외부클래스를 통해서 내부클래스로 들어가면 내부클래스도 객체를 생성해서 사용이 가능하다.
            innerClass.method2();//OuterClass.num1 : 10 InnerClass.num1 : 20
    
        }
    }
    

     

    - 로컬 클래스(Local Class)
        메소드 안에서 정의된 클래스(메소드 안에서만 사용할 수 있음)
        외부 클래스의 모든 멤버에 접근이 가능(pricate 멤버도 접근 가능)

     

    public class LocalClass {
        private int num1 = 10;
    
        public void method1() {
            int num2 = 20;
    
            class Local {
                private int num3 = 30;
                public final int num4 = 40;
    
                public void method2() {
                    System.out.println("num1 : " + num1);
                    System.out.println("num2 : " + num2);
                    System.out.println("num3 : " + num3);
                    System.out.println("num4 : " + num4);
                }
            }
            Local local = new Local();
            local.method2();
        }
    
        public static void main(String[] args) {
            LocalClass localClass = new LocalClass();
            // 전체 메소드를 실행하면 method1이 실행되고 이 후 method2를 사용하여 출력이 된다.
            localClass.method1();
    
    
        }
    }
    

     

    - 정적 중첩 클래스(Static Class)
        내부 클래스가 static으로 정의
        외부 클래스에 관계없이 객체를 생성할 수 있음

     

    public class StaticClass {
        public static void print(){
            System.out.println("Static 메소드!");
        }
        static class Static1{
            int num =0;
            public int add(){
                num++;
                return num;
            }
        }
    
        public static void main(String[] args) {
            print(); //Static 메소드! // static이 붙어있어 바로 사용 가능
            StaticClass.print(); //Static 메소드!
    
            StaticClass.Static1 static1 = new StaticClass.Static1();
            System.out.println(static1.add());// 1
    
        }
    }
    

     

    - 익명 클래스(Anonymous Class)
        클래스를 정의하지 않고 객체를 정의할 때 사용
        1회용 클래스이므로 재활용이 불가능
        * 클래스를 한번 사용하고 없어지면 좋을거 같은 객체를 만들때 사용하며 많이 사용된다.

     

    interface Inter1{ // 익명 클래스는 매우 중요하다.
        // 이벤트를 만드는 프로그램이나 한번 사용하고 다음부터 필요없는 기능을 구현하기에 도움이 된다.
        void method1();
    }
    
    class Class1 implements Inter1{
        @Override
        public void method1() { // 오버라이드를 해야 인터페이스 사용간 오류X
            System.out.println("Inter1을 구현한 클래스");
        }
    }
    
    interface  Inter2 {
        String method2();
    }
    
    class Class2 implements Inter2{// 클래스3에 메개변수 인터2가 있어 구현한 클래스2가 사용
        @Override
        public String method2() {
            return "Inter2를 구현한 클래스(실명 클래스)";
        }
    }
    
    class Class3 {
        public void method3(Inter2 inter2){ // 인터페이스를 구현한 인터2의 객체타입은 클래스2이다.
            System.out.println(inter2.method2());
        }
    }
    public class Anonymous {
        public static void main(String[] args) {
            Class2 class2 = new Class2();
            Class3 class3 = new Class3();
            class3.method3(class2);
    
            class3.method3(new Class2(){ // 참조변수 없이 인터페이스2구현
            // 참조변수가 없기 떄문에 한번 사용하고 사라진다. 힙에는 저장이 되지않고 널로 있다.
                @Override
                public String method2() {
                    return "익명 클래스";
                }
            });
        }
    }
    
    //Inter2를 구현한 클래스(실명 클래스)
    //익명 클래스
    반응형

    'Java' 카테고리의 다른 글

    Http Get 요청 - 인증된 사용자만 세션키 받아오기  (0) 2023.09.09