💋 널(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 상황에도 반드시 대처할 수 있게 강제해보자!