https://www.youtube.com/watch?v=vX3yY_36Sk4 스프링캠프2019
유튜브 알고리즘을 타던 중 이와 같은 영상을 보게 되었고, 정리를 하고 싶어졌다.
null이란?
크게 2가지로 나눌 수 있다.
1. Unique Empty String
길이가 0인 문자열.
2. Null pointer, Null Reference로 불리는 유효하지 않은 객체를 가리키는 것 .
자바에서 Initialize를 하지 않은 객체를 수정하거나 접근하려고 하면 볼수 있는 NPE이다.
npe는 runtimeException이자 uncheckedException으로 컴파일 시점에는 확인할 수가 없어 프로그래머의 프로그래밍 역량에 따라 빈번하게 발생할 수 있다.
방지하는 방법
java 8이후로 괜찮은 방법들이 쏟아지고 있고, 아예 언어차원에서 jvm의 다른 언어(Kotlin) 들이 다양하게 지원하고 있다.
1. 삼항연산
String str = (param == null) ? "NA" : param;
2. 라이브러리사용 ( apache common lang의 StringUtils Class)
StringUtils.isNotEmpty()
StringUtils. IsEmpty()
StringUtils.equals()
StringUtils.equals()
3.Fail Fast Method Arguments
메서드 초기에 null체크 하는 것.
4. Objects 대신에 Primitives를 고려하는 것 .
객체를 참조하지 않으면 null pointer가 발생하지도 않을 것.
5. 체인드 메서드 호출을 지양할 것.
ex) ref.method1().method2().method3().methods4();
디버그가 어려워진다.
6. toString()보다는 valueOf()
valueOf()는 Null체크가 내장되어 있다.
7. Method에서 null반환 피하기. (--> 빈 문자열,컬렉션,자바8이후의 Optional)
List<String> data = null;
@SuppressWarnings("unchecked")
public List getDataDemo()
{
if(data == null)
return Collections.EMPTY_LIST; //Returns unmodifiable list
return data;
}
8. 메서드의 인자가 2개이상일때 하나의 인자로 null을 요구하는 경우를 피해라 .
대신에 , 메서드를 2개를 만들어라. 파라미터 1개를 지니는 메서드와 , 2개이상의 메서드를 지니는 경우로 .
9 . equal()사용 시 안전한 사용법
String param = null;
// npe발생
if (param.equals("check me")) {
}
//npe발생x
if ("check me".equals(param)) {
}
equals()는 내부적으로 주소값부터 비교를 하기 때문에 참조변수를 뒤에다 놓는 것이 좋다.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (!COMPACT_STRINGS || this.coder == aString.coder) {
return StringLatin1.equals(value, aString.value);
}
}
return false;
}
참고
https://en.wikipedia.org/wiki/Null_pointer
https://www.oracle.com/technical-resources/articles/java/java8-optional.html