index
① 명시적 타입변환과 암묵적 타입변환 차이는 무엇일까?
② 명시적 타입변환 (Type Casting)
②-1 문자열 타입으로 변환
②-2 숫자 타입으로 변환
②-3 불리언 타입으로 변환
③ 암묵적 타입변환 (Type Coercion)
③-1 문자열 타입으로 변환
③-2 숫자 타입으로 변환
③-3 불리언 타입으로 변환
④ 단축평가
④-1 단축평가의 활용
④-1-1 객체를 가리키기를 기대하는 변수의 null 또는 undefined 확인
④-1-2 함수 매개변수에 기본값 설정
④-2 옵셔널 체이닝 연산자
④-3 null 병합 연산자
④-3-1 차이점 요약
1. 명시적 타입변환과 암묵적 타입변환 차이는 무엇일까?
1.1 명시적 타입변환 (Type Casting) vs 암묵적 타입변환 (Type Coercion)
값의 타입은 개발자의 의도에 따라 다른 타입으로 변환할 수 있다.
🧐 Q. Casting vs Coercion의 차이는 무엇일까?
Casting은 변환 과정을 개발자가 직접 제어합니다.
Coercion은 변환 과정을 개발자가 명시적으로 제어하지 않으며, 언어 자체가 상황에 따라 타입을 변환합니다.
1.1.1 명시적 타입변환 (Type Casting)
let x = 10;
// 명시적 타입변환
// 숫자를 문자열로 타입 캐스팅한다.
let str = x.toString();
console.log(typeof str, str); // string 10
// x 변수의 값이 변경된 것은 아니다.
console.log(typeof x, x); // number 10
명시적 타입변환은
(1) 표준 빌트인 생성자 함수를 new 연산자 없이 호출하는 방법
표준 빌트인 생성자 함수는 객체를 생성하기 위한 함수이며 new 연산자와 함께 호출한다.
(2) 빌트인 메서드를 사용하는 방법
표준 빌트인 메서드는 자바스크립트에서 기본 제공하는 빌트인 객체의 메서드다.
1.1.1.1 문자열 타입으로 변환
1. String 생성자 함수를 new 연산자 없이 호출하는 방법
String(1); // "1"
String(true); // "true"
2. Object.prototype.toString 메서드를 사용하는 방법
(1).toString(); // "1"
(true).toString() // "true"
3. 문자열 연결 연산자를 이용하는 방법
1 + ''; // "1"
true + '' // "true"
🧐 Q. String 생성자 함수를 왜 new 연산자 없이 호출할까?
String() 함수 (new 없이)
String() 함수를 호출하면 문자열로 변환된 값을 반환합니다. 이 함수는 원시 문자열 값을 반환하는데,
이는 메모리나 성능면에서 더 효율적이다. 예를 들어,
let str = String(123); // "123"
let objStr = new String(123); // 객체로서의 "123"
console.log(typeof str); // "string"
console.log(typeof objStr); // "object"
<정리>
String()을 new 없이 호출하는 이유는
✓ 원시 타입인 문자열을 간단하게 반환하기 위해서이며,
✓ 더 가볍고 성능 면에서 효율적이기 때문이다.
1.1.1.2 숫자 타입으로 변환
1. Number 생성자 함수를 new 연산자 없이 호출하는 방법
Number('0'); // 0
Number(true); // 1
2. parseInt, parseFloat 함수를 사용하는 방법(문자열만 변환 가능)
parseInt('0'); // 0
3. + 단항 산술 연산자를 이용하는 방법
+'0' // 0
+true // 1
4. * 산술 연산자를 이용하는 방법
'0' * 1 // 0
true * 1 // 1
1.1.1.3 불리언 타입으로 변환
1. Boolean 생성자 함수를 new 연산자 없이 호출하는 방법
Boolean('x') // true (문자열 → 불리언타입)
Boolean(0) // false (숫자 → 불리언타입)
Boolean(Infinity) // true (숫자 → 불리언타입)
Boolean(null) // false (null 타입 → 불리언타입)
Boolean(undefined) // false (undefined 타입 → 불리언타입)
Boolean([]) // true (객체 타입 → 불리언타입)
Boolean({}) // true (객체 타입 → 불리언타입)
2. ! 부정 논리 연산자를 두 번 사용하는 방법
!!'x' // true (문자열 → 불리언타입)
!!0; // false (숫자 → 불리언타입)
!!null; // false (null 타입 → 불리언타입)
!!undefined; // false (undefined 타입 → 불리언타입)
!!{}; // true
!![]; // ture
1.1.2 암묵적 타입변환(Type Coercion)
let x = 10;
// 암묵적 타입변환
// 문자열 연결 연산자는 숫자 타입 x의 값을 바탕으로 새로운 문자열을 생성한다.
let str = x + "";
console.log(typeof str, str); // string 10
// x 변수의 값이 변경된 것은 아니다.
console.log(typeof x, x); // number 10
1.1.2.1 문자열 타입으로 변환
자바스크립트 앤진은 문자열 연결 연산자(+) 표현식을 평가하기 위해 문자열 연결 연산자의 피연산자 중에서 문자열 타입이 아닌 피연산자를 문자열 타입으로 암묵적 타입 변환한다.
// 숫자타입
0 + '' // "0"
// 불리언 타입
true + '' // "true"
// null 타입
null + '' // "null"
// undefined 타입
undefined + '' // "undefined"
// 심벌 타입
(Symbol()) + '' // TypeError: Cannot convert a Symbol value to a string
// 객체 타입
({}) + '' // "[object Object]"
Math + '' // "[object Math]"
[] + '' // ""
[10, 20] + '' // "10, 20"
(function(){}) + '' // "function(){}"
Array + '' // "function Array() { [native code] }"
1.1.2.2 숫자 타입으로 변환
자바스크립트 엔진은 산술 연산자 표현식을 평가하기 위해 산술 연산자의 피연산자 중에서 숫자 타입이 아닌 피연산자를 숫자 타입으로 암묵적으로 타입 변환한다.
// 문자열 타입
+"1" + // 1
// 불리언 타입
true + // 1
// null 타입
null + // 0
// undefined 타입
undefined + // NaN
// 심벌 타입
Symbol() + // TypeError: Cannot convert a Symbol value to a number
// 객체 타입
{} + // NaN
[] + // 0
[10, 20] + // NaN
function () {}; // NaN
🧐 Q. +는 산술 연산자인가요? or 문자열 결합 연산자 인가요?
1. 산술 연산자로서의 +
두 숫자를 더할 때 사용됩니다. 즉, 숫자형 피연산자가 있을 경우 +는 산술 덧셈을 수행합니다.
ex) let result = 5 + 10; // 15
2. 문자열 결합 연산자로서의 +
만약 하나 이상의 피연산자가 문자열일 경우, +는 숫자를 문자열로 변환하고 두 값을 결합합니다.
즉, 문자열을 이어붙이는 역할을 합니다.
ex) let result = "Hello" + " " + "World"; // "Hello World"
3. 또한 숫자와 문자열이 혼합된 경우, 숫자가 자동으로 문자열로 변환되어 결합됩니다.
ex) let result = "The result is: " + 5; // "The result is: 5"
🤯 주의할 점: 숫자와 문자열이 섞인 표현식에서는 예상치 못한 결과가 나올 수 있습니다.
ex) let result = 5 + "10"; // "510" (숫자 5가 문자열 "10"과 결합됨)
<정리>
정리하자면, +는 자바스크립트에서 산술 연산자로 사용되지만,
피연산자 중 하나가 문자열일 경우 자동으로 문자열 결합 연산자로 동작하게 됩니다.
1.1.2.3 불리언 타입으로 변환
자바스크립트 엔진은 불리언 타입이 아닌 값을 Truthy 값(참으로 평가되는 값) 또는 Falsy 값 (거짓으로 평가되는 값)으로 구분한다.
<falsy로 평가되는 값>
false, undefined, null, 0, -0, NaN, ''(빈문자열)
// 전달받은 인수가 Falsy 값이면 true, Truthy 값이면 false를 반환한다.
function is Falsy (v) {
return !v;
}
// 전달받은 인수가 Truthy 값이면 true, Falsy 값이면 false를 반환한다.
function isTruthy(v) {
return !!v;
}
// 모두 true를 반환한다.
is Falsy (false);
is Falsy (undefined);
is Falsy(null);
is Falsy(0);
is Falsy (NaN);
is Falsy(' ');
// 모두 true를 반환한다.
isTruthy(true);
isTruthy('0'); // 빈 문자열이 아닌 문자열은 Truthy 값이다.
isTruthy({});
isTruthy([]);
🧐 Q. 그렇다면, 항상 명시적 타입변환만 하면 되는게 아닐까?
> “좋은 생각이긴 하지만 이러한 논리는 옳지 않다. 때로는 명시적 타입변환보다 암묵적 타입변환이 가독성 측면에서 더 좋을 수도 있다. 중요한 것은 코드를 예측할 수 있어야 한다는 것이다. 동료가 작성한 코드를 정확히 이해할 수 있어야 하고 자신이 작성한 코드도 동료가 쉽게 이해할 수 있어야 한다!”
UngmoLee, p.109, javascriptDeepDive,
2. 단축평가
논리합(||) 또는 논리곱(&&) 연산자 표현식의 평가 결과는 불리언 값이 아닐 수 있다.
논리 연산자 &&
(AND)와 ||
(OR)를 사용할 때, 표현식의 왼쪽 피연산자가 결과를 결정할 수 있는 경우 오른쪽 피연산자를 평가하지 않는 동작을 의미합니다. 이는 코드 실행을 최적화하고, 불필요한 연산을 피할 수 있게 해줍니다.
2.1 단축평가의 활용
다음과 같은 상황에 유용하게 사용될 수 있다.
ⅰ) 객체를 가리키기를 기대하는 변수가 null 또는 undefined가 아닌지 확인하고 프로퍼티를 참조할 때
let elem = null;
let value = elem.value // TypeError: cannot read property 'value' of null
단축평가를 사용함으로써 에러를 예방할 수 있다
let value = elem && elem.value // null
ⅱ) 함수 매개변수에 기본값을 설정할 때
function getStringLength(str) {
str = str || "";
return str.length;
}
getStringLength(); // 0
getStringLength("hi"); // 2
function getStringLength(str = "") {
return str.length;
}
getstringLength(); // 0
getStringLength("hi"); // 2
2.2 옵셔널 체이닝 연산자
옵셔널 체이닝 연산자 ?.
는 객체나 배열의 특정 속성 또는 메서드에 접근할 때, 해당 값이 null
또는 undefined
일 수 있는 경우 안전하게 접근할 수 있도록 도와줍니다. 만약 접근하려는 값이 null
또는 undefined
라면, 에러를 던지지 않고 undefined
를 반환합니다.
let user = { name: "John", address: { city: "New York" } };
console.log(user?.name); // "John"
console.log(user?.address?.city); // "New York"
console.log(user?.age); // undefined (age 속성이 없으므로 에러 없이 undefined 반환)
console.log(user?.address?.street); // undefined (address는 있지만 street 속성이 없으므로 undefined 반환)
특징)
- 안전하게 중첩된 객체 속성에 접근 가능
- null 또는 undefined인 경우에만 작동, 그 외에는 정상적으로 값을 반환
2.3 null 병합 연산자
null 병합 연산자 ??
는 피연산자가 null
또는 undefined
인 경우를 확인하고, 해당 값이 null
또는 undefined
일 때만 오른쪽 피연산자를 반환합니다. 이 연산자는 기본값을 설정하는 데 많이 사용됩니다.
let value = null;
let defaultValue = value ?? "Default Value";
console.log(defaultValue); // "Default Value" (value가 null이므로 기본값 반환)
let value2 = 0;
let defaultValue2 = value2 ?? "Default Value";
console.log(defaultValue2); // 0 (value2는 null이나 undefined가 아니므로 그대로 반환)
특징)
-
null
이나undefined
만을 falsy 값으로 처리 -
0
,false
,""
(빈 문자열) 같은 값들은null
병합 연산자에서null
이나undefined
로 간주되지 않으므로 그대로 반환
2.3.1 차이점 요약
옵셔널 체이닝 (?.): 객체 속성이나 메서드에 안전하게 접근하기 위해 사용되며, 중첩된 구조에서도 null이나 undefined일 경우 에러 없이 undefined를 반환합니다.
ex) object?.property
**null 병합 (??): **: 값이 null 또는 undefined일 때만 기본값을 제공하는 연산자로, 다른 falsy 값(예: 0, false, ““)은 그대로 사용됩니다.
ex) value ?? “default”
이 두 연산자는 함께 사용될 수 있으며, 코드의 안전성을 높이는 데 매우 유용합니다.