Java

자바 Map 인터페이스

code2772 2022. 10. 6. 23:38
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