2023-12-20 (10일차) - HashMap

민짱·2024년 1월 7일
post-thumbnail

📅2023. 12. 20 10일차


🎨 Java

trim()이란?

  • 문자열을 입력받거나 문자열을 합칠경우 가끔 쓸데없는 공백이 따라 들어오곤 한다. 그럴 때 유용하게 사용되는 Trim함수이다.
String str = " 문자열에 공백이 있습니다. ";		
System.out.println(str);

str = str.trim();
System.out.println(str);
  • 그냥 문자열.trim()이라고만 써주시면 됩니다. 그럼 알아서 왼쪽에 있는 공백, 오른쪽에 있는 공백을 다 제거해준다. 하지만 가운데 있는 공백은 제거해주지는 않습니다. 가운데 있는 공백은 replace함수를 써서 제거해야한다.

HashMap이란?

  • HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션이다.
  • Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있다. Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조이다.
  • 여기서 키와 값은 모두 객체이다. 값은 중복 저장될 수 있지만 키는 중복 저장될 수 없다.
  • 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대치된다.
  • HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.
  • 위 그림과 같이 HashMap은 내부에 '키'와 '값'을 저장하는 자료 구조를 가지고 있다. HashMap은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 들어 있는 위치 또한 관계가 없다.

HashMap 선언

HashMap<String,String> map1 = new HashMap<String,String>();//HashMap생성
HashMap<String,String> map2 = new HashMap<>();//new에서 타입 파라미터 생략가능
HashMap<String,String> map3 = new HashMap<>(map1);//map1의 모든 값을 가진 HashMap생성
HashMap<String,String> map4 = new HashMap<>(10);//초기 용량(capacity)지정
HashMap<String,String> map5 = new HashMap<>(10, 0.7f);//초기 capacity,load factor지정
HashMap<String,String> map6 = new HashMap<String,String>(){{//초기값 지정
    put("a","b");
}};

HashMap을 생성하려면 키 타입과 값 타입을 파라미터로 주고 기본생성자를 호출하면 된다. HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데 List처럼 저장공간을 한 칸씩 늘리지 않고 약 두배로 늘린다. 여기서 과부하가 많이 발생한다. 그렇기에 초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해주는 것이 좋다.

HashMap 값 추가

HashMap<Integer,String> map = new HashMap<>();//new에서 타입 파라미터 생략가능
map.put(1,"사과"); //값 추가
map.put(2,"바나나");
map.put(3,"포도");

HashMap에 값을 추가하려면 put(key,value) 메소드를 사용하면 된다. 선언 시 HashMap에 설정해준 타입과 같은 타입의 Key와 Value값을 넣어야 하며 만약 입력되는 키 값이 HashMap 내부에 존재한다면 기존의 값은 새로 입력되는 값으로 대치된다.

HashMap 값 삭제

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
map.remove(1); //key값 1 제거
map.clear(); //모든 값 제거

HashMap에 값을 제거하려면 remove(key) 메소드를 사용하면 된다. 오직 키값으로만 Map의 요소를 삭제할 수 있다. 모든 값을 제거하려면 clear() 메소드를 사용하면 된다.

HashMap 값 출력

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
System.out.println(map); //전체 출력 : {1=사과, 2=바나나, 3=포도}
System.out.println(map.get(1));//key값 1의 value얻기 : 사과
		
//entrySet() 활용
for (Entry<Integer, String> entry : map.entrySet()) {
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" + entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

//KeySet() 활용
for(Integer i : map.keySet()){ //저장된 key값 확인
    System.out.println("[Key]:" + i + " [Value]:" + map.get(i));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap을 출력하는 방법에는 다양한 방법이 있다. 그냥 print하게 되면 {}로 묶어 Map의 전체 key값, value가 출력된다. 특정 key값의 value를 가져오고싶다면 get(key)를 사용하면 되고 전체를 출력하려면 entrySet()이나 keySet()메소드를 활용하여 Map의 객체를 반환받은 후 출력하면 된다.

entrySet()은 key와 value 모두가 필요할 경우 사용하며 keySet()은 key 값만 필요할 경우 사용하는데 key값만 받아서 get(key)를 활용하여 value도 출력할 수도 있기에 어떤 메소드를 선택하든지 간에 큰 상관이 없어 대부분 코드가 간단한 keySet을 활용하는데 key값을 이용해서 value를 찾는 과정에서 시간이 많이 소모되므로 많은 양의 데이터를 가져와야 한다면 entrySet()이 좋다.(약 20%~200% 성능 저하가 있음)

###Iterator 사용

HashMap<Integer,String> map = new HashMap<Integer,String>(){{//초기값 지정
    put(1,"사과");
    put(2,"바나나");
    put(3,"포도");
}};
		
//entrySet().iterator()
Iterator<Entry<Integer, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Map.Entry<Integer, String> entry = entries.next();
    System.out.println("[Key]:" + entry.getKey() + " [Value]:" +  entry.getValue());
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도
		
//keySet().iterator()
Iterator<Integer> keys = map.keySet().iterator();
while(keys.hasNext()){
    int key = keys.next();
    System.out.println("[Key]:" + key + " [Value]:" +  map.get(key));
}
//[Key]:1 [Value]:사과
//[Key]:2 [Value]:바나나
//[Key]:3 [Value]:포도

HashMap의 전체출력 시 반복문을 사용하지 않고 Iterator를 사용해도 된다. iterator로 Map안의 전체 요소를 출력하는 방법은 위와 같다.

자바 배열, ArrayList, HashMap 비교정리

종류 배열 ArrayList HashMap
생성방법 int[] arr = new int[10]; List<Integer> list = new ArrayList<>(); Map<String, Integer> map = new HashMap<>();
유연성 데이터를 10개 넣을 수 있음, 늘리는 것 불가능 신경안써도 됨(알아서 늘어남) 신경안써도 됨(알아서 늘어남)
데이터 넣을 때 arr[0] = 1; list.add(1); map.put("영수나이", 1);
데이터 수정할 때 arr[0] = 2; list.set(0, 2); map.put("영수나이", 2);
데이터 가져올 때 int data = arr[0]; int data = list.get(0); int data = map.get("영수나이");
데이터 지울 때 불가능 list.remove(0); map.remove("영수나이");
데이터 순회 for ( int i = 0; i < arr.length; i++ ) {
  System.out.println(arr[i]);
}
for ( int i = 0; i < list.size(); i++ ) {
  System.out.println(arr.get(i));
}
for ( String key : map.keySet() ) {
  System.out.println(key + " : " + arr.get(key));
}

🎃github

오탈자 주의
인증 -> 하루에 한 번만(학원), 한 번만(집)
git config user.name -> 확인용
git config user.email
git config --global user.name "userName" -> 덮어쓰기
git config --global user.email "userEmail"

연동 -> 폴더에 최초 한 번만
git init
git remote add origin 원격 리포지터리 주소
vim .gitignore
i 입력 ->
.classpath
.project
.settings
bin
build  -> esc -> :wq! enter

업로드 -> 매 업로드시 반복
git add .
git status
git commit -m "commit msg"
git push origin master

🔔 TODO

  • 명언 앱 처음부터 끝까지 반복 학습
  • HashMap 복습

💡 느낀점

  • 오늘 처음 github에 명언 앱 만들기를 연동해 보았다. github을 최대한 이용해서 써먹어야겠다.
  • 강사님께서 평균적인 순공 시간을 늘려야된다고 하셨다. 백퍼 공감한다. 최고를 위해 최선을 다하자!

0개의 댓글