본문 바로가기
javascript

[자바스크립트] 느슨한 타입

by jinbro 2017. 4. 19.

[목표]

- 자바스크립트 특징 이해하기 : 그냥 아 그렇구나하고 넘어가는게 아니라...


[느슨한 타입이란]
- 타입없이 변수를 선언하는 것
- 자바스크립트가 변수를 선언할 때 타입없이 var(variable 약어)로만 선언함
- 느슨한타입과 반대되는 말은 강력한타입, 강력한타입은 반대로 변수를 선언할 때 타입을 선언해야함
1
2
3
4
5
6
7
/* javascript (loose typing) */
var a = 1 // typeof(a) === Number
var b = "str" // typeof(b) === String
 
/* java (strong typing) */
int a = 1;
String b = "str"
cs

- 타입없이 선언했다고해서 변수의 타입이 없는 것은 아님 : 내부적으로 정해짐
- 내부적으로 변수의 타입이 관리되기때문에 변수의 타입이 바뀔 때가 있음
1
2
3
console.log(1+1+1// 3
console.log(1+1+"1"// 21
console.log("1"+1+1// 111
cs
=> 정수가 문자열을 만나 연산되는 순간 문자열로 바뀜

- 느슨한 타입 체크때문에 예상치 못한 오류가 발생할 수 있음


[느슨한 타입 체크 위험 막기]
- 사칙 혹은 비교 연산에 의해(개발자가 기입한 값이나, 사용자가 랜덤으로 기입한 값) 변수의 타입이 변경될 수 있음
- 이를 막기위한 들어오는 값 타입 변경, 타입 체크 기능이 있음

1) 일치연산자 ( === )
1
2
3
4
5
6
var a = 1 // 
typeof(a) // "number"
 
console.log( 1 == true ) 
// true, 비교 연산을 할 때 a는 내부적으로 boolean으로 변경되고, == 비교 연산 결과 true (1은 true)
console.log( 1 === true )
// === (일치연산자) 를 가지고 비교 연산을 하면, 중간에 타입 변경없이 첫 타입으로 타입 + 값 비교
 
cs

- 내부적으로 타입 변경되는 것 없이 값을 비교하고싶다면 == (동등연산자)가 아닌 === (비교연산자)를 사용해야함
- 다시 말하지만, 선언을 할 때만 타입을 선언하지않을 뿐 내부적으로 변수의 타입이 정해짐
- 이를 막기 위한 방법을 지금 알아보고 있음(일치연산자)

2) parse~~~ : 명시적으로 타입 변환하는 함수
- 크롬 개발자도구 콘솔창을 켜서 아래 코드 결과 확인해볼 것
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var str = prompt("입력해주세요")
/*
     prompt로 받는 입력값은 string (문자열)로 타입이 정해짐
*/
typeof(str) // "string"
/*
     값을 입력받아 그대로 사칙 연산하면 문자열이기때문에
     명시적으로 변수의 타입을 변경시킨 뒤 사칙연산을 하면 됨
*/
parseInt(a)
/* 
     입력받은 값이 숫자였다면 숫자가 나올 것이고,
     숫자 아닌 아무 문자나 문자열을 입력했다면 NaN이 출력될 것
     NaN은 숫자가 아니라는 뜻으로 parseInt로 명시적인 타입 변경 오류 결과
*/
cs

- parseInt 이외에도 타입 변경 관련 함수가 있음 : 찾아보기!


[느슨한 타입]
- 처음 개발할 때에는 var 로 모든 변수의 선언이 해결되니깐 편해서 좋음
- 그러나 내부적으로 변수의 타입이 정해지고, 일부 연산자에 의해 의도치않은 변경이 이뤄질 수 있음
- 이를 막기위한 방법들이 있음 
- 자바스크립트의 변수 타입 선언 특징이 느슨한 타입이라는 것을 인지해야함


[참고자료]



댓글