JS를 쓰다보니 한 가지가 빠진 느낌이 들었다.
변수선언시 데이터타입이 없었다!
//Java
int a = 1;
//JS
let b = 1;
변수선언시 데이터타입을 지정해줘야하는 Java와 달리 JS는 변수선언하고 값을 할당하는 과정에서 자동으로 타입을 지정합니다.
즉, JS는 loosely typed의 동적(dynamic)언어라 가능합니다.
그럼 lossely typed 그리고 동적언어가 뭘까?
데이터 유형은 기본적으로 특정 변수가 저장할 수 있는 값의 타입과 수행할 수 있는 작업 종류를 컴파일러에 나타냅니다.
예를들면 char(문자),int(정수),double(실수)....
하지만 느슨한 유형의 언어는 변수 데이터 유형에 대해 유연성을 가집니다. 이러한 유형의 언어로 컴파일이 수행되면 컴파일러는 데이터 유형에 따른 사소한 오류를 무시하고 보유하고 있는 데이터 유형에 관계없이 정의된 모든 작업을 수행합니다.
예를 들어 명시적 형변환이 없는 상황에서 String타입과 int 타입을 결합을 할 경우
파이썬 :
var a = 1
var b = 1+"test"
print(b)
#SyntaxError: invalid syntax
파이썬에서 쓰지 않는 에러라는 문구가 뜨지만,
자바스크립트 :
```
let a = 1
let b = a + "test"
alert(b)
// 결과 : 1test
```
결과가 int 데이터 타입의 a의 값과 String 타입의 "test"가 합쳐져 1text라는 결과가 나왔습니다.
다시 정리하면 아무런 관련이 없는 유형 간의 변환을 암시적으로 수행이 가능합니다.
프로그래밍 언어에는 값이 올바르게 할당 되었는지 확인하는 시스템이 있습니다. 이를 type checking이라고 하는데 Dynamic의 타입확인을 컴파일때 하는 것이 아니라 런타임 때 합니다.
그렇기 때문에 static typed의 경우 미리 데이터타입을 명시하여 컴파일시 확인을 할 수 있도록 해줘야 하지만 Dynamic typed의 경우는 프로그램이 실행 중일 때 변수의 유형에 대해 감지할 수 있어서 따로 데이터 타입을 지정하지 않아도 됩니다.
느슨한 타입의 동적타입 언어이기 때문에 데이터타입과 관련된 오류의 원인을 찾기가 힘듭니다. 코드가 길고 복잡해지면.... 그렇기때문에 데이터타입 확인은 선택이 아닌 필수로 하면서 보완하거나 타임스크립트나 Flow를등을 이용하면서 디버깅을 해야할것같습니다.
출처 및 참고
Statically v. dynamically v. strongly v. weakly typed languages
strongly typed programming language
Strong and weak typing
Statically Typed Vs Dynamically Typed Languages
Dynamic typing vs. static typing