본문 바로가기
JavaScript/JavaScript

Javascript) 형변환 (문자열과 산술/비교 연산, Boolean과 산술 연산, Number(), parseInt(), parseFloat(), 논리형으로 형변환, 짧은 조건문)

by 박채니 2022. 5. 19.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


형변환 (Casting)

 

input 태그를 통하여 사용자에게 값을 입력 받아 합을 출력해주는 함수를 만들어보겠습니다.

 

HTML 코드

<fieldset>
    <legend>두 수의 합</legend>
    <input type="number" name="nums" id="num1" value="33"><br>
    <input type="number" name="nums" id="num2" value="22"><br>
    <button onclick="test1();">합</button>
</fieldset>

 

Javascript 코드

<script>
function test1() {
    alert(num1.value + num2.value);
}
</script>

number 타입으로 입력을 받았기 때문에 num1의 value + num2의 value를 하였지만, 결과는 '55'가 아닌 '3322'가 출력된 것을 확인할 수 있습니다.

input 태그의 타입이 무엇이든 간에 value 속성은 모두 문자열이기 때문입니다.

 

console.log(typeof num1.value, num1.value);
console.log(typeof num2.value, num2.value);

num1, num2의 value에 대한 type을 확인해보니 모두 string인 것을 확인할 수 있습니다.

 

따라서 숫자로 명시적인 형변환이 필요한데, 이 때 Number()함수를 사용합니다.

 

Number()

- 숫자로 형변환 처리

alert(Number(num1.value) + Number(num2.value));

숫자로 형변환 처리하니 33 + 22인 '55'가 출력 되는 것을 확인할 수 있습니다.

 


문자열과 산술 연산

 

HTML 코드

<button onclick="test2();">문자열과 산술/비교연산</button>

 

Javascript 코드

function test2() {
    const a = "3";
    const b = 3;

    // 숫자가 문자열로 형변환
    console.log(typeof(a + b), a + b)

    // 문자열이 숫자로 형변환
    console.log(typeof(a - b), a - b);
    console.log(typeof(a * b), a * b);
    console.log(typeof(a / b), a / b);
    console.log(typeof(a % b), a % b);
}
</script>

문자열 + 숫자 시에는 숫자가 문자열로 자동형변환 되어 '33'이라는 string 타입으로 반환되며,

이 외 문자열 - 숫자, 문자열 * 숫자, 문자열 / 숫자, 문자열 % 숫자(나머지)는 문자열이 숫자 타입으로 자동 형변환 되어 각각의 산술 연산을 시행한 결과가 출력 되고 number 타입으로 반환 되는 것을 확인할 수 있습니다.

 

다만 숫자로 변환 불가능한 문자열은 number 타입의 NaN(Not a Number)가 반환됩니다.

const c = "abc";
console.log(typeof(c * b), c * b);

 

 

Boolean과 산술 연산

let bool = true;
console.log(typeof(bool / b), bool / b);

bool = !bool;
console.log(typeof(bool / b), bool / b);

Boolean 타입의 true는 산술 연산 시 1로 변환되며, false는 산술 연산 시 0으로 변환됩니다.

따라서 bool이 true일 때는 true / 3 → 1 / 3 = 0.33333...이 출력되며,

bool이 false일 때는 false / 3 → 0 / 3 = 0이 출력됩니다.

 

 

문자열과 숫자의 비교 연산

console.log(typeof(a == b), a == b);
console.log(typeof(a != b), a != b);

비교 연산 두 항의 타입이 달라도 형변환 후 값이 같다면 true를 리턴합니다.

따라서 문자열 '3'이 숫자 3으로 자동 형변환 된 후 == 비교 연산이 진행되므로 true가 출력되며, 같지 않다는 의미하는 != 연산자는 false가 출력 됩니다.

 

타입/값 모두를 비교하고 싶다면 엄격 비교 연산자 (===, !==)를 사용해야 합니다.

 

 

엄격 비교 연산자

===

- 타입/값이 모두 같으면 true, 하나라도 다르면 false

!==

- 타입/값 중 하나라도 다르면 true, 모두 같으면 false

console.log(typeof(a === b), a === b);
console.log(typeof(a !== b), a !== b);

