Java

[Java] HashMap이란 무엇인가.

Empty Brain 2023. 1. 1. 18:35

나다.

 

 

이 글이 뭐하는 글이냐면

우리는 자료구조를 사용하며 많은 난관을 해결한다.

그 중 HashMap을 굉장히 많이 사용하게 되는데

HashMap을 가장 쉽게 이해하는 방법은 꼬리표를 붙혀 물건을 넣어놓는 하나의 "금고"

로 생각하면 아주 쉽게 이해할 수 있다.

 

나와 같은 세대에 학교를 다녔거나 군 복무를 했다면

휴대폰 보관함에 대해 알고 있을 확률이 높다.

휴대폰 보관함에는 각자의 이름이나 출석번호 또는 군번 등이 적혀있고

휴대폰을 해당하는 칸에 보관하게 되어있다.

 

다음에 해당하는 구조가 딱 위의 비유와 적절하다 생각된다.

Map<출석번호, 기종> 휴대폰보관함 = new HashMap<>();

이번 글에서는 이 휴대폰 보관함이 어떻게 만들어지고 사용되는지 알아보자.

 


 

HashMap이란.

HashMap은 Java의 Map 인터페이스의 구현체 중 하나다.맞음. Class임.

 

HashMap은 Map 인터페이스를 상속받아 만들어진 클래스로 Map의 특성을 그대로 계승하고 있는데Map은 Key & Value 한 쌍으로 구성된 Entry 객체를 저장하는 자료구조의 하나다.

 

HashMap의 가장 중요한 특징 중 하나는 Key값의 중복이 불가능하다는 점인데예를 들어 출석번호가 1번인 이경영 학생이 휴대폰 보관함에 휴대폰을 보관했다고 가정하자.

기종 가로본능 = new 기종();
휴대폰보관함.put(1,가로본능);

 

그런데 경영이의 친구가 경영이에게 헛바람을 집어넣었다.

"경영아 스마트폰 써봤냐?ㅋㅋ 기능 뒤진다. 너도 사셈. ㅋㅋ"

 

친구의 권유로 스마트폰을 사게 된 경영이는 다음날 학교에서 가로본능이 아닌 스마트폰을

제출하게 된다.

기종 스마트폰 = new 기종();
휴대폰보관함.put(1,스마트폰);

이제 경영이에게는 가로본능이라는 기종은 존재하지 않는다.

그렇다는 것은 휴대폰보관함에도 이제 경영이의 칸에 가로본능은 존재하지 않는다는 뜻이다.

 

한 마디로 HashMap안에 존재하는 값은 (1, 가로본능), (1, 스마트폰) 두 개가 아닌

(1, 스마트폰) 하나로 남게 된다는 것이다.

 

다음이 의미하는 것은 Key값의 중복이 불가능하다는 것을 만족하며

또 다른 하나의 의미를 가지게 된다.

 

만약 기존에 Key값 1이 존재할 때 같은 key를 가진 다른 자료를 넣는다면

기존에 존재하던 key값 1과 Value는 사라지고 새로 입력된 Key & Value로 대체된다는

것이다.

(1, 스마트폰) 입력됨 ㅡ> (1, 가로본능) 없어짐 ㅡ> (1, 스마트폰) 없어진 가로본능 자리에 들어감.

위과 같이 이해한다면 편하게 이해할 수 있다.

 


HashMap의 사용법

 

HashMap 선언

그렇다면 HashMap이 뭔지 알아봤으니 다음으로 사용법을 알아볼 차례다.

 

우리의 옷에는 많은 주머니들이 있다.

통상 우리는 주머니들을 사용할 때 넣어놓는 물건을 구분하며 사용한다.

난 그렇게 씀. 토 달지 마셈.

맞다. 일단 하나에 다 구겨넣을 필요가 없다는 것을 의미한다.

그렇다면 주머니가 여러개 있듯 HashMap도 여러 개를 만들 수 있다는 뜻이 된다.

HashMap을 만드는 방법은

Map<Integer, String> map = new HashMap<>(); // 정수 Key 와 문자열 Value 의 조합
Map<Integer, Integer> map = new HashMap<>(); // 정수 Key 와 정수 Value 의 조합
Map<String, Integer> map = new HashMap<>(); // 문자열 Key 와 정수 Value 의 조합

// 기타 등등

다음과 같이 선언할 수 있다.

참고로 HashMap은 초기에 용량(자료 갯수의 총량)을 지정해줄 수 있는데 List는 양을 넘어서는 갯수의

자료가 들어오면 한 칸씩 저장공간을 늘려가지만 HashMap은 2배로 늘린다.

당연히 성능이 존X 구려질 수 밖에 없으니 정해진 총량에 대해 알고있다면 미리 초기 용량을 지정하도록 하자.

