쿠릉쿠릉 쾅쾅
쿠릉쿠릉 쾅쾅
쿠릉쿠릉 쾅쾅
250x250
전체 방문자
오늘
어제
  • 분류 전체보기
    • HTML CSS
    • 잡담
    • 프로그래밍 꿀팁 사이트
    • 코딩 도서
    • [자바]
      • 디자인 패턴
      • 자바의 정석 - 3판
      • 자바
      • 자바 문법
    • git
    • [TDD]
    • 개발 서적 독후감
      • 클린 코더
      • 토비 스프링3
      • 객체지향의 사실과 오해
      • 모던 자바 인 액션
      • 엘레강트 오브젝트
    • CS
      • 운영체제
      • HTTP
    • [SQL]
      • SQL 기초
      • 혼자공부하는SQL
    • [ Spring ]
      • REST API
      • Spring Toy
      • Spring 에러
      • Spring
      • Spring 입문
      • Spring 핵심 원리
      • SpringMVC 1편
      • SpringMVC 2편
      • Spring Boot를 이용한 RESTful We..
      • Batch
    • [JPA]
      • JPA
      • JPA 에러
      • JPA 프로그래밍 - 기본편
      • 스프링 부트와 JPA 활용 1 - 웹 애플리케이..
      • 실전! 스프링 부트와 JPA 활용2 - API 개..
      • 실전! 스프링 데이터 JPA
      • 실전! Querydsl
    • 인텔리제이
    • [DB]
      • DB
      • H2
    • Gradle
    • 면접
    • [알고리즘]
      • 알고리즘
      • 자료구조
      • 자바 알고리즘 공부
    • [프로젝트]
    • 쿠릉식 객체지향 사고
    • 리눅스

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자료구조
  • Spring
  • 자바
  • 깃허브
  • springboot
  • MVC
  • 알고리즘
  • 재귀
  • 백준
  • 함수형인터페이스
  • GitHub
  • JPA
  • 스프링
  • SQL
  • java
  • Git
  • http
  • querydsl
  • REST API
  • 스프링부트

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쿠릉쿠릉 쾅쾅

쿠릉쿠릉 쾅쾅

[Java] Optional<T> 클래스
[자바]/자바

[Java] Optional<T> 클래스

2022. 2. 7. 14:11
728x90

 

Optional<T> 클래스

  • Optional<T>는 제네릭 클래스로 T타입의 객체를 감싸는 래퍼 클래스다.
  • Optional 타입의 객체에는 모든 타입의 참조변수를 담을 수 있다.
  • Optional<T>에 객체를 담아서 반환하면 반환된 결과가 null인지 아닌지 매번 if문으로 검사하지 않아도 Optional 클래스에 정의된 메서드를 통해서 간단히 처리할 수 있다.
  • 간접적으로 null 값을 다룰 수 있다.

 

🔍 Optional<T> 객체 생성

💡 of()

  • 참조변수의 값이 null일 경우 NullPointerExcpetion 예외가 발생한다.

 

예제

String str = "abc";

Optional<String> optVal1 = Optional.of(str);
Optional<String> optVal2 = Optional.of("abc");
Optional<String> optVal3 = Optional.of(new String("abc"));

 

 

💡 ofNullable()

  • 참조변수의 값이 null 값이 들어와도 NullPointerExcpetion 예외가 발생하지 않는다.

 

예제

String str = "abc";

Optional<String> optVal1 = Optional.ofNullable(str);
Optional<String> optVal2 = Optional.ofNullable("abc");
Optional<String> optVal3 = Optional.ofNullable(null);  // null값 허용

 

 

💡 Optional<T> 초기화

  • Optional<T> 타입의 참조변수를 기본값으로 초기화할 때는 empty() 메서드를 사용한다.
  • null로 초기화할 수 있지만, empty() 메서드로 초기화하는 것이 좋다.

 

예제

/* ex.1 null 값으로 초기화 (비추) */
Optional<String> optVal1 = null;  // null로 초기화


/* ex.2 empty() 메서드로 초기화 (권장O) */
Optional<String> optVal2 = Optional.<String>empty();  // 빈 객체로 초기화


/* ex.3 empty() 메서드로 초기화 (권장O, 제네릭 생략) */
Optional<String> optVal3 = Optional.empty(); // 제네릭 생략 가능
  • empty() 메서드는 제네릭 메서드라서 참조타입에 제네릭이 있을 경우 생략 가능하다.

 

 

 

🔍 Optional<T> 객체 값 가져오기

💡 get()

