전체 글 74

[자바의 정석 - 기초편] 14. (5) 스트림의 최종 연산 ( forEach, forEachOrdered, allMatch, anyMatch, noneMatch, findAny, findFirst, reduce / collect와 Collectors / 그룹화와 분할 )

스트림의 최종 연산 - 스트림의 모든 요소에 지정된 작업을 수행 : forEach(), forEachOrdered() - 스트림 요소의 조건 검사 : allMatch(), anyMatch(), noneMatch() - 조건에 일치하는 요소 찾기 : findFirst(), findAny() - 스트림의 요소를 하나씩 줄여가며 누적연산 수행 : reduce() collect()와 Collectors - collect() : Collectors를 매개변수로 하는 스트림의 최종 연산 - 그룹별 리듀싱 - Collector : 수집에 필요한 메서드를 정의해 놓은 인터페이스 - Collectors : 다양한 기능의 컬렉터(Collector를 구현하는 클래스)를 제공하는 클래스 스트림을 컬렉션, 배열로 ..

[자바의 정석 - 기초편] 14. (4) 스트림의 중간 연산 ( skip, limit, filter, distinct, sorted, map, peek, flatMap / Optional<T> )

스트림의 연산 - n번 가능 - 스트림을 반환 - 1번 가능 - 스트림 요소 소모 - int, boolean, Optional을 반환 스트림의 중간 연산 - 스트림 자르기 : skip(), limit() - 스트림 요소 걸러내기 : filter(), distinct() - 스트림 정렬하기 : sorted() - Comparator의 comparing()으로 정렬 기준을 제공 - 추가 정렬 기준을 제공할 때는 thenComparing()을 사용 - 스트림 요소 변환하기 : map() - 스트림 요소를 소비하지 않고 엿보기 : peek() - 스트림의 스트림을 스트림으로 변환하기 : flatMap() Optional - T 타입 객체의 래퍼클래스 : Optional - 간..

[자바의 정석 - 기초편] 14. (3) 스트림 특징, 스트림 만들기 ( 컬렉션 / 배열 / 임의의 수 / 특정 범위의 정수 / 람다식 / 파일과 빈 스트림 )

스트림 (Stream) - 다양한 데이터 소스를 표준화된 방법으로 다루기 위한 것 1. 스트림 만들기 2. 중간 연산 (0~n번) : 연산결과가 스트림 O 3. 최종 연산 (1번) : 연산결과가 스트림 X 스트림의 특징 - 스트림은 데이터 소스로부터 데이터를 읽기만할 뿐, 변경하지 않음 (Read Only) - 스트림은 Iterator처럼 일회용임 (필요하면 다시 스트림 생성해야 함) - 최종 연산 전까지 중간 연산이 수행되지 않음 (지연된 연산) - 스트림은 작업을 내부 반복으로 처리함 - 스트림의 작업을 병렬로 처리 - 병렬 스트림 - 기본형 스트림 : IntStream, LongStream, DoubleStream > 오토박싱 & 언박싱의 비효율이 제거됨 (Stream대신 IntStream 사용) ..

[자바의 정석 - 기초편] 14. (2) java.util.function 패키지 / Predicate의 결합 / 컬렉션 프레임웍과 함수형 인터페이스 / 메서드 참조

java.util.function 패키지 - 자주 사용되는 다양한 함수형 인터페이스를 제공 - 매개변수가 2개인 함수형 인터페이스 - 매개변수의 타입과 반환타입이 일치하는 함수형 인터페이스 Predicate의 결합 - and()[&&], or()[||], negate()[!]로 두 Predicate를 하나로 결합 (default 메서드) - 등가비교를 위한 Predicate의 작성에는 isEqual()를 사용 (static 메서드) 컬렉션 프레임웍과 함수형 인터페이스 - 함수형 인터페이스를 사용하는 컬렉션 프레임웍의 메서드 (와일드 카드 생략) 메서드 참조 (method reference) - 하나의 메서드만 호출하는 람다식은 '메서드 참조'로 더 간단히 할 수 있음..

[자바의 정석 - 기초편] 14. (1) 람다식 Lambda Expression ( 작성 / 주의사항 / 함수형 인터페이스 )

