DAY22 Set, Map

NA YE SOM·2023년 7월 28일
0

ArrayList 공부 많이 해두기

-> 길이를 정하고 생성하는게 아님
-인터페이스 타입으로 선언
-생성시 arraylist로

add메소드 - 잘 기억해두기

get메소드 - 가져오기 : 인덱스 0123 값을 꺼낼 수 있음

size메소드 - 저장되어 있는 요소 몇개인지

refactoring

길이를 구하는 사이즈 메소드를 여러번 부르는 일이 생김(성능상 좋지 않음)

-> 한번만 hobbies.size 부르도록


-> 배열이 아니라 값을 일일히 넣어서 초기화 하는 방법도 가능함

Hashset : 인덱스가 없고 중복 저장 안됨

-> 용도 생각해서 사용하기가 어려움
-> Map 구조의 절반 구성 : hashset으로 되어있음

-> 인덱스가 없으니까 "향상 for문" 쓰기

Iterator : arraylist든 hashset 으로 어디서든 쓸 수 있음 (arraylist는 인덱스가 있으니까 거의 쓸 일이 없음)


-> 데이터 꺼낼 때 쓰는 팔(arm) 만듬
-> flower.iterator(flower hashset에 부착한 팔)
-> arm.hasNext : 잡히는 게 있으면 true(=저장된 데이터가 있음)
-> arm.next : 잡히는게 있으면 데이터 잡아서 꺼내는것


Map

-> 사용법이 다름


기능이 비슷하다(뿌리가 같아서)

-> ★ 웹 개발 시 많이 사용)

(ex) 주소를 입력 했을때 목록 보기 수행 , 추가를 수행 ..

주소에 따라서 무슨 일하겠다


url mapping : (어떤값) 주소에 따라서 무슨 일(어떤걸 사용) 하겠다라고 정해놓는것


어떤 key들어오면 어떤value를 내주겠다
-> 맵 구조 : key값과 value값 따라 자료를 구성하는것

☆hashmap을 많이 사용하는 이유 : 객체(object = instance(실제 기술적으로 메모리에 만들어진 객체)를 대신할 수 있는 자료구조

(ex) 배열 대신 arraylist쓰는 것처럼
객체 대용품 있음
-> 클래스를 안만들고도 '객체'를 전달할 수 있음

hashmap이 나오면 그 자리는 '객체'가 들어갈 수 있는 자리


-> 대부분의 정보를 List<'Map>쓰는 개발자도 있음

객체랑 인스턴스를 비교하면서 공부하는것이 좋음


-> 필드를 map에서는 "Key"라고 부름 , 필드에 저장된 값 "value"라고 부름



-> 대부분 Hashmap 사용할 때 key값으로 변수이름을 쓰고 value에 변수값을 넣는다

name은 홍길동이다 -> key : name, value : 홍길동


-> hashmap의 절반인 key는 hashset으로 되어있음

-> 3) key의 타입과 value의 타입을 따로따로 잡아야 한다.

ex01()

생성과정



-> key와 value모두 string 타입

put 메소드 : 저장 -> (나중에) 수정



-> 동일한 키는 두개 이상 들어갈 수 없다 ( 만약에 쓰게 되면 ) 기존의 데이터를 덮어써서 지워버림 )

데이터를 value임 -> 이 데이터를 꺼내기 위해서 key 필요함

get 메소드 : key를 전달(인덱스는 없음)


-> KEY 를 알아야 value도 꺼낼 수 있음

ex02()

Map에서는 value가 하나의 타입으로 주어저야 함
string하고 integer을 동시에 저장할 수 있는 타입 : object밖에 없음(object는 만능타입임)






-> person 객체 대신 이걸로 쓰면 똑같이 동작함(알아두기)



-> 기존 키를 사용하면 = 기존에 put(메소드)를 이용해서 수정할 수 있음

put -> "수정" 내포함

mapping의 종류 -> putmapping (수정하라는것)
deletemapping(삭제)
getmapping(조회)
...


ex03()_반복문으로 돌리기(for문, while문)