T get()
  • Optional 객체에 저장된 값을 가져올 때 사용한다.
  • 저장된 값이 null 일 경우 NoSuchElementException 예외가 발생한다.
  • 자주 안쓰인다.

 

예제

Optional<String> optVal = Optional.ofNullable("abc");

String str = optVal.get();  // optVal에 저장된 값 반환

 

 

💡 orElse()

T orElse(T other)
  • Optional 객체에 저장된 값을 가져올 때 사용한다.
  • 저장된 값이 null 일 경우 파라미터 값이 반환이 된다.
  • 자주 쓰인다.

 

예제

/* ex.1 */
Optional<String> optVal = Optional.ofNullable("abc");

String str = optVal.orElse("");  // optVal에 저장된 값 반환


/* ex.2 */
Optional<String> optVal = Optional.ofNullable(null);

String str = optVal.orElse("");  //  "" 값 반환

 

 

 

💡 orElseGet()

T orElseGet(Supplier<? extend T> other)
  • Optional 객체에 저장된 값을 가져올 때 사용한다.
  • orElse() 메서드의 변형으로 저장된 값이 null 일 경우 예외가 발생하지 않으며, 람다식으로 대체할 값을 반환한다.
  • 자주 쓰인다.

 

예제

/* ex.1 */
Optional<String> optVal = Optional.ofNullable("abc");

String str = optVal.orElseGet(String::new);  // optVal에 저장된 값 반환


/* ex.2 */
Optional<String> optVal = Optional.ofNullable(null);

String str = optVal.orElseGet(String::new);  // String 객체 반환

 

 

💡 orElseThrow()

T orElseThrow(Supplier<? extend T> exceptionSupplier)
  • Optional 객체에 저장된 값을 가져올 때 사용한다.
  • 저장된 값이 null 일 경우 지정된 예외를 발생하도록 람다식으로 지정할 수 있다.

 

예제

/* ex.1 */
Optional<String> optVal = Optional.ofNullable("abc");

String str = 
    optVal.orElseThrow(NullPointerException::new);  // optVal에 저장된 값 반환


/* ex.2 */
Optional<String> optVal = Optional.ofNullable(null);

String str = 
    optVal.orElseThrow(NullPointerException::new);  // NullPointerException 예외 발생

 

 

💡 isPresent()

boolean isPresent()
  • Optional 객체의 값이 null이면 false 를 반환하고 아니면 true를 반환한다.

 

예제

String str = "abc";

if(Optional.ofNullable(str).isPresent()) {
    System.out.println(str);
}

 

 

💡 ifPresent(Consumer<? super T> consumer)

void ifPresent(Consumer<? super T> consumer)
  • Optional 객체에 값이 null이 아닐 경우 파라미터의 람다식이 실행되고, null일 경우 아무것도 실행되지 않는다.

 

예제

String str = null;
Optional.ofNullable(str).ifPresent(System.out::println);

 

✔ 참고

  • ifPresent() 메서드는 Stream 클래스에서 Optional<T>를 반환하는 최종 연산과 잘 어울린다.
  • Stream 클래스에서 Optional<T>를 반환하는 메서드 목록
    • Optional<T> findAny()
    • Optional<T> findFirst()
    • Optional<T> max(Comparator<? super T> comparator)
    • Optional<T> min(Comparator<? super T> comparator)
    • Optional<T> reduce(BinaryOperator<T> accumulator)

 

 

🔍 Optional<T> 클래스의 중간 처리  작업

💡 map(Function<? super T, ? extends U> mapper)

<U> Optional<U> map(Function<? super T, ? extends U> mapper)
  • 입력값을 다른 값으로 변환하는 메서드다.
  • map() 메서드는 apply 메서드가 반환하는 대상을 Optional 인스턴스에 담아서 반환한다.
  • Optional에 저장된 값을 꺼내서 파라미터 값인 람다식으로 작업한 후 다시 Optional에 담아서 반환한다.

 

더보기
더보기

예제1

import java.util.Optional;

public  class Prac {	
    public static void main (String[] args) { 
    	
    	Optional<String> os1 = Optional.of("Optional String");
    	Optional<String> os2 = os1.map(String::toUpperCase);
    	System.out.println(os2.orElse(""));
    	
    	Optional<String> os3 = os1.map(s -> s.replace(' ', '_'))
    			.map(String::toLowerCase);
    	System.out.println(os3.orElse(""));
    	
	}
	
}
OPTIONAL STRING
optional_string

 

 

💡 flatMap(Function<? super T, Optional U> mapper)

