공부/전자컴퓨터공학

Java Optional Class 란? 자바 기초 배우기

AhJustC 2024. 5. 30. 22:47
반응형

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;
}

 

반응형