[J2SE] NULL객체를 String 문자열 캐스팅시 주의점
타입 캐스팅(Type Casting)이란 데이터의 유형을 다른 데이터의 유형으로 변환하는 프로세스
타입 캐스팅의 유형
타입 캐스팅을 하는 방법은 암시적 또는 명시적으로 할 수 있습니다. 암시적 타입 캐스팅은 자동 타입 캐스팅이라고 알려져 있는 아무런 작업을 하지 않아도 컴파일러에 의해 수행이 되며, 명시적 타입 캐스팅은 프로그래머가 수동으로 직접 작업을 해야 한다.
- 확대 유형 캐스팅
- 암시적 또는 자동 유형 캐스팅
- Narrowing Type Casing
- 명시적 또는 수동 유형 캐스팅
최근에 코드를 보면 타입 캐스팅을 할 때 String.valueOf 명령어를 사용해서 Object 객체의 값을 String 객체로 변환하여 값을 사용하는 경우가 은근히 많다. String.valueOf 메소드를 통해서 변환을 하면 null 객체에 대해서 캐스팅이 아니라 null 값을 문자열로 변환해주는 메소드라는 것을 주의해야 한다.
Object 객체에 대해서 변환 후 출력하여 비교
1
2
3
4
5
6
7
8
9
10
11
@Test
public void NULL객체_String_문자열_캐스팅() {
Object value = null;
// Narrowing Type Casting
String result1 = (String) value;
System.err.println(result1); // null 출력
String result2 = String.valueOf(value);
System.err.println(result2); // null 출력
}
다음처럼 Object 객체에 대해서 캐스팅을 하고 나서 출력 결과는 모두 null 이라는 메시지가 출력되고 특별한 문제가 없어 보인다. 하지만 실제로 result1의 값은 null객체가 포함이 되어 있는 것이고, result2의 값은 문자열 null이 들어가 있다.
Default 값을 설정하는 로직
String.valueOf에서 null인 경우에 어떤 값을 주는지를 잘 모른다면 모두 null이라는 문자열을 출력했기 때문에 눈으로는 문제점이 잘 확인되지 않을 수 있다. 캐스팅된 객체의 값이 null인 경우에 디폴트 값을 설정하기 위해서 조건을 캐스팅 후에 구현을 했다면 예상하지 못한 결과를 처리할 수 있다.
null일 경우 기본값을 설정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void NULL객체_String_문자열_캐스팅_사용() {
Object value = null;
// Narrowing Type Casting
String result1 = (String) value;
if(null == result1) {
System.err.println("Result1 : " + result1); // Result1 : null 출력
}
String result2 = String.valueOf(value);
if(null == result2) {
System.err.println("Result2 : " + result2); // 출력되지 않음
}
}
앞에서 출력된 결과를 보면 모두 null이라고 출력을 했기 때문에 Result1과 Result2가 모두 출력이 되어야 할 것 같지만, String.valueOf 메소드는 캐스팅이 아닌 문자열 값으로 변환해주는 메소드로 null객체를 문자열 null로 변환하여 값으로 반환했기 때문에 Result2는 출력되지 않는다.
null 값에 대한 캐스팅을 해서 Default 값을 설정하고 싶다면, Narrowing Type Casting 방식의 캐스팅을 사용하여 null에 대한 검증 로직을 추가해서 개발해야 한다.