티스토리 뷰

728x90

Null 이란?

- null means that the variable hasn’t been set a value = null은 값이 할당되지 않은 변수

- merely a special literal that can be of any reference type = 모든 참조 유형이 될 수있는 특수 리터럴이다. = 모든 참조는 null 가능

- null is used to denote “no object” or “unknown” or “unavailable”, but these meanings are application specific = null은 “객체 없음”또는 “알 수 없음” 또는 “사용할 수 없음”을 나타내는 데 사용되지만 이러한 의미는 응용 프로그램에 따라 다르다.

- “빈” 상태는 String str = "";와 같이 “빈 값”이 객체에 할당되어 있기 때문에 null과는 다르며, 0도 0이라는 값이 할당된 상태이기 때문에 null과는 전혀 다르다.

- null은 존재하지 않는 상태를 나타내기 위한 것이다.

 

Null 을 안전하게 다루는 방법

1. assert

 

assert 부울식; 혹은 assert 부울식 : 수식;

예1) assert age > 0 : “나이는 음수가 될 수 없습니다:”+age;

예2) aasert val < 10 ; “10보다 작은 값만 쓸 수 있습니다.”;

 

부울식이 거짓이면 AssertionError 발생

수식은 AssertionError에 포함될 상세 정보를 만드는 생성식

 

2. optional

 

Java8에서 Optional<T> 클래스를 사용해서 npe(null point exception)을 방지할 수 있도록 해준다. option<T>는 null이 올 수 있는 값을 감싸는 wrapper 클래스로, 참조하더라도 npe가 발생하지 않도록 도와준다. Optional 클래스는 아래와 같이 value에 값을 저장해서 null이 오더라도 바로 npe를 발생하지 않게하며 클래스이기 때문에 각종 메소드를 제공한다.

 

- NPE를 발생할 수 있는 null을 직접 다루지 않아도 된다.

- 번거롭게 null을 직접 체크하지 않아도 된다.

- 명시적으로 해당 변수가 null값이 올 수도 있다는 가능성을 표현할 수 있다.

 

Null 사용시 주의 할 점

1. API에 null을 최대한 쓰지 말아라

- null로 지나치게 유연한 메서드를 만들지 말고 명시적인 메서드를 만들어라

   - API에 null을 받아서 분기처리 하지말고 애초에 null이 있을 때 메서드와 없을 때 메서드를 나눠서 만들어라

- null을 반환하지 말라

   - null을 반환하지 말고 예외를 던져라

   - 빈 반환 값은 빈 컬렉션이나 Null 객체를 활용하라

 

2. 사전 조건과 사후 조건을 확인하라: “계약에 의한 설계”

 - Spring의 Assert 클래스

 

3. (상태와 같이) null의 범위를 지역(클랫, 메서드)에 제한하라

- 상태와 비슷하게 null도 지역적으로 제한하면 큰 문제가 안된다

- 클래스와 메서드를 작게 만들어라

- 설게가 잘 된 코드에선 null의 위험도 줄어든다

 

4. 초기화를 명확히 하라

 

 

 

 

 

 

 

Reference Link

https://hyeri0903.tistory.com/m/205

https://eastglow.github.io/back-end/2020/01/10/Java-%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-null%EC%9D%84-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EB%8B%A4%EB%A3%A8%EB%8A%94-%EB%B0%A9%EB%B2%95.html

 

 

 

 

728x90