[JS] π μ¬λ―Έμκ² νμ€ν μ΄ν΄νλ null / undefined / NaN μ°¨μ΄
μλ°μ€ν¬λ¦½νΈμ μμν falsy κ°
μλ°μ€ν¬λ¦½νΈμμ null, NaN, undefinedλ λ€λ₯Έ νλ‘κ·Έλλ° μΈμ΄μλ μλ μλ°μ€ν¬λ¦½νΈμλ§ μλ μμν falsy κ°μΌλ‘μ, μ΄λ€μ λͺ¨λ κ°μ΄ μμ(falsy)μ λνλ΄λ νΉλ³ν κ°μ΄λ€. κ·Έλμ μ΄λ€μ 쑰건문μμ falseλ‘ νκ°λμ΄ μ§λ€.
κ° | Boolean λ¬Έλ§₯ | Number λ¬Έλ§₯ | String λ¬Έλ§₯ |
null | false | 0 | "null" |
undefined | false | NaN | "undefined" |
NaN | false | NaN | "NaN" |
Infinity | true | Infinity | "Infinity" |
νμ§λ§ λλΆλΆ null, NaN, undefined κ°μ μλ―Έμ ꡬ체μ μΈ μ°¨μ΄μ λν΄ μ 맀λͺ¨νΈνκ² μκ±°λ μ νν λͺ¨λ₯΄λ μ¬λμ΄ κ½€ λ§λ€. λ°λΌμ μ΄λ² ν¬μ€ν μλ null, NaN, undefinedκ°μ λ루λ§λ¦¬ ν΄μ§λ‘ λΉμ ν μ΄λ―Έμ§λ₯Ό ν΅ν΄ μ νν μ΄λ€ μλ―Έμ΄λ©° μ μ΄λ¬ν μλ―ΈμΈμ§ μμ보λ μκ°μ κ°μ Έ λ³΄κ² λ€.
λ루λ§λ¦¬ ν΄μ§λ‘ λΉμ νλ falsy κ°
μ μ΄λ―Έμ§λ μλ°μ€ν¬λ¦½νΈ falsy κ°μ λν μΌμ’ μ μ λ¨Έμ λΉμ μ΄λ€. λͺ¨λ μλ―Έ μκ±°λ λΆμ μ ν κ°λ€μ΄μ§λ§ ν΄μ§ ννμ λ°λΌ νμ€ν μλ―Ένλ λ°κ° λ€λ¦μ λ³Ό μ μλ€. μ΄λ€ 4κ°μ κ°μ μ€λͺ νμλ©΄ λ€μκ³Ό κ°λ€.
0 μ μν
μ μ 0μ λλ€μ νλ‘κ·Έλλ° μΈμ΄μμ falseλ‘ νκ°λλ€. μ΄λ₯Ό ν΄μ§λ‘ λΉμ νλ©΄ ν΄μ§ λ΄μ©λ¬Όμ΄ μλ€λ μλ―Έμ΄λ€. λ¨, 0 μ΄λΌλ κ³ μ ν μ«μ νμ μ΄λ―μ΄ ν΄μ§ λ΄μ©λ¬Όμ΄ μμ΄λ ν΄μ§μμ μ μ μλ 'κ³½ν°μ' μ μ΄λ₯Ό λ΄λ 'ν΄μ§κ±Έμ΄'λ μμ‘΄νλ€.
null μ μν
λ³΄ν΅ nullμ κ·Έμ κ°μ΄ μλ μνλΌκ³ μκ³ μλ λΆλ€μ΄ λ§μ§λ§, μ΄λ μ ννμ§ μμ μλ―Έμ΄λ€. μ νν nullμ μ΄λ reference λ³μμ λν΄ μ£Όμκ°μ΄ μλ κ²μ νννκΈ° μν ν€μλ κ°μ΄λ€. κ°μ²΄μ μμ± κ°μ΄ μ‘΄μ¬νμ§ μμ λλ ν¨μμ 맀κ°λ³μλ₯Ό μ΄κΈ°ννλ μ©λλ‘ μ¬μ© λκΈ°λ νλ€.
λ νΌλ°μ€ λ³μλ κ°μ²΄μ κ°μ΄ ν(heap) 곡μ λ©λͺ¨λ¦¬ μμμ μ μ₯λλ ν¬μΈν° λΌκ³ μ΄ν΄νλ©΄ λλ€.
κ·Έλ°λ° nullμ μ€λ‘μ§ reference λ³μμλ§ λ΄μ μ μκΈ° λλ¬Έμ, μΌλ°μ μΈ κ°μΈ μ μλ λ¬Έμλ₯Ό μ μ₯νλ primitive λ³μμλ nullμ μ μ₯ν μ μλ€. λ°λΌμ Javaμμλ μ΄ primitive λ³μμ λν΄ κ°μ μ£Όμ§ μμ κ²½μ° μ§μ λ μ΄κΈ°ν κ°μ μλμΌλ‘ ν λΉνκ² νμκ³ , CμΈμ΄μμλ κ°λΉμ§ κ°μ μλμΌλ‘ ν λΉνλ€.
#include <stdio.h>
int main() {
int num;
printf("%d", num); // -56982792084 μ΄μν μ°λ κΈ° κ°
return 0;
}
public class MyClass {
int number; // μΈμ€ν΄μ€ λ³μ
public static void main(String[] args) {
MyClass obj = new MyClass();
System.out.println(obj.number); // μΆλ ₯ κ²°κ³Ό: 0 (μλλ CμΈμ΄ μ²λΌ μ°λ κΈ°κ°μ΄ λμ€μ§λ§ JVMμ μν΄μ κΈ°λ³Έκ°μΌλ‘ μ€μ λλ€)
}
}
reference λ³μλ primitive λ³μλ μ λ°λΌ νμ μ΄ μλ μλ°μ€ν¬λ¦½νΈλ‘λ μμκ° μλλ°, 1μ ν λΉν λ³μμ νμ μ number νμ μ΄μ§λ§, nullμ ν λΉν λ³μμ νμ μ object μμ μ μκ° μλ€.
κ²°λ‘ μ μΌλ‘, μμ 0κ³Ό λ€λ₯Έμ μ κ³½ν°μλ μμ§λ§ ν΄μ§κ±Έμ΄λ μμ‘΄ν΄ μλ€λ μ μ΄λ€. μλνλ©΄ null κ°μ λ€κ³ μλ κ°μ²΄ μ체λ νλ‘κ·Έλλ¨Έκ° μ μνμ¬ λ©λͺ¨λ¦¬μ μ¬λ €μ Έ μ£Όμκ°μ λ°μ μ€λΉκ° λμ΄ μκΈ° λλ¬Έμ΄λ€.
μ¦, κ°μ μμ§λ§ κ°μ λ΄μ μ μλ κ·Έλ¦μ μλ κ²μ΄λ€. λ°λΌμ ν΄μ§λ₯Ό λ΄λ ν΄μ§κ±Έμ΄ μ체λ μμ‘΄ν΄ μλ κ²μ΄λ€.
undefined μ μν
undefinedλ λ³μκ° μ μλμ΄ μμ§ μμ μν, μ¦ κ°μ΄ ν λΉλμ§ μμ μνλ₯Ό λνλΈλ€.
λ°λ‘ μμμ primitive, reference λ³μλ₯Ό λ€λ©° μλ°μ CμΈμ΄μμ μ΄λ»κ² μ΄κΈ°νλ₯Ό μ§ννλμ§μ λν΄ μ€λͺ νμμλ€. λ μΈμ΄λ§ νλλΌλ μ΄λ€ νμ μ λ³μλμ λ°λΌ μ΄κΈ°νλλ κ³Όμ μ΄ λ¬λλ€.
λ°λΌμ μλ°μ€ν¬λ¦½νΈμμ μ¬ννκ² μ΄λ€ νμ
μ λ³μλ κ°μ κ°μ΄ μλ€λκ±Έ undefined λΌλ ννμΌλ‘ νμ³€λ€κ³ 보면 λλ€. μ¬μ§μ΄ λ³μ νμ
μ체λ undefined λ‘ λμ΄ μλ€. μ¬ννκ² νννκΈ° μν΄ μ΄λ¬ν λ°©μμ μ·¨νκ² κ°μλ°, λ§μΌ κΈ°μ‘΄μ CμΈμ΄λ μλ°μ μ΅μν κ°λ°μλ€μκ² μ€νλ € νΌλλ§ μΌμΌν¨ κ² κ°λ€κ³ κ°μΈμ μΌλ‘ μκ°λλ€.
null vs undefined
nullκ³Ό undefined μ°¨μ΄μ μ λ΄λΆ λ©λͺ¨λ¦¬μ μΈ μΈ‘λ©΄μμ λ΄μΌ λλ€.
undefinedλ λ³μκ° μ΄κΈ°νλμ§ μμκ±°λ, κ°μ²΄μ μμ±μ΄ μ‘΄μ¬νμ§ μλ λ±μ κ²½μ°μ μλμΌλ‘ ν λΉλλ κ°μΌλ‘, μ΄λμ λ³μλ λ©λͺ¨λ¦¬μ μ‘΄μ¬νμ§λ§ κ°μ΄ μκΈ° λλ¬Έμ ν¬κΈ°κ° λ§€μ° μλ€.
λ°λ©΄, nullμ κ°λ°μκ° μλμ μΌλ‘ κ°μ΄ μμμ ν λΉν κ²½μ°μ μ¬μ©λλ κ°μΌλ‘, μ΄λμ λ³μλ λΉ κ°μ²΄λ₯Ό κ°λ¦¬ν€λ κ°μ²΄ ν¬μΈν°μ΄κΈ° λλ¬Έμ μ£Όμκ°μ λμ€μλΌλ λ°κΈ°μν΄ ν¬κΈ°κ° μμ΄ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νκ² λλ€.
λ°λΌμ, undefined κ°μ κ°μ§ λ³μμ λ©λͺ¨λ¦¬ μ©λμ μκ³ , null κ°μ κ°μ§ λ³μμ λ©λͺ¨λ¦¬ μ©λμ ν¬λ€κ³ μ 리ν μ μκ² λ€. (μ΄λ μλμ μΈ λΉκ΅μΌ λΏμ΄λ―λ‘ μ€μ λ‘λ κ±°μ μ°¨μ΄κ° μλ€κ³ λ΄λ λλ€)
λ€λ§, μλ°μ€ν¬λ¦½νΈμμλ λ³μκ° μ»΄νμΌ μμ μ΄ μλ λ°νμ μμ μ λμ μΌλ‘ ν λΉλκΈ° λλ¬Έμ, λ³μμ ν¬κΈ°λ λ°νμ νκ²½μ λ°λΌ λ€λ₯Ό μ μμ΄ λ©λͺ¨λ¦¬ ν¬κΈ°λ μ νν μ μ μλ€.
λ°λ©΄ μλ°(Java)μμ reference λ³μ κ°μ κ²½μ° 32λΉνΈ JVM κΈ°μ€μΌλ‘ 4λ°μ΄νΈκ° ν λΉλκ² λλ€.
null κ³Ό undefinedκ° μλ‘ μμ ν λ€λ₯Έ μ‘΄μ¬λΌλ μ μ, μλ°μ€ν¬λ¦½νΈμμ νμ μ μΆλ ₯ν΄λ³΄λ©΄ μ μ μλ€.
λ§μ§λ§μΌλ‘ ν΄μ§λ‘ λΉμ ν κ·Έλ¦Όμ 보면 μμ λΉ κ³΅κ°μμ λ³Ό μκ° μλλ°, ν΄μ§ λ΄μ©λ¬Όλ κ·Έ ν΄μ§λ₯Ό λ΄μ ν΄μ§κ±Έμ΄ μ체λ μκΈ° λλ¬Έμ΄λ€. μλνλ©΄ νμ
μμ²΄κ° undefined μ΄κΈ° λλ¬Έμ΄λ€.
μμμ nullμ λΉμ ν λ μ무κ²λ λ΄κΈ°μ§ μμ κ·Έλ¦μ΄λΌ νννλλ°, undefinedλ κ·Έλ¦ μμ²΄κ° ν΅μ§Έλ‘ μλ κ²μ΄λ€.
NaN μ μν
NaNμ Not a Numberμ μ½μλ‘ μ«μκ° μλ κ°μ λνλΈλ€. κ·Έλ¬λ μ«μκ° μλμ§λ§ νμ μ Number νμ μΌλ‘ μ·¨κΈλλ€. μ«μ νμ μ΄λ©΄μ μ«μκ° μλ κ°μ΄λΌλ λκ° λ§μ΄μΌ λ°©κ΅¬μΌ μΆκ² μ§λ§, μ€μ λ‘ μ΄λ¬ν ννμ λν νμμ±μ΄ μ‘΄μ¬νλ€.
μλ₯Όλ€μ΄ λ¬Έμ "100" μ μ«μ νμ μΌλ‘ νλ³ννλ©΄ μ΄λ ν μλ¬ μμ΄ μ«μ 100μΌλ‘ μΉνμ΄ λλ€. μ΄λ¬ν κΈ°λ₯μ΄ μλ μ΄μ λ λλΆλΆμ μ¬μ©μκ° μ λ ₯ν κ°μ΄ λ¬Έμμ΄ ννμΈ κ²½μ°κ° λ§μ μ΄λ₯Ό μ«μλ‘ λ³ννμ¬ κ³μ°ν΄μΌ νλ μν©μ΄ λ§κΈ° λλ¬Έμ΄λ€.
κ·Έλ°λ° ν΄λΉ λ¬Έμκ° "100ABC" μ κ°μ μ«μμ μΌλ° λ¬Έμμ΄μ΄ μμΈ ννμΌ κ²½μ°, μ΄λ₯Ό ν¨μλ₯Ό ν΅ν΄ μ«μλ‘ λ³νν λ λ¬Έμ κ° λλ€. κ·Έλμ νμ μ체λ λλ² νμ μΌλ‘ λ³νμ λ¬μ§λ§ λ΄μ©λ¬Όμ΄ μ«μκ° μλλΌλ κ°μ νννκΈ° μν΄ NaN μ΄λΌλ ννμ μ°λ κ²μ΄λ€. κ·Έλμ NaNμ μΌμ’ μ μ€λ₯ κ°μΌλ‘ μ·¨κΈλλ€. μ΄λ°μλ μ«μμ λ¬Έμμ΄μ μ°μ°νλ €κ³ ν΄λ NaNμ΄ λ°μνλ€.
λ°λ©΄ μλ°(Java)μμ λ¬Έμμ΄μ΄ μ ν¨ν μ«μ νμμ΄ μλκ²½μ° NumberFormatExceptionμ λ°μμν¨λ€.
// λ¬Έμ 100μ + μ°μ°μλ₯Ό ν΅ν΄ μ«μλ‘ νλ³ν
let a = +"100";
console.log(a); // μ«μ 100
// λ¬Έμ ABCλ₯Ό + μ°μ°μλ₯Ό ν΅ν΄ μ«μλ‘ νλ³ν
let b = +"ABC";
console.log(b); // NaN (μ«μλ‘ νλ³νν΄μ μ«μ νμ
κ°μ΄μ§λ§ μ«μκ° μλ)
μ΄λ₯Ό ν΄μ§λ‘ λΉμ νλ©΄ 'μ΄ κ°μ λ§λ μ λλ κ°'μ΄λΌλ λ»μ νννκΈ° μν΄ λ루λ§λ¦¬ ν΄μ§λ₯Ό μ λ°μμΌλ‘ λ§λμλκ² μ΄μνκ² κ½μ κ²μΌλ‘ 보면 λλ€.