DAY21 ArrayList, HashSet

NA YE SOM·2023년 7월 27일
0

review

타입을 필드의 타입으로 적용해서 쓴것
박스 만드는 것이 중요하지 않고, 박스 사용하는 방법이 중요

(여기가 중요함) String을 저장하는 box1 -> 선언하고자 하는 제네릭 타입을 쓴다, 생성자에서도 마찬가지임

윤곽

인터페이스 : 추상메소드 주로 가지고 있음

collection interface구현한 구현체로 ClassA를 만든다면 )
반드시 void a(), void b(), void c() 들어가야함 (추상메소드 반드시 만들어야함)


-> 같은 인터페이스를 구현한 class 2개(class A, class B)
-> 동일한 인터페이스 구현 : 같은 메소드 가지고 있음



-> ClassA에서 abc만들어서 쓸 수 있음

-> 약속) 컬랙션이 가지고 있는 것만 만들면 되는 것


ArrayList : 배열대신 쓰는 클래스
HashSet :

-> 컬랙션 구현하고 있음


-> ArrayList, HashSet 가지고 있는 메소드가 거의 동일함
-> 같은 인터페이스 구현하고 있다
-> 사용법이 같다라는 느낌!
(내부는 구현이 다 되어있고 클래스 가져다가 사용하는 사용법 익히는것)

동일한 인터페이스 구현 = 사용법이 같다 (거의 비슷하다)


-> arrayList 따로 hashset 따로 공부하는건 아니라 하나만 공부하면나머지는 비슷함

배열 리스트 , import(ctrl + space)


-> List(라는 인터페이스) 있음

-> 본격적으로 ) "import" 함

Import : (목적) 클래스 부르는 것


-> package : java.util



-> java.lang 패키지에 들어가있는 String, System, Integer 클래스(생략)

List 인터페이스

특징 : 데이터의 저장되는 순서 유지, 중복 저장 가능
1. 배열과 유사
2. 길이를 자유롭게 변경할 수 있는 객체
3. 추가된 순서를 유지하고 중복해서 객체를 저장할 수 있음
-> 인덱스를 통해 원하는 객체를 직접 검색할 수 있는 기능(저장순서를 유지하기 때문에)
4. 데이터를 연속적으로 순서대로 저장하기 때문에 접근속도는 빠름
-> ArrayList, Stack, Vector, LinkedList


-> 원래는 java.util의 List라고 불러야 함

-> 내가 앞으로 List라고 부르면 ) java.util의 List 임
-> 원래 class는 패키지까지 붙여서 적는게 맞는데 계속 이렇게 적으면 코드가 지저분해짐(패키지는 생략- 한번만 적음)


-> java.lang(language) 패키지가 유일하게 생략가능
-> import 생략하면 -> 알아서 java.lang으로 소속됨
-> 기본클래스는 java.lang 패키지에 집어넣고 import 생략해도 좋음

List 다 쓰든,쓰지 않든 - ctrl + space

인터페이스 구현체로 클래스가 만들어져 있음

-> 배열에 뭐가 들어갈 건지

List <E>는 인터페이스이기 때문에 객체를 스스로 생성할 수 없다. 객체 생성하기 위해서는List <E>를 상속받아 자식 클래스를 생성하고, 생성한 자식 클래스를 이용해 객체를 생성해야 한다.

BUT, 컬랙션 프레임워크를 이용시) 직접 인터페이스 구현하지 않아도 됨
-> ArrayList<E>, Vector<E>, LinkedList<E>


-> 배열요소 하나하나 : element


-> 첫번째 : 파라미터 없는 내용이 없는 배열을 만들어줌


List(부모타입) ArrayList(자식타입)
-> upcasting (부모타입으로 다 저장할 수 있음)

(1) 값만 추가 (2) 추가할 인덱스에 저장


-> 인덱스 0에 "여름" 들어감

-> 인덱스 0에 봄 넣고 나머지 뒤로 한칸씩 미룸

<배열로 하면 밑에 와 같이 해야하는 작업>

-> 여름,가을,겨울을 한칸씩 뒤로 미루기


0번 요소를 1번요소로 3개 집어넣어락


-> arrayList 누르고 ctrl -> 구현체 볼 수 있음


-> 알아서 함
-> 내부구조는 미리 구현된 class사용하자
-> 배열 대신 arrayList 사용하기(안전한 방법)

○ 알고리즘, 자료구조 공부하고 arrayList (라이브러리 회사, 플랫폼 회사) - 전공자 선호
-3~5년정도 되면 ) 학벌, 성별 중요치 않아짐
-KOSA 에서 급별로 책정된 급여가 있음
★★★취업 후 ) 3~5년을 어떻게 보낼 것인지가 결정지음
(CS : Computer Science 공부하면서 실력쌓기)


