Optional의 ifPresent 메서드와 Consumer

연어는결국강으로·2023년 5월 3일
0

자바 공부

목록 보기
1/6

처음에는 코드 리팩토링을 하고 있었는데 이런 방법이 있는걸 배우게 되었다.

Optional을 쓰다가 이런 식을 알게 되었다.
이거는 여기 aprvStatusParam이 Otional 객체인데, 얘가 null이 아니면 이 값을 setAprvstatus에 넣어줘~~ 이런걸 하고 싶었다.

처음엔 이렇게 했다.

if (aprvStatusParam.isPresent()) {
	listParam.setAprvStatus(aprvStatusParam);
}

음.. if 문이 맘에 안들었다. 이거 없앨 수는 없나? 조잡해보이는데 말이지. 그때 인텔리제이 추천에 아래와 같은 코드가 떳다.

aprvStatusParam.ifPresent(listParam::setAprvStatus);

바로 optional에서 ifPresent라는 메서드를 제공해주는 것이었다. 내용은 있으면 ~~ 해줘~~ 라는거겠지? 근데 뭐 클래스도 아니고 메서드가 들어간건가? 내가 아는 자바인가? 좀 더 자세히 들여다봤다.

아 이렇게 생겼구나. 근데 저 Consumer는 뭐지? 저 Consumer가 함수를 넣어도 되게 하는 장치인가?

아몰랑~~ 영어 한가득이양~~ 검색을 열심히 해봤다. 정리해보면 이렇다.

일단 listParam::setAprvStatus는 메서드 레퍼런스(Method Reference)로, Consumer 함수형 인터페이스의 accept 메서드의 매개변수로 사용될 메서드를 지정하는 방법 중 하나다.

그럼 Consumer는 뭘까?
Consumer는 함수형 인터페이스(Functional Interface) 중 하나로, 인자로 전달된 객체를 소비(consume)하는 메서드를 정의하고 있다. Consumer는 제네릭 타입을 사용하여 소비해야 하는 객체의 타입을 지정할 수 있다.

Consumer 인터페이스는 java.util.function 패키지에 포함되어 있으며, 자바 8에서 추가되었다. Consumer 인터페이스는 함수형 프로그래밍 스타일에서 많이 사용되며, 스트림(stream) 연산 등에서도 사용된다.

Consumer 인터페이스의 주요 메서드는 accept(T t) 메서드다. accept(T t) 메서드는 인자로 전달된 객체를 소비하도록 정의되어 있다. accept 메서드는 리턴값이 없기 때문에, 보통 void 타입을 반환한다.

@FunctionalInterface 어노테이션은 함수형 인터페이스임을 나타내는 어노테이션이다. 함수형 인터페이스는 하나의 추상 메서드만을 가지는 인터페이스를 말하며, 람다식과 같은 함수형 프로그래밍 기법을 사용할 수 있게 해준다. Consumer 인터페이스는 하나의 추상 메서드만을 가지기 때문에, @FunctionalInterface 어노테이션을 사용할 수 있다.

약간 디파일러의 컨숨이 생각나는 설명인데 여튼 그렇다. 더 깊숙히 들어가고 싶지만 시간 관계상 여기까지만 정리한다.

0개의 댓글