1. Java 8에 추가 및 변경된 주요 리스트
1) Lamda 표현식
2) Functional 인터페이스 (함수형 인터페이스)
3) Stream
4) Optional
5) 인터페이스의 기본 메서드 (Default method)
6) 날짜 관련 클래스들 추가
7) 병렬 배열 정렬
8) StringJoiner 추가
10) 스트림 기반 I/O(NIO.2)
2. Lamda 표현식
- 람다 표현식(lambda expression)이란 간단히 말해 메소드를 하나의 식으로 표현한 것이다.
- 즉, 식별자 없이 실행할 수 있는 함수 표현식을 의미하며, 따라서 익명 함수(anonymous function)라고도 부른다.
- 메소드를 이렇게 람다 표현식으로 표현하면 클래스를 만들고 객체를 생성하지 않아도 메소드를 사용할 수 있다.
- 람다 표현식은 메소드의 매개변수로 전달될 수도 있고, 메소드의 결괏값으로 반환될 수도 있다.
- 람다 표현식은 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높이는 데 그 목적이 있다.
- 람다 표현식을 사용하여 자바에서도 함수형 프로그래밍을 할 수 있다.
import java.util.ArrayList;
import java.util.List;
public class LambdaExample {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");
// 람다식을 사용하여 리스트의 요소 출력
names.forEach(name -> System.out.println(name));
}
}
3. Functional 인터페이스 (함수형 인터페이스)
- 함수형 프로그래밍을 지원하기 위해 java.util.function 패키지에 다양한 함수형 인터페이스가 추가되었다.
- 인터페이스들은 람다 식을 사용하여 구현할 수 있는 단일 추상 메서드를 가지고 있어 함수를 객체처럼 전달하고 조합하는 데 유용하다.
주요 함수형 인터페이스
Consumer<T>: 값을 받아서 소비(출력, 변경 등)하는 함수
Supplier<T>: 값을 생성하거나 공급하는 함수
Function<T, R>: 값을 변환하여 결과 값을 반환하는 함수
Predicate<T>: 주어진 조건에 따라 참 또는 거짓을 반환하는 함수
4. Stream(스트림)
-연속된 정보를 처리하기 위해 사용하는 클래스라고 볼 수 있다.
- 순차적으로 데이터를 처리한다.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 중간 연산: 2로 나눈 짝수만 선택하고, 그 값에 10을 더함
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n + 10)
.collect(Collectors.toList());
System.out.println(result); // [12, 14, 16, 18, 20]
}
}
5. Optional(옵셔널)
- 객체를 편리하게 처리하기 위해 만든 클래스
- 주로 값이 없을 수 있는 상황에서 사용한다.
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
String value = "Hello, Optional!";
// 값이 있는 경우
Optional<String> optionalValue = Optional.of(value);
System.out.println(optionalValue.isPresent()); // true
System.out.println(optionalValue.get()); // Hello, Optional!
// 값이 없는 경우
Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.isPresent()); // false
// 값이 있는지 확인하고 값이 없으면 기본값을 반환
String result = optionalValue.orElse("Default Value");
System.out.println(result); // Hello, Optional!
}
}
6. 인터페이스의 기본 메소드 (Default method)
- 기존에는 인터페이스에 메서드를 추가할 때 해당 인터페이스를 구현하는 모든 클래스에서 새로운 메서드를
구현했어야했다. 디폴트 메서드를 사용하여 이러한 문제를 해결할 수 있다.
1. 구현이 가능한 메서드: 디폴트 메서드는 인터페이스 안에서 메서드의 구현을 제공할 수 있다.
디폴트 메서드를 구현한 경우, 해당 메서드를 구현하지 않아도 인터페이스를 구현하는 클래스에서는 디폴트 메서드를 사용할 수 있다.
2. 메서드 오버라이딩 가능: 인터페이스를 구현하는 클래스에서 디폴트 메서드를 필요에 따라 오버라이딩하여 재정의할 수 있다.
3. 명시적 호출 가능: 인터페이스를 구현한 객체에서 디폴트 메서드를 직접 호출할 수 있다.
4. 다중 상속 문제 해결: 여러 인터페이스를 구현하는 클래스에서 같은 시그니처를 가진 디폴트 메서드가 있는 경우, 해당 메서드를 오버라이딩하여 충돌을 해결해야 한다.
- 'default' 키워드를 사용하여 구현함.
public interface MyInterface {
void normalMethod(); // 일반 메서드 선언
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
7. 날짜 관련 클래스들 추가
- java.util.Date 및 java.util.Calendar 클래스보다 훨씬 향상된 날짜와 시간 처리 기능을 제공하는 날짜 관련 클래스가 추가 됐다.
1. LocalDate: 날짜 정보만을 담는 클래스로, 연, 월, 일 정보를 다룰 때 사용한다.
2. LocalTime: 시간 정보만을 담는 클래스로, 시, 분, 초, 밀리초 정보를 다룰 때 사용한다.
3. LocalDateTime: 날짜와 시간 정보를 모두 담는 클래스로, LocalDate와 LocalTime을 조합하여 사용할 수 있다.
4. Instant: 에포크 타임(1970년 1월 1일 00:00:00 UTC)부터의 시간 간격을 표현하는 클래스로, 특정 시점의 타임스탬프를 나타낸다.
5. Duration: 시간 간격을 나타내는 클래스로, 초와 나노초 단위로 시간 간격을 다룰 수 있다.
6. Period: 날짜 간격을 나타내는 클래스로, 연, 월, 일 단위로 날짜 간격을 다룰 수 있다.
7. ZoneId: 시간대 정보를 나타내는 클래스로, 시간대에 따른 날짜와 시간을 다룰 수 있다.
8. ZonedDateTime: 특정 시간대를 고려한 날짜와 시간 정보를 담는 클래스로, LocalDateTime과 ZoneId를 조합하여 사용할 수 있다.
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.time.Instant;
import java.time.Duration;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZonedDateTime;
public class DateTimeExample {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now();
LocalDateTime dateTime = LocalDateTime.now();
Instant instant = Instant.now();
Duration duration = Duration.ofMinutes(30);
Period period = Period.ofDays(3);
ZoneId zone = ZoneId.of("America/New_York");
ZonedDateTime zonedDateTime = ZonedDateTime.of(dateTime, zone);
System.out.println("Date: " + date);
System.out.println("Time: " + time);
System.out.println("Date Time: " + dateTime);
System.out.println("Instant: " + instant);
System.out.println("Duration: " + duration);
System.out.println("Period: " + period);
System.out.println("Zoned Date Time: " + zonedDateTime);
}
}
8. 병렬 배열 정렬
- Arrays 클래스의 parallelSort 메서드를 통해 병렬 배열 정렬 기능이 추가됐다.
- 배열을 여러 스레드를 이용하여 병렬적으로 정렬하는 기능을 제공하여 배열 정렬의 성능을 향상시킬 수 있게 한다.
import java.util.Arrays;
public class ParallelSortExample {
public static void main(String[] args) {
int[] arr = {5, 2, 8, 1, 3, 7, 4, 6};
Arrays.parallelSort(arr); // 배열을 병렬로 정렬
System.out.println(Arrays.toString(arr)); // 정렬된 배열 출력
}
}
9. StringJoiner 추가
- 문자열들을 특정 구분자로 구분하여 결합할 때 유용하게 사용한다.
- StringJoiner를 사용하면 반복문이나 조건문 없이도 간단하게 문자열을 결합할 수 있다.
주요 메서드
1. add(String element): 문자열 추가
2. merge(StringJoiner other): 다른 StringJoiner 객체의 문자열을 현재 객체에 병합
3. toString(): 현재까지 추가된 문자열을 구분자로 결합하여 반환
import java.util.StringJoiner;
public class StringJoinerExample {
public static void main(String[] args) {
StringJoiner joiner = new StringJoiner(", "); // 구분자는 ", "
joiner.add("Apple");
joiner.add("Banana");
joiner.add("Orange");
String result = joiner.toString(); // "Apple, Banana, Orange"
System.out.println(result);
}
}
10. 스트림 기반 I/O(NIO.2)
- NIO.2는 파일 및 디렉토리를 nio 보다 쉽고 편하게 다룰 수 있도록 하는 API이다.
- 이 API를 사용하면 파일 입출력 및 디렉토리 조작 작업을 효율적으로 사용할 수 있다.
주요 클래스
1. Path: 파일 및 디렉토리의 경로를 나타내는 클래스다. java.nio.file.Path 인터페이스를 사용하여 경로를 다룰 수 있다.
2. Files: 파일의 생성, 복사, 삭제, 이동, 읽기, 쓰기 등의 작업을 수행하는 메서드이다. java.nio.file.Files 클래스를 사용한다.
3. Paths: Path 객체를 생성하기 위한 유틸리티 메서드를 제공한다. java.nio.file.Paths 클래스를 사용한다.
4. StandardOpenOption: 파일을 열 때 사용할 옵션을 지정할 수 있는 열거형 클래스다. 파일을 읽기, 쓰기, 생성할 때 옵션을 지정할 수 있다.
5. FileVisitor: 디렉토리를 탐색하고 파일 및 디렉토리에 대한 작업을 수행하는데 사용되는 인터페이스다.
import java.nio.file.*;
public class NIO2Example {
public static void main(String[] args) throws Exception {
// 파일 경로 생성
Path path = Paths.get("example.txt");
// 파일 생성
Files.createFile(path);
// 파일 쓰기
String content = "Hello, NIO.2!";
Files.write(path, content.getBytes());
// 파일 읽기
byte[] data = Files.readAllBytes(path);
String readContent = new String(data);
System.out.println("Read from file: " + readContent);
// 파일 삭제
Files.delete(path);
}
}
'자바' 카테고리의 다른 글
자바 DAO, DTO, Repository (0) | 2023.10.24 |
---|---|
자바 Wrapper (0) | 2023.07.31 |
자바 캐시 알고리즘 (0) | 2023.07.30 |
자바 concurrent 패키지 (0) | 2023.07.30 |
자바 UDP통신 (0) | 2023.07.29 |