add () 메소드 : 요소 추가하는 메소드 (특정 인덱스 선택해서 추가하는 것도 가능함)

평소)

여기는) 메소드 씀 .get(값을 꺼내올때)

get(int index) : index 위치의 원솟값을 꺼내 리턴


-> get 메소드 쓰는것 확인!


ctrl+space 이용해서 완성하는 연습하기!

->size 호출

size() : 리스트 객체 내에 포함된 원소의 갯수



-> 처음에 길이를 잡아주지 않았음
-> 알아서 부족하면 자기가 가져다가 붙여씀

-> 길이가 부족할지 고민하지 않고 사용할 수 있음
-> 알아서 잡아줌


-> 메소드 3개 (add,get,size) -> 나올때마다 정리하기


-> 마지막 요소 어떻게 구할건지?
-> 코딩 , index 2번 번호

-> 마지막 번호 인덱스 : 길이 - 1


-> 꺼낼때는 get


-> for문으로 함

★ ★ 배열 접근하는 for문 외우기!


![]

리팩토링

(https://velog.velcdn.com/images/experiment123/post/76d07080-78c6-4cc9-b309-356bed8cba5d/image.png)

-> 여러번 호출할 필요없음
(코드 수정하기)


-> 동시에 변수이름들 ,로 구분해서(같은타입시) 초기값 지정도 할 수 있다(선언 한번에)


-> 선언한 변수 i, length 2개 선언

-> 초기화 블록은 한번 동작


-> 끝나면 2,3,4 만 반복


-> 초기화 블록은 한번만 동작

-> 초기화블록으로 2개 빼는 문법

(초기 배열 for문)

-> 배열은 성능상관없음 / 클래스에 선언된 필드, 변수는 여러번 선언해도 상관없음

-> 메소드임/ 동일한 메소드의 호출은 성능의 저하를 일으켜서 한번만 불러서 변수 저장시키고 반복적으로 사용하기


ex03_ Set

추상메소드들이 인터페이스 안에있고
오버라이드해서 arraylist클래스들이 있는것


-> 인덱스 먼저 전달, 수정할 내용 나중에 전달


-> 인덱스 1의 요소 지우기


-> 꺼내는 요소 get 인덱스 i전달

초기화

배열의 초기화 {중가로}


-> 제네릭은 기본 타입 사용 x -> int 안됨 -> integer


-> 배열관련 util class 임


-> T:Integer 반환타입
-> 말줄임표 (ellipsis ) : 여러개를 전달할 수 있다.


-> 하나를 넣든 두개를 넣든 상관없음


-> 말 줄임표는 사실은 배열이니까 배열을 전달해도 동작함

-> numbers가 integer타입, 배열은 int로 되어있음 그래서 오류남
-> 제네릭 타입 쓰는 애들 : reference 타입만 쓸 수 있음


-> int가 Integer랑 똑같음(호환됨) -> 우리가 아는 배열하고 똑같음
-> 참조타입으로 바꿔놓고 쓰는 사람도 있음

추가나 삭제가 되지 않음 : 길이가 바뀌는 작업이라 할 수 없음


-> 마지막 요소로 60을 추가하겠다


-> 첫번째 요소를 삭제하겠다


-> 갯수 제한 없음(10,20,30,40,50)


-> ★★★ 배열과 ArrayList for문은 꼭 짤 수 있어야 함


★★★중요한 ex

  1. 첫번째 생성자

    -> 그냥 ctrl+space
    -> 디폴트 타입의 constructor만들 수 있음

  2. 필드를 파미터로 만들어서 처리


    -> object를 부르는것 (extends가 없는 모든 클래스의 부모는 object이다: 부를 필요는 없으나 자동완성으로 하면 알아서 들어감)

    -> person 출력을 쉽게 하기 위해서 override to string함


    -> 이름과 나이를 곧바로전달하는 2번째 생성자

이름만 따로 빼서 보여주는 코드 - getter


-> person + getName


-> person

★★★arraylist에 객체를 넣는것 연습하기! (우리에게 중요한 예제)


★★★ex02_Coffee(!!꼭 마스터하기)

커피트레이에 담겨있는걸 컵으로 볼거냐? 커피로 볼거냐?

컵을 만들때, 아메리카노랑 카페라떼 모두 공통타입으로 하는걸 coffee라 하겠다


-> 인터페이스는 add를 눌러서 하는것이 좋음

-> 인터페이스 검색


-> 인터페이스 구현하는 방법 : implements Coffee



americano 타입 : coffee
or
coffee 타입



-> 컵하나당 커피 한잔

-> 아메리카노, 카페라떼 모두 저장할 수 있는 타입

-> 불가능

인터페이스는 추상 메소드여서 new 가 되지 않음
(추상메소드 => 인터페이스라고 부름)
(ex) 커피라는 건 실물로 존재할 수 없는것 무슨 커피인지 알아야 함


-> cup의 생성자는 디폴트로만
비어있는 컵, setter,getter을 써서 넣겠다


-> 생성자를 안만들어서 이렇게밖에 만들 수 없음


-> 아메리카노 만들고 coffee를 담음


(원래는)

컵2개를 담은 커피트레이를 든다 -> 컵이 2개가 필요함


-> ArrayList 들어옴


-> 선언만!


-> new Person할때 tray 만들기

ctrl + space : 디폴트 생성자 넣을 수 있음



-> tray도 형태를 갖춤


-> 손님이 트레이를 가지고 있음
-> 커피 2개를 해당 트레이에 저장하는 것


-> 트레이에 cup을 담기(빨간줄은 아직 구현 x)

트레이에 cup이 2개담김


-> 받아오는건 cup 타입 , 반환타입 x


-> arraylist는 무한 확장가능한 tray라서 그냥넣을 수 있음(배열이라면 꽉 찼는지 등 검사했음)


-> 컵에다 커피 넣는건 이미 끝났고


-> cup을 받아오는것 : Cup 타입
-> add메소드 생각!


-> tray에 뭐 들어있는지 확인


-> try에서 cup을 꺼낸다 (get (i))


-> 여기까지 Cup
cup에는 정보 출력하는 메소드 없음

-> 이제 아메리카노인지 카페라떼가 나오는지 알 수 있음


해쉬

ex03_Set(집합)


-> 둘다 컬랙션이 구현체임


-> arrylist , hashset은 같은 collection을 참조했다
= 사용법이 같다
(ex) (메소드가 똑같다) - (추가할 때 사용하는 메소드 : add)


-> 바구니에 던져넣듯이 '순서'가 없음
-> 먼저 저장한 걸 먼저 꺼낸다는 보장이 없음
(인덱스와 관련된 메소드 없음)


-> 똑같은걸 2개 저장할 수 없음


-> 봄 2개 : 중복 저장 되지 않는다

-> 평소에는 주소값, 참조값나오는데
To_string도 만들어져 있음
(hashset 내부에 tostring이 override되어있음)

-> 순서도 없음
(요소 하나를 꺼내기 위한 구조 x : 덩어리로 사용하려는 구조임)

for문 돌리는 법(향상for문)



while문 돌리는 법

Iterator

.hasNext

.next


-> for문 대신 사용한다


flower세트에 집어넣을 수 있는 팔을 하나 만들자

순서도 없으니까 팔 하나 잡히는거 아무거나 꺼내라


-> 잡히는것이 있는가? 있으면 true, 없으면 false


-> 없으니까 꺼내지마라


->true, false를 가진 arm.hasNext
-> 만족하면 꺼내서 보여줘라

반복자 Iterator를 이용한 순회(인덱스가 없을때 간혹 사용할 수 있는 형태)

객체들은 중복저장이 됨 -> 그 중복저장을 막는 것 까지 수업할 예정



-> ctrl + space

-> 파라미터있는건 source 가서 입력


-> 똑같은 사람 2명


-> 똑같은 객체니까 하나만 저장했으면 좋겠다하는 것
-> set은 중복을 회피하는


-> p1,p2는 두개 객체의 참조값을 가지고 있는데 번지수가 달라서 다른 객체로 인지함
-> 메모리 주소값 비교에 의해서 다른 객체라고 인식함

내부적으로 참조값이 다르다고 판단
-> person의 equals를 override해주면 됨

  • 자바 기본 동작 : 참조값 비교
    -> equals다시 만들어주면 됨


    -> age와 name이 모두 같으면 같은걸로 판단하기 위해서


    -> String비교는 =으로 할 수 없어서 별도의 방법임(int방법은 =으로 비교가능)


    -> 같은 사람으로 비교함

+ 추가(주석)



hashcode쓰는 목적 : 빠른 검색을 위해서

-> 수많은 아이디 중 하나의 아이디를 찾아낼때,
어떻게 하면 빨리 찾을 수 있을까?

ID가 banana라고 할때) full scan 안하고
hash값 조회를 먼저 함
-> 1. 첫글자 a
2. 첫글자 b...