문자열 '3'과 숫자 3의 타입이 다르므로 === 비교 시에는 false가 출력되며,

문자열 '3'과 숫자 3의 타입이 같지 않으므로 !== 비교 시에는 true가 출력 됩니다.

 


문자열을 숫자로 명시적 형변환

 

HTML 코드

<button onclick="test3();">Number | parseInt | parseFloat</button>

 

Javascript 코드

 

Number()

- 숫자로 변환

- 변환 불가한 문자가 하나라도 존재하면 NaN 반환

function test3() {
    const n = "1234.56";
    const won = "1234.56원";

    console.log(Number(n));
    console.log(Number(won));
}

won은 '1234.56원' 변환 불가한 문자(원)가 존재하므로 NaN이 반환되었습니다.

 

parseInt

- 정수로 변환

- 변환 불가한 문자가 나오기 전까지 변환 후 정수로 반환

const n = "1234.56";
const won = "1234.56원";

console.log(parseInt(n));
console.log(parseInt(won));

정수로 변환되기 때문에 소수점 이하 자리수는 버림 처리 되었으며, 변환 불가한 문자(원) 이전의 숫자들을 변환 후 반환 된 것을 확인할 수 있습니다.

 

parseFloat

- 실수로 변환

- 변환 불가한 문자가 나오기 전까지 변환 후 실수로 반환

const n = "1234.56";
const won = "1234.56원";

console.log(parseFloat(n));
console.log(parseFloat(won));

실수로 변환되기 때문에 소수점 이하 자리수는 유지 되었으며, 변환 불가한 문자(원) 이전의 숫자들을 변환 후 반환된 것을 확인할 수 있습니다.

 


값 존재 여부에 따른 true, false

 

HTML 코드

<button onclick="test4();">논리형으로의 형변환</button>

 

Javascript 코드

 

값이 존재하면 true 반환

console.log(Boolean("abc"), !!("abc"));
console.log(Boolean(100), !!(100));
console.log(Boolean(-10), !!(-10));
console.log(Boolean(23.4), !!(23.4));
console.log(Boolean({}), !!({}));
console.log(Boolean([]), !!([]));

{}, [] 또한 값이 있는 것으로 인식하기 때문에 true로 반환됩니다.

!!(value)는 값이 존재하는 경우 !(value) 시 false가 반환되며, 이를 !!(value) 다시 true로 변환하여 값 존재 여부를 판단하고 boolean을 리턴합니다.

 

값이 존재하지 않으면 false 반환

console.log(Boolean(""), !!"");
console.log(Boolean(0), !!0);
console.log(Boolean(0.0), !!(0.0));
console.log(Boolean(undefined), !!undefined);
console.log(Boolean(null), !!null);
console.log(Boolean(NaN), !!NaN);

0, 0.0은 값이 없는 것으로 인식하기 때문에 false로 반환됩니다. (0.001 등은 값이 있는 것으로 인식하므로 유의!)

 

이를 이용하여 if문의 조건식 등으로 사용할 수 있습니다.

const elem = document.querySelector("#xyz");
if(elem) {
    // elem이 존재하는 경우 분기
} else {
    // elem이 존재하지 않는 경우 분기
}
foo(elem);

function foo(x) {
    if(x) {
        // x가 존재하는 경우 분기
    } else {
        // x가 존재하지 않는 경우 분기
    }
}

 


짧은 조건문

 

HTML 코드

<button onclick="test5();">짧은 조건문</button>

 

Javascript 코드

 

a && b

- a가 true로 평가되면 b를 실행

- b는 실행문, 대입문 등 가능

const num = Number(prompt("정수를 입력하세요."));
num % 2 == 0 && alert("짝수입니다.");

let m;
num % 2 == 0 && (m = num*100);
console.log(m);

m

만일 prompt에 짝수가 아닌 수를 입력한다면 아무것도 실행되지 않고 취소 됩니다.

 

 

a || b

- a가 false로 평가되면 b를 실행

- b는 실행문, 대입문 등 가능

const num = Number(prompt("정수를 입력하세요."));
num % 2 == 0 || alert("홀수입니다.");

let m;
num % 2 == 0 || (m = num*100);
console.log(m);

m

 

// num % 2 == 0 && return; 오류

이렇게 return ~는 불가하니 유의!!