JAVA

[JAVA] 널(null) 안전성과 옵셔널(Optional)

깃짱 2023. 2. 19. 17:06
반응형

💋 널(null)

- 값/참조가 없다는 개념

 

💋 널 안전성이 중요한 이유

개발자들이 변수를 사용하기 전에 널 값인지 매번 확인하지는 않는다.

이 경우 NullPointerException, NullReferenceException, Cannot read property of null와 같은 에러가 자주 발생하게 된다.

 

👍 널 안전성

자바, 러스트, C++을 포함한 많은 언어에서 지원하는 기능이다.

기본적으로 모든 값(변수, 매개변수, 리턴값)은 널값을 가질 수 있는데, 이 변수이름 뒤에 ? 기호를 붙이면 널값을 가질 수 있다는 의미이고, 널값 여부를 확인하지 않고서는 사용할 수 없도록 컴파일러가 강제하게 된다.

 

Car? getFifthCar(List<Car> cars) { 
	if (cars.size() < 5) { 
    	return null;
    }
    return cars[4];
}

Car 객체를 담은 리스트에서 다섯 번째 아이템을 가져오는 메서드이다. Car?는 반환값이 널값일 수 있다는 의미이고, 값을 얻기 어려운 경우에는 null값을 반환한다는 의미이다.

 

그래서..? 어떻게 안전하다는건데???

 

getFifthCar() 메서드를 호출하는 곳에서 널의 경우의 수에 대해 처리하지 않으면 컴파일해주지 않는다.

 

public void printResult(List<Car> cars) { 
    Car? fifthCar = getFifthCar(cars);
    if (fifthCar == null) { 
    	System.out.println("다섯번째 없음!");
        return;
    }
    System.out.println(fifthCar);
}

이런 식으로 if문을 통해서 null 값을 검증해주지 않고 여기에서 if문을 지워버리면 컴파일도 안해준다.

 

👍 옵셔널(Optional)

사용중인 언어가 널 안전성을 지원하지 않는다면 옵셔널을 사용할 수 있다.

메서드가 갑자기 널을 반환하면 호출하는 개발자는 상당히 당황할 수 있는데, Optional을 사용하면 반환값이 없을 수도 있다는 것을 다른 개발자도 충분히 인지할 수 있다.

Optional<Car> getFifthCar(List<Car> cars) { 
	if (cars.size() < 5) { 
    	return Optional.empty();
    }
    return Optional.of(cars[4]);
}

위에서 if (fifthCar == null) 이 옵셔널에서는 if (!fifthCar.isPresent())로 대체된다.

public void printResult(List<Car> cars) { 
	Optional<Car> fifthCar = getFifthCar(cars);
    if (fifthCar.isPresent()) {
    	System.out.println(fifthCar.get());
        return;
    }
    System.out.println("없음!");
}

 

암튼 잘 사용해서 null 상황에도 반드시 대처할 수 있게 강제해보자!

 

반응형