hash 2(첫글자가 b인) 를 가진 아이들 먼저 조회함
-> 해쉬코드라고 부름
1~26 숫자 : 해쉬코드값
-> 해쉬코드도 오버라이드 할 수 있음


-> 유사한 데이터들을 모아서 관리할 수 있도록) 동일한 해시코드 가질 수 있도록 : 알고리즘을 짜서 구현한 특정한 정수값

바나나가 있는지 없는지 찾는게 equals
그전에 해쉬값을 찾아서 범위를 지정

-> "해쉬"랑 "equals"랑 같이 다님(알고리즘 짜려고하지말고)
-> Hash기반으로 중복체크한다
-> add할때마다 동일한 데이터가 있는지 없는지 조회함

*Hashset
1. Hashcode 비교 -> 동일한 데이터일 가능성 있으니 -> 2.equals비교

set 물어보면 arraylist 랑 사용법이 같다

★ ArrayList 많이 씀

(보충) arraylist없이 배열만으로 어떻게


ex03_ 버스에 사람 태우기




-> 필드가없을때) 생성자 만드는 규칙

-> 필드가 없는 경우) 생성자가 필요한경우 : 오직 "상속"관계일때


-> 필드가 없을때 superclass(부모)





-> 시트 하나당 한명이 앉음

