나다.
이 글이 뭐하는 글이냐면
우리는 자료구조를 사용하며 많은 난관을 해결한다.
그 중 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(); 메소드를 호출해 사용할 수 있다.
두개의 차이는 하나만 지우냐 전부 다 지우냐의 차이인데
우리는 아까 경영이의 정보를 출석부에 저장했다.
그런데 경영이가 학교를 자퇴한다면 우리는 경영이의 정보를 출석부에서 지워야한다.
그런 경우 .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 |