-
[모각코] 1주차 결과카테고리 없음 2022. 7. 9. 22:19
Collection, Iterator
Collection
JAVA에서 Collection은 데이터의 집합, 그룹을 의미한다.
출처 : https://en.wikipedia.org/wiki/Java_collections_framework Collection 인터페이스는 List, Set, Queue의 3개 인터페이스로 구분할 수 있고, Map의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 구분된다.
- Set 인터페이스
- 순서를 유지하지 않는 데이터의 집합으로, 중복을 허용하지 않는다.
- HashSet
- 가장 빠른 임의 접근 속도
- TreeSet
- 객체의 정렬에 사용되는 클래스
- 내부적으로 이진 검색 트리로 구현되어 있음
- 객체 비교를 위해 Comparable이나 Comparator 인터페이스를 구현해야함
- List 인터페이스
- 순서가 있는 데이터의 집합으로 중복을 허용한다.
- ArrayList
- 단방향 포인터 구조로 각 데이터에 대한 인덱스가 있어 조회 성능이 뛰어남
- 동적으로 크기를 조절할 수 있음
- LinkedList
- 양방향 포인터 구조로 데이터의 삽입 삭제시 성능이 뛰어남
- Vector
- Thread-safe함
- Map 인터페이스
- Key, Value의 쌍으로 이루어진 데이터의 집합
- 키의 중복은 허용되지 않으나 값의 중복은 허용된다
- 내부적으로 hash 방식으로 구현되어있음
- HashTable
- HashMap 보다는 느리지만 Thread-safe
- null 불가
- HashMap
- null 가능
- TreeMap
- 정렬된 순서로 키와 값을 검색함
- 정렬을 위해 Comparable, Comparator 인터페이스 구현
Iterator
- JAVA의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것이다.
- 기능
- hasNext() : 읽어올 요소가 있는지 확인하는 메소드
- next() : 다음 데이터를 읽어 반환한다
- remove() : next()로 읽어온 요소를 삭제한다
Stream
Stream
- 데이터의 연속이다 (System.in / System.out도 스트림이다)
- 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것
// example list.stream() .sorted() .forEach(System.out::println);
- 특징
- Read Only, 일회용 이다.
- 최종 연산 전까지 중간 연산을 수행하지 않는다 (lazy evaluation)
- 손쉽게 병렬 처리 할 수 있다.
- 기본형 스트림으로 IntStream, DoubleStream, LongStream이 제공됨
- 생성
- Collection의 경우 .stream()으로 스트림 변환
- 객체 배열로 부터 스트림 생성
// example Stream.of("1", "2","3"); Arrays.stream(new String[]{"a", "b", "c"});
- 람다식 iterate(), generate()
// example Stream.iterate(0, n->n*2); // 0, 2, 4... 무한 스트림 Stream.generate(Math::random);
- 사용
- 람다식을 인자로 주어 사용
Lazy Evaluation
- 불필요한 연산을 피한다 (반대는 Eager Evaluation)
final List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); System.out.println( list.stream() .filter(i -> { System.out.println("i < 6"); return i<6; }) .filter(i -> { System.out.println("i%2 == 0"); return i%2==0; }) .map(i -> { System.out.println("i = i*10"); return i*10; }) .collect(Collectors.toList()));
위의 코드를 실행시켰을 때 eager evaluation은
- 1 ~ 10번의 요소중 6보다 작은 값을 구한다
- 1번에서 구한 요소들 중 짝수인 값을 구한다
- 2번에서 구한 요소들에 각각 10을 곱한다
lazy evaluation은
- 6보다 작은지 검사한다 (false이면 2, 3번 패스)
- 짝수인지 검사한다 (false이면 3번 패스)
- 요소에 10을 곱한다
Optional
Optional
- null을 대신하기 위해 만들어진 클래스로 null이나 null이 아닌 값을 담을 수 있다.
- 배경 : 자바는 레퍼런스 변수를 많이 사용한다 → Null Pointer Exception(NPE)이 발생할 가능성 높음 → 이를 해결하기 위해 null에 대한 조건문이 많이 필요함 → 이를 피하기 위해 Optional 사용
- Optional.empty() : 빈 Optional 객체를 생성한다.
Optional<String> optStr = Optional.empty();
- Optional.of(value) : value의 값이 null이 아닌 경우 사용한다
Optional<String> optStr1 = Optional.of("Hello world"); // value가 null이면 NPE 발생
- Optional.ofNullable(value) : value의 값이 null인지 아닌지 확실하지 않은 경우에 사용한다.
Optional<String> optStr2 = Optional.ofNullable(null); // null인 경우 empty optional 객체 생성
Optional 객체에 접근 및 사용 방법
- ifPresent 함수
- Optional 객체가 null이 아닐 때 인자로 넘긴 함수를 실행하는 메소드
optStr1.ifPresent(s -> System.out.println(s.charAt(0))); // null인 경우 프린트 안됨
- orElse 함수
- Optional 객체가 null인 경우에 대신할 수 있는 값을 반환하는 메소드
optStr2.orElse("test");
- orElseGet 함수
- orElse와 유사하지만 다른점은 메소드를 인자로 받고 함수에서 반환한 값을 반환하는 메소드
optStr.orElseGet(() -> System.out.println("null"));
- orElseThrow 함수
- 기본 값을 반환하는 대신 예외를 던짐
- Set 인터페이스