오늘 개발을 하다보니 String인 인자를 전달해서 문자열을 만들어야 했다.
String folder = null;
String path = "E:\" + folder;
System.out.println(path);
위와 같이 코드를 작성한다고 할 때, 콘솔에 찍히는 값은 `E:\`가 아니라 `E:\null`이다.
Java 컴파일러는 문자열 `+`연산을 `StringBuilder`로 변환한다. 컴파일 후 내부적으로 아래와 같은 코드가 된다.
String path = new StringBuilder().
.append("E:\")
.append(folder)
.toString();
`StringBuilder.append(String str)` 내부 구현을 보면
public AbstractStringBuilder append(String str) {
if(str == null)
return appendNull();
...
위와 같고
private AbstractStringBuilder appendNull() {
append("null");
}
즉, null이면 `"null"` 문자열을 붙이도록 설계되어 있다. 의도하지 않는 null 체크가 이미 내부에서 처리된다.
백엔드 개발에서 로그나 응답 문자열 만들 때 자주 발생한다.
방법 1 - Optional 사용
String path = "E:\" + Optional.ofNullable(folder).orElse("");
방법 2 - Objects.toString()
String path = "E:\" + Objects.toString(folder,"");
방법 3 - null 체크
String path = "E:\" + (folder == null ? "" + folder);
아무튼 로그 안찍어 봤으면 null이 그대로 들어가 큰일날 뻔 했다.
'자바' 카테고리의 다른 글
| [Java] 자바 Stream.forEach()와 람다식의 내부 동작 및 연결 과정 (0) | 2026.02.12 |
|---|---|
| [Java] Apache POI에서 날짜 셀 스타일 지정 및 포맷 적용 방법 (0) | 2026.02.10 |
| [Java] <? super K> 제네릭 하한 경계 와일드 카드 (0) | 2026.01.09 |
| Java에서 Record가 뭘까? (0) | 2025.12.17 |
| [Java] 제네릭 메서드와 정적 메서드: 왜 ResponseDTO.<T>builder()는 되고 ResponseDTO<T>.builder()는 안 될까? (0) | 2025.01.28 |
