1. 메소드 참조란?
자바 메소드 참조(Method Reference)는 자바 8부터 도입된 기능으로, 람다 표현식을 더 간결하게 표현할 수 있게 해주는 문법적인 도구이다. 메소드 참조를 사용하면 불필요한 코드를 줄이고 가독성을 향상시킬 수 있다.
메소드 참조는 주로 함수형 인터페이스(Functional Interface)와 함께 사용되며, 람다 표현식으로 실행할 메소드를 직접 지정하는 대신 해당 메소드의 참조를 전달하여 사용하는 것이다. 이는 특히 메소드가 이미 정의되어 있는 경우 유용하며, 코드의 재사용성을 높일 수 있다.
2. 메소드 참조 유형
1) 정적 메소드 참조(Static Method Reference)
클래스의 정적(static) 메소드를 참조하며, 참조 형식은 ClassName::staticMethodName이다.
Ex> Integer 클래스의 정적 메소드인 parseInt을 참조하는 경우
Function<String, Integer> parseFunction = Integer::parseInt;
Integer result = parseFunction.apply("123"); // 결과: 123
2) 인스턴스 메소드 참조(Instance Method Reference)
특정 객체의 인스턴스 메소드를 참조하며, 참조 형식은 instance::instanceMethodName이다.
Ex> 문자열 객체의 length 메소드를 참조하는 경우
String str = "Hello";
Supplier<Integer> lengthSupplier = str::length;
int length = lengthSupplier.get(); // 결과:
3) 특정 객체의 인스턴스 메소드 참조(Bound Instance Method Reference)
특정 객체의 인스턴스 메소드를 참조하며, 참조 형식은 instance::instanceMethodName이다. 메소드 참조가 호출될 때 특정 객체가 메소드의 수신자(Receiver)로 사용된다.
Ex> 리스트의 size 메소드를 참조하는 경우
List<String> list = Arrays.asList("a", "b", "c");
Supplier<Integer> sizeSupplier = list::size;
int size = sizeSupplier.get(); // 결과: 3
4) 클래스의 인스턴스 메소드 참조(Unbound Instance Method Reference)
클래스 이름을 통해 인스턴스 메소드를 참조하며, 참조 형식은 ClassName::instanceMethodName이다. 메소드가 호출될 때 인자로 객체가 전달된다.
Ex> 문자열들을 비교하는 compareTo 메소드를 참조하는 경우
Comparator<String> comparator = String::compareTo;
int result = comparator.compare("apple", "banana"); // 결과: 음수 값
5) 생성자 참조(Constructor Reference)
클래스의 생성자를 참조하며, 참조 형식은 ClassName::new이다. 함수형 인터페이스의 추상 메소드와 호환되는 생성자를 호출할 수 있다.
Ex> Person 클래스의 생성자를 참조하는 경우
Function<String, Person> personConstructor = Person::new;
Person person = personConstructor.apply("Alice"); // Person 객체 생
3. 함수형 인터페이스
1) Predicate<T>
Predicate는 하나의 인자를 받아서 참 또는 거짓 값을 반환하는 함수형 인터페이스이다. 주로 조건을 검사할 때 사용된다. 인터페이스에는 test(T t) 메서드가 선언되어 있으며, 이 메서드는 입력 값을 받아서 조건을 만족하면 true, 만족하지 않으면 false를 반환한다.
예시 코드> 정수를 받아서 해당 정수가 짝수인지 검사하는 Predicate
Predicate<Integer> isEven = num -> num % 2 == 0;
System.out.println(isEven.test(4)); // true
System.out.println(isEven.test(5)); // false
2) Supplier<T>
Supplier는 인자를 받지 않고 결과만 반환하는 함수형 인터페이스이다. 주로 데이터를 생성하거나 초기화할 때 사용된다. 인터페이스에는 get() 메서드가 선언되어 있으며, 이 메서드는 결과 값을 계산하고 반환한다.
예시 코드> 랜덤한 정수를 생성하는 Supplier
Supplier<Integer> randomIntSupplier = () -> (int) (Math.random() * 100);
int randomValue = randomIntSupplier.get();
System.out.println(randomValue); // 랜덤한 정수 출력
3) Consumer<T>
Consumer는 하나의 인자를 받고 결과를 반환하지 않는 함수형 인터페이스이다. 주로 인자로 받은 데이터를 소비하고 처리하는 용도로 사용된다. 인터페이스에는 accept(T t) 메서드가 선언되어 있으며, 이 메서드는 입력 값을 받아서 처리한다.
예시 코드> 문자열을 받아서 그 문자열을 출력하는 Consumer
Consumer<String> printString = str -> System.out.println(str);
printString.accept("Hello, World!"); // "Hello, World!" 출력
4) Function<T, R>
Function은 하나의 인자를 받아서 다른 타입의 결과를 반환하는 함수형 인터페이스이다. 주로 데이터 변환 또는 매핑에 사용된다. 인터페이스에는 apply(T t) 메서드가 선언되어 있으며, 이 메서드는 입력 값을 받아서 변환하여 결과를 반환한다.
예시 코드> 문자열을 정수로 변환하는 Function
Function<String, Integer> stringToInt = str -> Integer.parseInt(str);
int number = stringToInt.apply("123");
System.out.println(number); // 123 출력
4. Optional 클래스란?
java.util.Optional은 자바 8부터 도입된 클래스로, 값이 있을 수도 있고 없을 수도 있는(Nullable) 값을 감싸는 래퍼 클래스이다. 이를 통해 NullPointerException을 방지하고, 좀 더 명시적으로 값의 존재 여부를 다룰 수 있다.
5. Optional 클래스 특징
1) 값의 존재 여부 표현
Optional은 값이 존재하는 경우 해당 값을 감싸고, 값이 없는 경우에는 empty 상태를 나타내는 객체를 생성한다.
2) Null 대신 사용
Optional은 값을 감싸기 때문에 null 값을 직접 다루지 않고, 값의 존재 여부만 확인할 수 있다.
3) Null Pointer 예방
Optional을 사용하면 값이 없는 경우에도 NullPointerException을 피할 수 있다.
4) 메소드 체이닝
Optional은 메소드 체이닝을 통해 연속적으로 값을 처리할 수 있는 메소드들을 제공한다.
6. Optional 클래스 주요 메소드
- Optional.of(value)
주어진 값으로 Optional 객체를 생성한다. 만약 값이 null이라면 NullPointerException이 발생한다.
- Optional.ofNullable(value)
주어진 값으로 Optional 객체를 생성하되, 값이 null이면 비어있는 Optional 객체를 반환한다.
- Optional.empty()
비어있는 Optional 객체를 생성한다.
- isPresent()
값이 존재하는지 여부를 반환한다.
- ifPresent(consumer)
값이 존재할 경우, 주어진 Consumer를 실행한다.
- orElse(defaultValue)
값이 존재하지 않을 경우 주어진 기본값을 반환한다.
- orElseGet(supplier)
값이 존재하지 않을 경우, 주어진 Supplier의 결과값을 반환한다.
- orElseThrow(exceptionSupplier)
값이 존재하지 않을 경우, 주어진 예외를 발생시킨다.
- map(function)
값이 존재할 경우 주어진 함수를 적용한 결과값을 포함하는 새로운 Optional을 반환한다.
- flatMap(function)
값이 존재할 경우 주어진 함수를 적용한 결과로 얻은 Optional을 반환한다.
'자바(Java)' 카테고리의 다른 글
Java - 엑셀 업로드 후 DB 저장 (0) | 2023.08.25 |
---|---|
Java - Stream (0) | 2023.08.17 |
Java - 람다식 (0) | 2023.08.11 |
Java Collection - 2 (0) | 2023.07.19 |
Java Collection - 1 (0) | 2023.07.19 |