<U> Optional<U> flatMap(Function<? super T, Optional U> mapper)
  • 입력값을 다른 값으로 변환하는 메서드다.
  • 파라미터의 인스턴스가 Optinal에 저장된 객체이며 그 객체 안에 멤버변수도 Optional로 되어 있을 경우 사용한다.
  • flatMap() 메서드는 Optional에 저장된 값을 파라미터 값인 람다식으로 작업을 한 후 Optional에 담지 않고 값을 그대로 반환한다.

 

더보기
더보기
import java.util.Optional;

public  class Prac {	
    public static void main (String[] args) { 
    	Optional<ContInfo> ci = 
    			Optional.of(new ContInfo(Optional.ofNullable(null), Optional.of("Republic of Korea")));
    	
    	String phone = ci.flatMap(ContInfo::getPhone).orElse("There is no phone number");
    	
    	String addr = ci.flatMap(ContInfo::getAdrs).orElse("There is no address");
    	
    	System.out.println(phone);
    	System.out.println(addr);
    	
	}
	
}

class ContInfo {
	Optional<String> phone;
	Optional<String> adrs;
	
	public ContInfo(Optional<String> ph, Optional<String> ad) {
		phone = ph;
		adrs = ad;
	}
	
	public Optional<String> getPhone() {return phone;}
	public Optional<String> getAdrs() {return adrs;}
}
There is no phone number
Republic of Korea

 

 

💡 filter(Predicate<? super T> predicate)

Optional<T> filter(Predicate<? super T> predicate)
  • filter() 메서드는 Optional 내부의 객체가 Predicate 조건에 부합하면 이 객체를 포함한 Optional 객체가 반환이 된다. 그렇지 않으면 Empty(빈) Optional 객체가 리턴이 된다.

 

더보기
더보기

예제1

import java.util.Optional;

public  class Prac {	
    public static void main (String[] args) { 
    	
    	Optional<String> opStr1 = Optional.of("first string");
    	Optional<String> opStr2 = Optional.of("second string");
    	
    	Optional<String> f1 = opStr1.filter(s -> s.contains("first"));
    	Optional<String> f2 = opStr2.filter(s -> s.contains("first"));
    	
    	f1.ifPresent(System.out::println);
    	f2.ifPresent(System.out::println);
    	
	}
	
}
first string

 

 

 

 

 

OptionalInt 클래스, OptionalLong 클래스, OptionalDouble 클래스

  • 기본형을 값으로하는 Optional 클래스다.
Optional 클래스 값을 반환하는 메서드
Optional<T> T get()
OptionalInt int getAsInt()
OptionalLong long getAsLong()
OptionalDouble double getAsDouble()

 

💡 참고

  • 기본형 Optional 클래스에서 empty optional 과 기본형 타입의 기본값과 다르다.
OptionalInt opt1 = OptionalInt.of(0);  // OptionalInt에 0을 저장
OptionalInt opt2 = OptionalInt.empty();  // OptionalInt에 0을 저장

System

 

더보기
더보기

예제1

import java.util.OptionalInt;

public  class Prac {	
    public static void main (String[] args) { 
    	
    	OptionalInt opt1 = OptionalInt.of(0);  // OptionalInt에 0을 저장
    	OptionalInt opt2 = OptionalInt.empty();  // OptionalInt에 0을 저장
    	
    	System.out.println(opt1.isPresent());  // true
    	System.out.println(opt2.isPresent());  // false
    	
    	System.out.println(opt1.getAsInt());  // 0
//    	System.out.println(opt2.getAsInt());  // NoSuchElementExcpetion 예외 발생
    	
    	System.out.println(opt1.equals(opt2));  // false
	}
	
}
true
false
0
false
  • OptionalInt에 저장된 값이 '0'인 것과 없는 것은 구별 가능하다.

 

 

 

 

728x90

'[자바] > 자바' 카테고리의 다른 글

[자바] 자바 코드 스타일 컨벤션  (0) 2022.05.14
[자바] JVM이란?  (0) 2022.05.06
[Java] 메서드 참조 (Method References)  (0) 2022.02.04
[Java] 함수형 인터페이스  (0) 2022.02.03
[Java] 내부 클래스, 네스티드(Nested) 클래스, 익명 클래스  (0) 2022.01.27
    '[자바]/자바' 카테고리의 다른 글
    • [자바] 자바 코드 스타일 컨벤션
    • [자바] JVM이란?
    • [Java] 메서드 참조 (Method References)
    • [Java] 함수형 인터페이스
    쿠릉쿠릉 쾅쾅
    쿠릉쿠릉 쾅쾅
    깃허브 주소 : https://github.com/kureung

    티스토리툴바