Map<Integer, String> map = new HashMap<>(100); // 이러면 한도 100칸으로 지정한거임.

 

제네릭을 배웠다면 알겠지만

저 꺾쇠표시 안에는 모든 타입이 들어가는 것이 가능하다.

예를 들어 경영이의 출석번호를 Key로 경영이의 정보를 모두 출석부에 저장하고싶다면

Map<Integer, StudentInfo> 출석부 = new HashMap<>();

StudentInfo 이경영 = new StudentInfo("이경영", "주소", "000-0000-0000");
출석부.put(1, 이경영);


@Setter
@AllArgsConstructor
static class StudentInfo{
    private String name;
    private String address;
    private String phoneNumber;
}

다음과 같이 사용할 수 있다는 뜻 이다.

 


HashMap에 값 넣기

HashMap에 값을 넣는 방법은 .put() 이라는 메소드 호출로 이뤄진다.

우리가 자바를 사용하며 객체를 만들때는 무조건 그 객체를 호명할 이름을 넣는다.

위의 예에서도 StudentInfo의 객체를 생성할 때 우리는 이 객체를 이경영이라 부를 것

미리 명시했다.

 

HashMap 또한 같다.

생성하며 부여된 이름과 함께 .put() 메소드를 호출해야한다.

Map<String, String> myMap = new HashMap<>(); // myMap을 생성
myMap.put("난", "존X 잘생김"); // put 메소드를 호출 후 값을 넣음.

그렇다면 이제부터 myMap 안에 Key값 "난" 에는 "존X 잘생김" 이라는 문자열이 저장되는 것이다.

이게 끝임.

 


HashMap 값 출력하기

값을 넣었으면 출력할 수 있어야 한다.

집어 넣기만 하고 뺄 수 없으면 그 금고가 무슨 의미가 있겠는가.

위의 금고 이미지를 보면 각 칸마다 어떤 번호들이 적혀있다.

우리도 HashMap에 값을 넣으며 저 번호를 이미 부여했다.

우리가 만든 HashMap의 상태는 지금 저 금고와 같은 상태라는 것을 의미한다.

 

그렇기 때문에 우리는 알고있는 Key값으로 HashMap에 저장되어있는 Value를

꺼내오는 것 또한 가능하다.

 

값을 꺼내오기 위해서는 .get(Key); 메소드를 호출하게 되는데 인자값으로 Key를 넘겨주면 된다.

String result = myMap.get("난");
System.out.println("result = " + result);

우리는 위에서 "난" 이라는 Key에 어떤 값을 이미 저장했다.

짜릿해.

잘 나온다.

가져오는건 이게 끝임.

 

참고로 맵 전체를 출력할 수 있다.

    public static void main(String[] args) {
        Map<String, String> myMap = new HashMap<>();
        myMap.put("요즘따라", "내꺼인듯");
        myMap.put("내꺼아닌", "내꺼같은");
        myMap.put("너어어어", "너어어어");

        System.out.println(myMap);
    }

위의 메소드를 실행했을때 다음과 같은 결과가 나온다.

HashMap 종특. 순서 보장 안함.


HashMap 값 삭제

마지막으로 삭제다.

 

삭제는 .remove(Key); 메소드를 호출하거나 .clear(); 메소드를 호출해 사용할 수 있다.

두개의 차이는 하나만 지우냐 전부 다 지우냐의 차이인데

우리는 아까 경영이의 정보를 출석부에 저장했다.

 

그런데 경영이가 학교를 자퇴한다면 우리는 경영이의 정보를 출석부에서 지워야한다.

졸X 학교가기 싫구만...

 

그런 경우 .remove() 메소드에 경영이의 출석번호만 넣어주면 된다.

출석부.remove(1);

이로써 경영이는 출석부에서 완전히 없어진 자퇴생이 되었다.

 

씨X.

경영이의 선동으로 모든 학생들이 자퇴해버렸다.

그렇다면 학생들이 없어졌으니 출석부 또한 비어있을 수 밖에 없다.

출석부.clear();

이런 경우 .clear() 메소드를 통해 출석부를 깨끗하게 밀어버릴 수 있다.

새 마음 새 출발의 느낌으로 다시 채워 넣을 수 있다는 뜻이다.

 

 

이제 HashMap이 무엇인지와 사용법에 대해 알아봤으니 잘 사용하시면 된다.

그럼 컴파일 오류 없는 개발하시길 :)

'Java' 카테고리의 다른 글

[Java] String이란 무엇인가.  (8) 2022.12.31
[Java] int와 Integer의 차이  (4) 2022.12.19
[Java] List<Integer> <-> int[] 변환  (4) 2022.12.18
[JAVA] 다이아몬드 연산자가 뭐임?  (1) 2022.12.17