본문 바로가기

기술면접준비

JAVA 8 버전부터 추가된 Stream

for 문 으로 배열/컬렉션인스턴스 에서 요소 꺼내는거 단점보완버전

 

컬렉션 프레임워크 -> 자바 라이브러리 이다

- 다수의 데이터를 쉽고 효율적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스 집합

- 자료구조와 알고리즘을 구조화하여 클래스로 구현해 놓은 

다수의 데이터를 효율적으로 관리,저장 할 수 있는 자료구조를 제공함

인터페이스와 클래스로 구성

각 데이터 구조와 특징에 따라 다양한 클래스 사용

Set, List, Queue 등 하위 인터페이스들이 Collection을 상속받음

 

 

List - 중복 가능, 순서 있는 데이터 집합

- ArrayList : 특정 원소의 조회가 많은 경우 사용

배열이용하여 만든 리스트

인덱스로 조회 가능, 인덱스만 알면 해당 데이터 빠르게 조회가능

삽입, 삭제 하면 그 뒤의 데이터를 밀거나 당겨야 하기 때문에 느림

 

- LinkedList : 조회보다 삽입/삭제가 많은 경우에 사용

노드와 포인터를 이용해 만든 리스트

특정 원소 조회할 경우 첫 노드부터 순회함 -> arrayList에 비해 느리다

포인터로 각 노드를 연결하고 있어서, 삽입/삭제 빠름 -> 단순히 기존포인터 끊고 새로운 노드에 연결하면 되기 때문, but 중간에 데이터를 삽입,삭제 할 경우 그 데이터까지 순차적으로 조회해야 하기 때문에  O(N)의 시간복잡도를 가짐

(O(N) -> 빅오 표기법)

 

- Vector : arrayList와 비슷하게 배열리스트지만 thread-safe 하다

한번에 하나의 스레드만 접근 가능

get, put에 모두 syncronized가 걸려있어서 스레드마다 lock이 걸리게되고 성능이 arrayList보다 안좋음

 

- Stack : LIFO 특성 자료구조

마지막에 들어온 원소가 처음으로 나감 last in first out

들어올땐 push 나갈땐 pop

 

 

 

 

Set - 중복 불가능, 순서 없는 데이터 집합

- HashSet  : 객체 저장 전 , 먼저 객체의 haseCode()메소드를 호출하고 같으면 equals로 비교하여 동등성 판단

- LinkedHashSet : 중복 X, 순서 O

- TreeSet : 중복 X, 순서X 정렬O . 이진트리 기반 Set컬렉션

 

 

Map  

- HashMap은 key : value 형태. 순서 X, key는 중복 불가능. value는 가능

key 와 value에 null허용

동기화 보장 x

 

- HashTable은 HashMap과 동일 특징, thread-safe 하여 동기화 지원 

key , value 에 null 허용하지 않는다

동기화 보장함 get() put() remove()등에 syncronized키워드 붙어있다

 

( 멀티스레드와 syncronized? 

멀티스레드 : 여러스레드가 동시에 실행 , 동시에 자원에 접근 가능

syncronized : 스레드 간에 공유자원에 대한 접근을 제어. 데이터 일관성 보장.

한스레드당 한개만 접근하도록. 성능저하 발생)

 

- LinkedHashMap : 순서 가지는 Map

 

- TreeMap : key기준으로 정렬되어 저장되는 map

이진트리 기반 map

부모 키값을 비교하여 낮은건 왼쪽 높은건 오른쪽 Map.entry를 저장

저장시간이 오래걸림

 

 

 

 

Stream

자바 8에서 추가됨 

데이터의 흐름 . 배열 또는 컬렉션 인스턴스에 람수 여러개를 조합하여 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다. 람다를 이용해 코드양 줄이고 간결하게 표현 가능. 

-> 즉 배열과 컬렉션을 함수형으로 처리가 가능하다!

-> 멀티스레드 가능하다.

-> 중간연산, 최종연산으로 나뉘고 최종연산이 수행될 때 스트림이 처리된다 -> 지연 연산.

-> 내부 반복을 사용하므로 루프를 명시적으로 작성X

 

 생성 -> 가공 (중간연산) -> 결과(최종연산)

스트림 인스턴스를 생성하고, filtering , mapping등 중간작업(intermediate operations) 거쳐서, 결과를 만들어냄 terminal operations

 

자주 사용되는 스트림 메서드

1. filter() 

 - 조건에 맞는 요소를 추출하는 중간연산

 

2. map()

- 각 요소를 변환하는 중간 연산. 요소를 다른 타입으로 매핑할 때 사용

 

3. collect()

- 스트림의 결과를 리스트, 셋 등의 컬렉션으로 변환하는 최종 연산

 

4. forEach()

- 각 요소를 순회하며 특정 작업을 수행하는 최종연산

 

5. reduce()

- 스트림의 요소들을 하나의 값으로 축약하는 최종연산

 

6. sorted()

- 스트림의 요소들을 정렬하는 중간연산

 

7. distinct()

- 중복 요소 제거하는 중간 연산

 

8. limit()

- 스트림 요소 중 n개 까지만 선택하는 중간연산

 

9. skip()

- 처음 n개의 요소를 건너뛰는 중간 연산

 

10. parallel()

- 병렬처리. 대용량데이터 처리에서 유용. 각 요소들이 동시에 여러스레드에서 병렬 처리됨

- 순서가 보장되지 않아서 순서필요하면 forEachOrdered()사용해야함

 

차이 예시 : 

 

 

순서적용 

 

 

작은 데이터셋일땐 stream보다 for-each가 더 빠를 수 있음

stream 은 내부적으로 람다 표현식과 함수형 인터페이스를 사용하고, 추가적인 메서드 호출과 추상화 레이어가 있기 때문에 작은 작업에선 오버헤드 발생할 수 있다

 

대용량 데이터셋 일땐, 병렬스트림 사용 시 stream이 권장됨

parallel 메서드로 처리하면 병렬 처리하기 때문에 빠르다

 

람다표현식도 도입되었다

메서드를 식으로 간단하게 표현 가능하게 됨