-> 흔히 사용하는 타입


-> key만 저장하는 구조 : hashset(키의 특징 : 중복 불가능)

-> arm
-> key를 전부 꺼내서 하나씩 꺼낼 수 있다

-> value는 꺼내지 말고 key만

key만 저장할꺼니까 -> key타입으로
-> string으로 되어있으니 당연히 string타입으로!

1.Key만 꺼내서 set에 저장한다.


-> 순서대로 유지되면서 꺼내지지 x

  1. 반복자 존재하면 해당 데이터 꺼내서 key로 만듦



3.get() 메소드에 key를 전달하면 value가 나온다 .


-> 값을 전달하는 목적 : 순서는 상관없음
API 들도 map을 이용하여 정보를 제공해주는 경우도 많고, 값을 전달할때도 map을 이용해서 전달하는 경우도 있음

★★ 만드는 과정 필요!

ex04_향상 FOR문


-> 인덱스가 없으니까 -향성 FOR문
-> 변수 : MAP
-> entry 단위로(key + value 같이 뺌)



entry를 빼더라도 set구조 -> 여기서 뺀게 entry임
entry가 모여있는 set이고 거기서 빼면 entry다

Entry 라는 타입 (인터페이스)가 있음

★ import 잘 확인!



-> entry가 저장된 set



-> Map에 있는 Entry라고 적기도 함(안해도 상관없음)


-> entry로부터 key를 뺴고 싶을때, entry로부터 value를 빼고 싶을때(getter처럼 되어있음)


-> 이 방식이 조금 더 쉬움(둘 중에 꼭 하나는 알고 있어야 함)

ex04_Student(연습문제)

생성자 쓰기





학번 : Integer , string 아무거나 해도 상관없음

class이름 쓸 수 x -> clazz


-> 두번째 파라미터는 exam인데, 객체니까 new을 이용해서 만들어야함 **

class가 있으면 class에 있는 객체가 모두 정상적으로 작동되는지 확인하기
-> 생성자만 이용해서 처리하는 것이 가능함

내용이 없는 student를 만들고 그 student에 내용을 채우는 setter을 통해서 내용을 채우고 가능

-> 두가지 생성법 확인
-> 첫번째것이 조금 더 쉬움


-> 학번 준비 = key값 준비

-> 학번

학번을 clazz.get메소드에 전달 -> 학번 전달하면 하면 -> 학생 객체가 나옴


-> clazz에 필요한 정보 모아서 -> 학번만 전달하면 됨

ex05_Board(게시판을 저장하는 ArrayList만들기)

★(실무)에서 많이 쓰임 ★ list안에 map을 가지고 있는 형태



-> board 객체 쓰지 말고 collection 만들기(map과 arrylist만 가지고)

제목 작성자 -> 문자 : 섞여있어서 -> Object


-> key는 그대로 바꾸지 않음

방금 만든 map을 arraylist에 저장할 것

*arraylist 에 저장하는 메소드 : add

★(실무)에서 많이 쓰임 ★ list안에 map을 가지고 있는 형태

나중에 요구사항이 생겨서 반환값을 바꿔야 할때) arraylist에 담아서 반환하는 경우

게시글 불러오기


-> 초기화 블록으로 잡아서 처리


-> 현재 타입이 Map임

게시글 목록을 보면서 게시글 하나를 꺼내는데 그게 map임

모든 map들의 key값을 바꾸면 안된다 !!


-> loop문으로 개선해보기(map에서 loop쓴다고 좋은건아님)

★loop 돌리는 방법(2가지 중 한가지는 연습 꼭 하기)

  1. key만 꺼내서 loop 돌리는 방법

2. entry 단위로 꺼내서 loop 돌리는 방법


get key가 set로 되어있어서 순서는 안맞음

import


-> 하나로 합칠 수 있음


-> 자바 유틸의 모든것들

★ (중요) 잘알아두고 쓰기! : Ctrl + Shift + o


import넣어주기도 하고 잘못들어간 import빼주기도 하는것

