"어떠한 값으로도 초기화 되지 않은 상태"
null 은 참조형 타입의 기본값이다.(초기값)
null 은 참조형 타입에서만 사용할 수 있다. 기본형 타입의 변수에 할당하게 될 경우 컴파일 오류가 발생한다.
참조변수가 지역변수로 선언된 경우 선언과 동시에 초기화 되어야 하기때문에 , 따로 초기화를 해주지 않는다면 기본값인 null 값으로 초기화 한다.
null 은 선언만 되어있고 초기화가 되어있지 않은 상태이다. 그래서 힙 메모리상 데이터가 존재하지 않는다.
하지만 빈값은 빈값이라는 데이터로 초기화가 되어있는 상태이다. 힙메모리상 빈값이 들어가 있을 것이고 스택 메모리에 빈값이 들어있는 메모리 주소가 들어 있을 것이다.
우리는 객체를 참조할 때, 스택에 있는 지역변수(참조변수) 에 값으로 있는 메모리주소를 통해 객체를 참조한다.
하지만 참조변수인 지역변수에 null 값이 들어가있고 참조변수를 참조 하려고 할 경우 , 우리는 NullPointerException을 마주치게 된다.
사진을 보면 isEmpty 메서드는 객체의 length 가 0인지 아닌지를 판별하는 메서드이다.
즉 String 에서는 "" 이러한 빈문자열 , 리스트에서 리스트 안에 값이 존재하는지 없는지 등을 판별할때 사용 할 수 있다.
public class IsEmptyEx {
public static void main(String[] args) {
String a = new String();
System.out.println(a.isEmpty());
HashMap<String, String> dic = new HashMap<>();
dic.put("baby", "아기");
dic.put("love", "사랑");
dic.put("apple", "사과");
Set<String> keys = dic.keySet();
Iterator<String> iter = keys.iterator();
while (iter.hasNext()) {
String key = iter.next();
String value = dic.get(key);
System.out.println("key : "+ key + ", value : " + value);
}
System.out.println();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("찾고 싶은 단어는? (종료 -> exit) ");
String eng = scanner.next();
if(eng.equals("exit")){
System.out.println("단어 찾기 종료");
break;
}
String kor = dic.get(eng);
if(kor.isEmpty()){
System.out.println("입력 값 " + kor);
System.out.println(eng + " 는 없는 단어 입니다.");
} else System.out.println(kor);
}
}
}
내가 이 주제로 글을 정리하게 된 이유 이다.
마지막 조건문에서 if(kor == null) 으로 했다가 아 null 값을 직접 다루는 것은 좋지 않은 코드잖아.
라고 생각해서 isEmpty 를 썼다가 NullPointerException 이 터졌다.
isEmpty 와 null 은 엄연히 다르다는 것을 깨달으며 글을 마무리 짓는다.