Cha_Ji 2021. 2. 23. 12:11

NullPointerException

우리학교 1학년 1반에는 철수와 영희 두 명이 학교에 다닌다.

학교는 오늘 공사가 시작해 모든 짐을 치워야 한다.

학교는 비대면으로 전환되었지만 철수의 실내화는 학교에 있다.

선생님은 어쩔 수 없이 철수에게 실내화를 전해주러 출발했다.

하지만 출석부 속 철수의 집 주소는 비어있었다. 선생님은 갈 길을 잃었다.

 

없는 주소를 참조할 때 발생하는 널포인터 익셉션은 개발자라면 대부분 접해본 예외입니다.

 

예외 처리

코드를 실행하는데 문제가 없으려면 예외를 미리 방어해야 합니다.

학창시절 배우는 수학에서도 흔하게 볼 수 있는 예외처리가 존재합니다.

x 나누기 y에서 (단, y는 0이 될 수 없다.)

철수네 집 주소가 없다면 선생님네 집에 보관할 수 있습니다.

public 보관할주소 짐의주인을찾아주는함수(짐){
	if (짐.학생() != null){ //짐의 주인이 있을 때
		if(학생.주소() != null){ //짐주인의 주소가 있을 때
			return 주소;
		}
    	else{
    		return 선생님주소;
 	   }
	}
}

코드가 짧아서 괜찮아  보이지만 null 체크 로직이 많아지면 코드가 못생겨집니다.

코드가 못생겨지면 협업에서도 문제가 생기고 유지 보수에 문제가 생깁니다.

 

함수형 언어에서는 nullable 형식의 널 일수도 있는 값을 선언할 수 있습니다.

자바에서도 Optional 형식의 클래스를 사용할 수 있습니다.

 

Optional<T>

Optional은 null일 수 있는 값을 의미합니다. Type을 Optional로 감싸주면 null을 포함시킬 수 있습니다.

기본적인 사용법은 다음과 같습니다.


// null을 포함할 수 있는 Address 타입 
Optional<Address> address; 							

//null을 포함할 수 있는 값
Optional<Address> address = Optional.ofNullable(null); 	


//비어있는 객체
Optional.empty();		

//비어있다면 NoSuchElementException
address.orElse(0); 

Optional의 사용으로 null 체크를 간결하게 줄일 수 있습니다.

public 장소 짐전달해주기(){
	return Optional.ofNullable(짐)
    		.map(짐::get주인)
            .map(주인::get주소)
            .orElse(선생님집);
}

 

Optional 객체는 Steam이나 Collection과도 비슷한 개념이라고 합니다.

filter(), map(), ifPresent() 메서드도 함께 공부하면 좋을 것 같습니다.