null 대신 비어 있는 값 || 값이 없음을 의미 있게 표현할 수 있는 새로운(?) 대안

null은 왜 안좋을까?

첫 번째, null은 아무런 의미가 없다.

여기서 “의미”가 없다는 것은 null이 올바른 값인지 잘못된 값인지 판단을 내릴 수 있는 정보가 없다라는 것이다.

Optional.of(p);
Optional.ofNullable(p)

Person p = null;

두 번째, 가독성이 떨어진다.

null 여부를 검증하기 위한 코드를 작성하기 위해서 우리의 코드를 if-else로 떡칠 해야 한다..! 무작정 if-else문이 잘못 되었다고 말할 수는 없지만, if-else문이 가독성과 유지보수성을 떨어트리는 것은 사실이니깐..

예시 코드; if-else 분기

Person black = new Person(new Car(new Insurance("JinoLife"));
public String getInsuranceInfo(Person p){
	if(p != null){
		Car c = p.getCar();
		if(c.getInsurance() != null){
			Insurance i = c.getInsurance();
			return i.getInsuranceName();
		}
	}
	return "Unknown";
}

예시 코드; Optional

Person black = new Person(new Car(new Insurance("JinoLife"));
public String getInsuranceName() {
    return this.car.map(Car::getInsurance)
            .map(Insurance::getName)
            .orElse("Unknown");
}

언제 사용하면 좋을까?

메서드 Return Type

public interface JpaOrderRepository extends JpaRepository<Order, Long> {
	public Optional<Order> findById(String uuid);
}

Getter의 Return Type

class Person {
	private Car car;
	
	public Opitonal<Car> getCar(){
			return this.car;
	}
}

매우 단순한 로직에 대한 로컬 변수

Optional.ofNullable(account)
    .ifPresent(acc -> processAccount(acc));
    
if(account != null)	processAccount(account);

클래스 필드나 메서드 파라미터

class Person {
	private Optional<Car> car;
	
	public Opitonal<Car> getCar(){
			return this.car;
	}
}
  1. 의미의 오용Optional은 반환 값이 있을 수도 없을 수도 있는 상황을 표현하기 위해 설계되었다. 메소드 인자로 사용하면 본래 목적과 맞지 않다.
  2. 불필요한 복잡성 증가Optional을 인자로 사용하면 코드의 복잡성이 증가하고 가독성과 유지보수성이 저하된다.
  3. 표준 관례 위반: 자바 커뮤니티에서는 Optional을 반환 타입으로 사용하는 것이 관례다. 인자로 사용하는 것은 표준 관례를 위반하는 것이다.