람다식 (Lambda Expression) - 함수(메서드)를 간단한 '식(Expression)'으로 표현하는 방법 - 익명 함수 ➔ 이름이 없는 함수 (anonymous function) - 함수와 메서드의 차이 근본적으로는 동일 함수 = 일반적 용어 / 메서드 = 객체지향개념 용어 함수 = 클래스에 독립적 / 메서드 = 클래스에 종속적 람다식 작성하기 1. 메서드의 이름과 반환타입을 제거하고 ' -> '를 블록{} 앞에 추가한다 2. 반환값이 있는 경우, 식이나 값만 적고 return문 생략 가능 (끝에 ' ; ' 안붙임) 3. 매개변수의 타입이 추론 가능하면 생략 가능 람다식 작성시 주의사항 1. 매개변수가 하나인 경우, 괄호() 생략 가능 (타입이 없을 때만) 2. 블록 안의 문장이 하나뿐 일 때..

[자바의 정석 - 기초편] 13. (2) sleep() / interrupt() / suspend() / resume() / join() / yield() / 쓰레드의 동기 / wait() / notify()

sleep() - 현재 쓰레드를 지정된 시간동안 멈추게 함 static void sleep(long millis) // 천분의 일초 단위 static void sleep(long millis, int nanos) // 천분의 일초 + 나노초 - 예외처리를 해야함 (InterruptedException이 발생하면 깨어남) - 특정 쓰레드를 지정해서 멈추게 하는 것은 불가능 interrupt() - 대기상태(WAITING)인 쓰레드를 실행대기 상태(RUNNABLE)로 만듦 void interrupt() 쓰레드의 interrupted상태를 false에서 true로 변경 boolean isInterrupted() 쓰레드의 interrupted상태를 반환 static boolean interrupted() 현재 ..

[자바의 정석 - 기초편] 13. (1) 쓰레드 ( 구현 / 실행 / IO 블락킹 / 우선순위 / 그룹 / 데몬 쓰레드 / 상태 )

프로세스와 쓰레드 (process & thread) 프로세스 : 실행 중인 프로그램, 자원(resources)과 쓰레드로 구성 쓰레드 : 프로세스 내에서 실제 작업을 수행 모든 프로세스는 최소한 하나의 쓰레드를 갖고 있음 프로세스 : 쓰레드 = 공장 : 일꾼 하나의 새로운 프로세스 생성하는 것보다 하나의 새로운 쓰레드를 생성하는 것이 좋음 싱글 쓰레드 프로세스 = 자원 + 쓰레드 멀티 쓰레드 프로세스 = 자원 + 쓰레드 + 쓰레드 + ... + 쓰레드 멀티쓰레드의 장단점 장점 1. 자원을 보다 효율적으로 사용 가능 2. 사용자에 대한 응답성(responseness)이 향상됨 3. 작업이 분리되어 코드가 간결해짐 단점 1. 동기화에 주의해야 함 2. 교착상태가 발생하지 않도록 주의해야 함 3. 각 쓰레드가..

[자바의 정석 - 기초편] 12. (4) 애너테이션 ( 표준 / 메타 / 타입 / 요소 / 규칙 )

애너테이션 주석처럼 프로그래밍 언어에 영향을 미치지 않으며 유용한 정보를 제공 Java에서 제공하는 애너테이션 표준 애너테이션 @Override - 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 함 - 오버라이딩 할 때 메서드 이름 잘못 적는 실수를 하는 경우가 많음 ➔ 메서드 앞에 @Override 붙이기 @Deprecated - 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙임 @FunctionalInterface - 함수형 인터페이스에 붙이면 컴파일러가 올바르게 작성했는지 체크 ( 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있음 )\ @SuppressWarnings - 컴파일러의 경고메시지가 나타나지 않게 억제함 - 괄호 안에 억제하고자하는 경고의 종류를 문자열로 지정 ..

[자바의 정석 - 기초편] 12. (3) 열거형 enum ( 조상 / 멤버 추가 )

열거형 (enum) 관련된 상수들을 같이 묶어 놓은 것. Java는 타입에 안전한 열거형을 제공 열거형 정의 enum 열거형이름 { 상수명1, 상수명2, ... } 열거형 변수 선언과 사용 class Unit { int x, y; // 유닛의 위치 Direction dir; // 열거형 인스턴스 변수를 선언 void init() { dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화 } } 열거형 상수의 비교에 == 와 compareTo() 사용 if(dir == Direction.EAST) { x++; } else if (dir > Direction.WEST) { // 에러. 열거형 상수에 비교 연산자 사용불가 ... } else if (dir.compareTo(Directio..