반응형
Optional은 NullPointerException(NPE) 즉 null 값으로 인해 에러가 발생하는 현상을 객체 차원에서 효율적으로 방지하고자 도입되었다.
Optional
Optional 클래스는 모든 타입의 객체를 담을 수 있는 래퍼(Wrapper) 클래스이다.
public final class Optional<T> {
private final T value; // T타입의 참조변수
}
Optional 객체를 생성하려면 of() 또는 ofNullable()을 사용한다. 참조변수의 값이 null 일 가능성이 있다면 ofNullable() 을 사용한다.
Optional<String> opt1 = Optional.ofNullable(null);
Optional<String> opt2 = Optional.ofNullable("123");
System.out.println(opt1.isPresent()); //Optional 객체의 값이 null인지 아닌지를 리턴합니다.
System.out.println(opt2.isPresent());
Optional 타입의 참조변수를 기본값으로 초기화하려면 empty() 메서드를 사용한다.
Optional<String> opt3 = Optional.<String>empty();
Optional 객체에 객체에 저장된 값을 가져오려면 get()을 사용한다. 참조변수의 값이 null일 가능성이 있다면 orElse()메서드를 사용해 디폴트 값을 지정할 수 있다.
Optional<String> optString = Optional.of("codestates");
System.out.println(optString);
System.out.println(optString.get());
String nullName = null;
String name = Optional.ofNullable(nullName).orElse("kimcoding");
System.out.println(name);
Optional 객체는 스트림과 유사하게 여러 메서드를 연결해서 작성할 수 있다.
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
List<String> languages = Arrays.asList(
"Ruby", "Python", "Java", "Go", "Kotlin");
Optional<List<String>> listOptional = Optional.of(languages);
int size = listOptional
.map(List::size)
.orElse(0);
System.out.println(size);
}
}
반응형
심화학습 - Optional 객체 활용법 탐구
//CarClub.java
package com.codestates.optional;
public class CarClub {
public static void main(String[] args) {
MemberService memberService = new MemberService();
String insuranceName =
memberService
.getMember("kevin1234")
.flatMap(Member::getCar)
.flatMap(Car::getInsurance)
.map(Insurance::getCompanyName)
.orElse("Not result");
}
}
//MemberService.java
package com.codestates.optional;
import java.util.Optional;
public class MemberService {
public Optional<Member> getMember(String id) {
Optional<Insurance> insurance = Optional.of(new Insurance("Samsung direct"));
Optional<Car> car = Optional.of(new Car("XC-60", 60_000_000, insurance));
return Optional.of(new Member("Kevin", "kevin1234", car));
}
}
//Member.java
package com.codestates.optional;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Optional;
@Getter
@AllArgsConstructor
public class Member {
String name;
String id;
Optional<Car> car;
}
//Insurance.java
package com.codestates.optional;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public class Insurance {
String companyName;
}
//Car.java
package com.codestates.optional;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Optional;
@Getter
@AllArgsConstructor
public class Car {
String carName;
int price;
Optional<Insurance> insurance;
}
반응형
'공부 > 전자컴퓨터공학' 카테고리의 다른 글
Java 재귀(Recursion)란? (0) | 2024.06.07 |
---|---|
Java 스레드(Thread)란? 자바 기초 배우기 (1) | 2024.05.31 |
Java 스트림(Stream) 이란? 자바 기초 배우기 (0) | 2024.05.30 |
Java 람다식(Lambda Expression)이란? 자바 기초 배우기 (0) | 2024.05.30 |
Java 애너테이션(Annotation) 이란? 자바 기초 배우기 (0) | 2024.05.30 |