-
모든 트리는 그래프임
-
모든 그래프가 트리는 아님
-
계층적 구조 - tree
- 게층적은 뭔가 효울적으로 검색하기 위해서 쓰임
-
그래프
- 거의 세상에서 모든 데이터는 그래프로 표현할 수 있음 (너무 많은 곳에서 사용됨)
-
memory overhead
-
deep copy vs shallow copy in reference variables
- shallow copy
- same memory
- =
- deep copy
ArrayList<Integer> list2 = new ArrayList<>(list);
System.arrcopy(list, 0, list2, 0, list.size())
- src, srcPos, dest, destPos, length
- When it doesnt work
- list with > 1 dimensions (다차원배열)
- shallow copy
-
crud 에서 젤 중요한거
- READ
- 이거 위주로 생각을 하는 마인드셋
- db를 다루는 것도 이거임
- 하지만 실무에서
- READ
-
tree traversal 면접때 나올 수 있음
-
해시 함수는 순수 함수여야만 함
- 아니면 데이터를 복구 못함
- deterministic
- O(1)
-
안티패턴 <<
-
백엔드
- 대용량 데이터 다루는 법
- kafka - 실시간으로 대용량 데이터를 다룰 때
- hadoop → when u dont need live data
- db
- kafka - 실시간으로 대용량 데이터를 다룰 때
- 대용량 데이터 다루는 법
Call by reference / value
-
Java에서 파라미터를 전달할 때 call by value일까 call by reference일까?
- call by value
- 동작은 call by reference인데, 주소값을 복사해서 넘겨주기 때문에 엄밀히 말하자면 call by value이다
- call by value
-
call by reference
- Node n = new Node()
- n에게 new Node()의 address 값을 저장
- Node n = new Node()
-
면접에서는 요즘 객관식으로 cs 질문 자옴… 코테는 오히려 좀 쉬움
- java에 대해선 좀 깊에 알아야함
-
float vs double
-
정수형 표시가능 범위 다 외우기
- byte - 8 bits (, or 256)
- -128 ~ 127
- short - 2
- int 2^32
- float (소수점 8자기)
- long 2^64
- double (소수점 15자리)
- byte - 8 bits (, or 256)
-
부동소수점
- 0.3 + 0.3 == 0.6 → true
- 0.3 + 0.3 + 0.3 == 0.9 → false??
- 실수를 쓸 때 Big Decimal 사용하기 <<<
-
모든 원시타입은 래퍼 클래스를 가지고 있음
- int → Integer
- double → Double
- long → Long
- float → Float
-
boxing/unboxing
- 캐싱<<이해하기
generic 노션 1,2,4는 필수 3,5,6는 심화
File I/O
access vs search
- access는 단 하나의 요소를 찾는 것 (1번 조회)
- search
배열을 뒤집는 알고리즘 (in place)
- o(1) - space
- using 2 pointers, u just make 2 pointers, thus constant memory lol
- o(n) - time
데이터 크기별 권장 자료ㅛ구조
-
소규모
- 걍 아무거나 써도 됨 ㅋ
-
java의 정렬 알고지름
- 2개있음 (원시, 참조형에 따라 다름)
대용량 데이터
- linkedlist잘 안씀, arraylist많이 사용함
- 가장 선호되는건 아나 arraylist일것
- hash구조는 비교적 많이 쓰지 않음 (데이터가 많으면 해시 충돌이 일어날 가능성이 많기 때문에)
- 자료구조를 정할 때 infra 레벨에서 접근하는 경우가 많음
- 대용량 데이터를 가지고 필터링을 해야함 (ex 쿠팡에 가위 검색)
- 가ㅇ 까지만 쳐도 가위가 알아서 나옴
- java/spring으로만 가지고는 완벽하기 구현 어려움
- 검색 같은 경우 검색 엔진을 구현함 (ㅇ미 구현되어있는걸 씀) - elastic search 같은거
- 대용량 데이터를 가지고 필터링을 해야함 (ex 쿠팡에 가위 검색)
삽입/삭제가 잦고 위치가 중요한 경우
- linkedlist를사용할 수 있지만 주의해야함
- 실제 실무에서는 CRUD의 R가 가장 중요하기 때문에
- 항상 조회를 우선시해야함
trie
- 글자별 필터링때 유용함 - 키워드 자동완성
- 각 노드가 문자를 표현함
- trie를 쓰는 기술을 공부할 때 알아놔야함
- java에는 없어서 직접 구현해야함
Sorting algorithms
정렬 꼭 알아야함
-
data structure 에 따라서 어느 정렬 알고리즘
-
stable vs not stable (safe and non safe)
-
tim sort?
- for python originally, also used in java
- merge (정렬X부분)+ insert (정렬된 부분)
-
n log n 보다 빠른 sorting algorithm은 없음
-
stable vs unstable
- stable → 순서를 유지함
- 더 정확히 숙지하기
- unstable
- quick, heap, selection
-
알아야하는
- quicksort
- 무조건 알아야함
- unstable
- mergesort
- ㄹ얘도 무조건…
- 더이상 쪼갤 수 없을떄가지 쪼개고, 병합
- 병합할때야 정렬이 이루어짐
- stable
- bubblesort (너무 기본이라 학습용임)
- 생각보다 손코딩에서 많이 나옴
- 그냥 뼛속부터 알아야함 - 종이에 대고 바로 쓸 수 있어야함
- 가장 큰 데이터가 맨 뒤로감
- insertion sort
- 외우기 ㅋㅋ
- selection sort
- 첨-끝까지 돌고, 가장 작은 숫자랑 swap
- quicksort
-
가능하면 best average worst 다 알고있어야 함
-
counting sort
- 각 값의 등장 횟수를 셈
- 엄청 큰 단점: 정수만 가능 + 메모리 낭비
-
radix sort
- 자릿수별로 나누어 정렬
- %10, then %100…
-
heap sort
- 천만건의 데이터에서 2번째로 큰 수
-
취업준비할때
- 생각보다 스토리텔링이 중요 → 왜 이걸 좋아하는지 → 근거자료
- 유튭에서 우연히 정렬 알고리즘 시각화를 봤는데 흥미로웠다
- 어떠한 얘기로 여기 들어왔고 이러한 것들은 공감포인트가 될 수 있음
- 블로그가 젤 좋긴 함
- 서류는 안보더라도 이런것들음 봄…
- github
- commit내용 엉망X
- 생각보다 스토리텔링이 중요 → 왜 이걸 좋아하는지 → 근거자료
-
binary search
- 정렬되어있어야함, 중복 없음
과제
- 데이터에 관련된거는 repository로 따로 나눔
- dao (data access object) - 우리가 담당해야할 데이터를 관리하는 객체
- 인터페이스가 있는 이유
- 지금은 csv로 데이터를 저장하는데, csv를 사용못할 수도
MemberRepository
interface는 수정한대도 됌- 껌데기같은거임
- Member Service는 MemberRepository를 받고 있는데, 어떤 member repository인진 알 필요가 없음!
- 계층형 아키텍쳐 - layered architecture
- controller ← service ← repo
- 절대 양방향이 되면 안됌
- service - 비즈니스 로직
- repo - 데이터 액세스
- controller - 입구 (데이터를 받고 내보냄)
- 파일을 사용할 수 있는지, 계층을 이렇게 분리할 수 있는지가 핵심임