ex06_BinaryNumber(이진수)




-> List안에는 0,1만들어감 -> Integer

배열이면 길이를 정해야하는데 number에 따라서 길이가 계속 달라짐
arraylist가 되면 원하는 만큼 양껏 저장할 수 있음


-> 32 십진수만 전달 자동으로 이진수로 변화되서 저장



예전) 배열
10으로 정해져있어서 9번부터 거꾸로 채웠음
앞으로 순차적으로 채우고 뒤에서부터 읽어내는 방식 (읽기만 뒤에서!)

그냥 ctrl + space로 To_String 만들 수 있음

-> 차이는 본문이 없음


binary 아직 생성이 안되었으니 생성먼저


-> 연산 후에는 number가 %2로 계속 내려감


-> 한번 연산 끝나면 number가 반으로 줄어들게끔 함

-> 미리 가져가라고 return 만들어놓고

항상 마지막 요소 인덱스 : 길이보다 작음


->거꾸로 내려오는 for문

-> 마지막것 먼저


-> 노란색 경고 : 이 변수 왜 안쓰는가?

object타입으로 저장된 메소드를 casting해서 arraylist타입으로 캐스팅해서 살려야하는데

@SuppressWarnings

답이 맞더라도 경고 메시지가 뜰 수 가 있음?
의도치않게 경고메시지 나오는 경우 있음
경고는 잠재적으로 문제 있는거 아니니? 문제 아니다라고 답을 해줄수 있음

number안쓴거 알고 있으니까 다시는 띄우지 말라는 것 (unused)


-> 0주면 아무것도 안나옴

0나오게 했으면? 생성자쪽에서 0을 줬을때 아무것도 안나오게 되어있음

-> while문이 0보다커야 동작하게 되어있음


ex06_

컬렉션 프레임워크 사용해서 구하기!


-> 하나로 모을수가 없어서 이름 따로 점수 따로 함


-> map이 5개 (map 1개가 name, 점수)

5개이상 나온다고 치면) 필요한 구조는 arraylist임
-> 그 안에는 map이 들어있음



-> handelr와 student는 map으로 구서 ㅇ


-> arraylist가 만들어지는 타이밍은 scorehandler가 만들어지는 타이밍임
-> arraylist에 추가해서 전달하는 메소드 : add


-> 반환타입 : int


-> 첫번째 사람의 점수 : 최댓값 가짐


여기까지 map

map에있는 점수 꺼낼때 또 get

-> 사실은 , (int) obejct 캐스팅해도 사용가능
-> 안전하게 코드를 만들기 위해서, 뒤에 메소드가 2개 이상 호출시)

-> 가로로 묶어서 첫번째 학생의 점수를 묶어서 최댓값 가져온다


-> int로 캐스팅해주기


-> 동일한게 2개가 들어갔으니 -> refactoring!


-> 반복코드 많이 나옴 (나중에 합칠예정)

반환할값 (최대최소합계평균 -> 4개) 무엇을 반환할 것인가?
하나만 반환할 수 있게 되어있음
-> 여러개의 값을 하나로 묶어서 반환하기!
-> 객체로 묶어서 반환하는 연습했음


-> 객체는map으로 반환할 수 있음
-> 반환타입 map

*평균값 : integer, double 섞여있는 형태


-> integer 는 number라는 클래스의 자식임

-> doulbe은 number라는 클래스의 자식임
-> interger, double 모두 number의 자식이니 number로 해도 괜찮음


★★★여러개의 값을 화면으로 넘길 때 : Map을 만들어서 넘긴다


-> 결과 받아오는애



ex08_

Breadchange(빵,잔돈) 대신 Map으로 바꾸기

빵과 잔돈을 map으로 -> 정수 2개를 저장하는 map

bakery 판매 메소드 결과 -> map이 되도록

★★★ 여러개를 반환하고 싶을때 : map을 써서 반환



*남은 수업

★★★IO(업로드, 다운로드 구현가능)

업로드중..
-> 네트워크 자바 코드

profile
개발자 velog

0개의 댓글