타입을 필드의 타입으로 적용해서 쓴것
박스 만드는 것이 중요하지 않고, 박스 사용하는 방법이 중요
인터페이스 : 추상메소드 주로 가지고 있음
collection interface구현한 구현체로 ClassA를 만든다면 )
반드시 void a(), void b(), void c() 들어가야함 (추상메소드 반드시 만들어야함)
-> 같은 인터페이스를 구현한 class 2개(class A, class B)
-> 동일한 인터페이스 구현 : 같은 메소드 가지고 있음
-> ClassA에서 abc만들어서 쓸 수 있음
-> 약속) 컬랙션이 가지고 있는 것만 만들면 되는 것
ArrayList : 배열대신 쓰는 클래스
HashSet :
-> 컬랙션 구현하고 있음
-> ArrayList, HashSet 가지고 있는 메소드가 거의 동일함
-> 같은 인터페이스 구현하고 있다
-> 사용법이 같다라는 느낌!
(내부는 구현이 다 되어있고 클래스 가져다가 사용하는 사용법 익히는것)
-> arrayList 따로 hashset 따로 공부하는건 아니라 하나만 공부하면나머지는 비슷함
-> List(라는 인터페이스) 있음
-> 본격적으로 ) "import" 함
-> package : java.util
-> java.lang 패키지에 들어가있는 String, System, Integer 클래스(생략)
특징 : 데이터의 저장되는 순서 유지, 중복 저장 가능
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 공부하면서 실력쌓기)
평소)
여기는) 메소드 씀 .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문)
-> 배열은 성능상관없음 / 클래스에 선언된 필드, 변수는 여러번 선언해도 상관없음
-> 메소드임/ 동일한 메소드의 호출은 성능의 저하를 일으켜서 한번만 불러서 변수 저장시키고 반복적으로 사용하기
추상메소드들이 인터페이스 안에있고
오버라이드해서 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문은 꼭 짤 수 있어야 함
첫번째 생성자
-> 그냥 ctrl+space
-> 디폴트 타입의 constructor만들 수 있음
필드를 파미터로 만들어서 처리
-> object를 부르는것 (extends가 없는 모든 클래스의 부모는 object이다: 부를 필요는 없으나 자동완성으로 하면 알아서 들어감)
-> person 출력을 쉽게 하기 위해서 override to string함
-> 이름과 나이를 곧바로전달하는 2번째 생성자
-> person + getName
-> person
커피트레이에 담겨있는걸 컵으로 볼거냐? 커피로 볼거냐?
컵을 만들때, 아메리카노랑 카페라떼 모두 공통타입으로 하는걸 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에는 정보 출력하는 메소드 없음
-> 이제 아메리카노인지 카페라떼가 나오는지 알 수 있음
-> 둘다 컬랙션이 구현체임
-> arrylist , hashset은 같은 collection을 참조했다
= 사용법이 같다
(ex) (메소드가 똑같다) - (추가할 때 사용하는 메소드 : add)
-> 바구니에 던져넣듯이 '순서'가 없음
-> 먼저 저장한 걸 먼저 꺼낸다는 보장이 없음
(인덱스와 관련된 메소드 없음)
-> 똑같은걸 2개 저장할 수 없음
-> 봄 2개 : 중복 저장 되지 않는다
-> 평소에는 주소값, 참조값나오는데
To_string도 만들어져 있음
(hashset 내부에 tostring이 override되어있음)
-> 순서도 없음
(요소 하나를 꺼내기 위한 구조 x : 덩어리로 사용하려는 구조임)
-> for문 대신 사용한다
flower세트에 집어넣을 수 있는 팔을 하나 만들자
순서도 없으니까 팔 하나 잡히는거 아무거나 꺼내라
-> 잡히는것이 있는가? 있으면 true, 없으면 false
-> 없으니까 꺼내지마라
->true, false를 가진 arm.hasNext
-> 만족하면 꺼내서 보여줘라
객체들은 중복저장이 됨 -> 그 중복저장을 막는 것 까지 수업할 예정
-> ctrl + space
-> 파라미터있는건 source 가서 입력
-> 똑같은 사람 2명
-> 똑같은 객체니까 하나만 저장했으면 좋겠다하는 것
-> set은 중복을 회피하는
-> p1,p2는 두개 객체의 참조값을 가지고 있는데 번지수가 달라서 다른 객체로 인지함
-> 메모리 주소값 비교에 의해서 다른 객체라고 인식함
내부적으로 참조값이 다르다고 판단
-> person의 equals를 override해주면 됨
자바 기본 동작 : 참조값 비교
-> equals다시 만들어주면 됨
-> age와 name이 모두 같으면 같은걸로 판단하기 위해서
-> String비교는 =으로 할 수 없어서 별도의 방법임(int방법은 =으로 비교가능)
-> 같은 사람으로 비교함
-> 수많은 아이디 중 하나의 아이디를 찾아낼때,
어떻게 하면 빨리 찾을 수 있을까?
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없이 배열만으로 어떻게
-> 필드가없을때) 생성자 만드는 규칙
-> 필드가 없는 경우) 생성자가 필요한경우 : 오직 "상속"관계일때
-> 필드가 없을때 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값으로 넣어주기