위의 내용은 처음 배울 때 다루는 내용들이지만 자바스크립트에서는 조금 더 신경써서 봐야하는데요,
이제부터 그 이유를 살펴보도록 하죠...!!!!!!
❓ null 데이터 타입이 object...?
위에서 말한 것처럼 null은 아무것도 없다는 의미로 대부분 프로그래밍 언어에서는 데이터 타입을 null로 정의합니다.
간단한 예시를 들어보도록 할게요!
- PHP
<?php
echo gettype(null);
?>
결과는 당연히 NULL 로 출력됩니다.
- Java
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = null;
System.out.println(a);
System.out.println(a.getClass().getName());
}
}
a라는 변수에 null로 초기화했으니 값을 출력할 땐 당연히 null이 나오겠죠?
추가적으로, 자바에서 getClass().getName() 메소드를 활용하여 값의 유형을 가져오려고 하면
아래와 같이 NullPointerException이 발생합니다.
근데 자바스크립트에서는.......
null을 object(객체)로 인식합니다......ㄷㄷ
(크롬 개발자도구에서 바로 테스트 가능합니다)
이로 인해 아래와 같은 촌극이 벌어지기도 합니다...
이는 자바스크립트 엔진의 버그로 수정을 했어야 했지만 이미 배포가 어느정도 되어 개발이 완료된 다른 사이트에 영향을 줄 수 있어 수정을 하지 않았다고 하네요...🙄
*** 주의 ***
자바에서도 자바스크립트와 유사한 상황이 있어서 NULL==object 타입이다라는 오해가 많습니다.
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String a = null;
System.out.println(a);
System.out.println("this is " + a);
System.out.println(a.getClass().getName());
}
}
위 소스코드를 실행했을 때 아래와 같은 결과를 얻을 수 있었는데요
자바에서 String을 단순히 문자열 저장하는 변수로 생각해서 NULL은 object 타입이다라고 생각하면 절대 안됩니다!!
String 자료형 자체가 클래스(참조) 타입으로 원시 타입인 int, char, float 등과 다른 형태입니다.
원시 타입은 애초에 null로 초기화가 불가능하고,
오로지 String, Integer 같은 참조 타입으로만 변수를 null로 초기화가 가능합니다.
즉, 자료형이 object 형태였던 것이고 이를 println() 메소드에서 null을 object 형태로 치환해준 것 뿐인거죠..!
(일반적으로 String 자료형을 이용하는 getName(), length(), toUpperCase() 같은 메소드를 적용할 수 없습니다.)