-> 사람앉히는거 , 앉은 사람 꺼내는 작업 (setter, getter)

arraylist 나 hashset 아무거나 잡아도 됨 (여기서는 arraylist로)
-> 버스에 좌석이 여러개 깔려있음

-> arraylist 쓰면) 최대 몇명이 앉을 수 있는지 알 수 없음(제한없이 사람 태울 수 있음)


(좌석이 25개 있음)
-> arraylist는 인덱스 작업을 해서 좌석을 정해서 앉히기 ( 0번 좌석에 누구, 1번 좌석에 누구 ..)

버스에 타는 메소드 만들기


-> 1번 좌석에 누가 앉았음

bus class
1. arraylist 생성 -> 좌석 25개가 생긴건 아님(아무도 앉지 않은 빈좌석이 생겼나? 아님)

-> 아무도 앉지 않는 좌석 25개를 만들어야 함


-> 좌석을 만드는 건 New seat() 코드만 할 수 있음

-> seat클래스 생성자 x -> 디폴트 상태로

-> seat 25개가 만들어진 상태 : new seat를 25번해야 만들어짐(다른 방법은 없음, 반복문에 넣어서 해야함) -> 빈 seat 25개 채워야함 (arraylist넣어서)
2. New Seat를 언제할건지에 대한 고민을 해야함

getOn, student와 person 모두 저장할 수 있는 -> person 준비


-> 반환타입이 void일때, return해서 끝낼 수 있음

실제 (좌석번호 0~24번, 인덱스로 되어있으니까, 인덱스로 판단할때는 -1 해야함)


-> 이미 앉았으니까


-> seat하나 빼는것
(타입이 seat)
-> 우리는) 사람이 있는지가 궁금한것

-> 사람을 빼고

-> 앉아있는 사람이 있다는 뜻


-> 좌석이 비어있어야 앉을 수 있어서


-> 좌석



*배열로 했다면 이렇게 ~
Seat[] seats = new Seat[25];

의자가 들어갈 수 있는 '자리만' 만들어놓음

-> 배열은 초기값 : null값으로 채워짐(실제로 의자를 가져다 놓은 건 아님)
-> 의자를 가져다놔야 사람을 앉힐 수 있으니까

seat에 들어가는

getPerson 확인용
setperson 탑습용

< 추천 공부방법>

1. 해당 클래스의 new를 찾음
new person -> person있는지 찾음
new seat -> seat 있는지 찾음
-> 하나라도 없으면 nullpointexception 됨
(모든 객체는 new이용해서 만들어야 존재하므로)

-> 좌석번호 


-> 사람이 없음


좌석을 꺼내고
-> 0번자리에 사람 정보를 null로 바꿈

-> new person 이든 new student든 null값으로 바뀜

리팩토링할 포인트

탑승할때는 만들어서 내릴때는 null값으로 바꿔서 비어있는상태로 만들기


-> print로 변경


-> seat임(무조건 25개 있음)


-> 사람이 있으면 null이 아님 , 그 사람 보여주기


-> 아니면 빈좌석을 보여줌

*리팩토링
(시트, 하차할 시트, 하차할 시트에 앉은 사람까지 객체로 빼서 해당값을 사용함)

-> 하차 메시지 마지막으로 다시 옮겨두고
-> 리팩토링의 결과(person 정보 빼서 2번 호출함)

-> 사람이 내리고 그 자리를 null값으로 넣어주기

profile
개발자 velog

0개의 댓글