JavaScript의 자료형과 JavaScript만의 특성

bo-oram·2022년 5월 20일
0

가끔 보는 IT지식

목록 보기
2/6
post-custom-banner

느슨한 타입(loosely typed)의 동적(dynamic) 언어?

느슨한 타입: 타입 없이 변수를 선언하는 것이라고 할 수 있다. 자바스크립트는 내부적으로 타입이 관리되기 때문에 선언 시 타입 없이 선언할 수 있다 강력한타입(strong typing)을 사용하는 자바는는 선언시에 int인지 String인지 등 타입과 함께 선언해야 한다

동적언어: 변수의 타입이 실행하면서 바뀌는 것을 허용하는 언어이다
코드를 컴파일하는 시점에 타입을 알 수 있으면 정적 타입, 실행 후 타입을 알 수 있다면 동적 타입이라고 할 수 있다


[ 정적, 동적 언어의 장단점 ]

정적타입 언어의 장단점: 자료형에 맞지 않는 값이 선언되어 있을 경우 컴파일 에러를 발생한다 즉 컴파일 시 변수 타입을 체크하기 때문에 타입에러로 인한 문제점을 빨리 발견할 수 있으며 컴파일 시 타입을 결정하기 때문에 실행속도가 빠르다. 반면 매번 일일이 변수의 타입을 선언해 주어야하는 번거러움이 있다
정적 타입 언어: Java, C, C++, C#, Scala, Fortran, Haskell, ML, Pascal 등

동적타입 언어의 장단점: 매번 타입을 선언할 필요가 없어 비교적 빠르게 코드를 작성할 수 있고, 실행 시 타입이 결정되므로 유연성이 높다. 하지만 예상치 못한 타입이 들어와 에러를 발생시킬 수 있다 이를 보완하기 위해 TypeSclipt나 Flow등을 사용할 수 있다(Groovy, Python, JavaScript, Ruby, Smalltalk, Lisp, Objective-C, PHP, Prolo)


[ JavaScript 형 변환 ]

자바스크립트의 형변환에는 연산자 사용으로 인해 자연적으로 변환하는 암시적 형 변환과 프로그래머가 자료형을 정해서 변환하는 명시적 형 변환이 있다

암시적 형 변환: 더하기(+)연산을 하면 숫자보다 문자열이 우선시 되기 때문에 숫자와 문자가 연산되면 숫자를 문자형으로 변환하여 연산한다 하지만 그 외 연산자(-, *, /, %)는 숫자를 우선시 하기 때문에 변환되지 않는다.
엄격하지 않은 동치(==) 비교시에도 변환은 일어난다. 만약 "1" == 1 로 비교한다면 true로 반환된다. 문자 1과 숫자 1은 다르지만 한쪽 또는 양쪽이 형 변환을 거친 후 비교되기 때문이다. 만약 ===의 일치연산자를 사용한다면 타입변환 없이 타입 동등 여부까지 비교하기 때문에 "1" == 1은 false로 반환될 것이다.

명시적 형 변환: 개발자가 의도를 가지고 Object(), Number(), String(), Boolean()등을 이용하여 변환한 것이다


[ null과 undefined ]

두 타입은 모두 '값이 없음'을 나타낸다. 다른점은 undefined은 변수를 선언하고 값을 할당하지 않은 상태, null은 변수를 선언하고 빈 값을 할당한 상태(빈 객체)이다. 즉, undefined는 자료형이 없는 상태이다. undefined도 할당 할 수 있지만 비어있는 값을 선언할때는 null의 이용을 권장한다

**undefined의 경우 typeof로 출력하면 undefined가 나온다. null은 출력하면 object로 출력된다. 이는 여전히 원시 타입(primitive value)로, JavaScript에서는 구현 버그로 간주한다.


[ TypeSclipt와 Flow ]

이번엔 위에서 이야기한 TypeSclipt와 Flow에 대해 더 자세히 알아보자 다시 한번 정리하면 **자바스크립트는 동적인 언어로서의 문제점은 타입의 변경이 너무나도 쉬우면서, 실행 시 타입을 알 수 있기 때문에 테스트 시 안보였던 버그가 서비스 운영시 생길 수 있다는 점**이다. 이를 보완 하기 위에 나온 아이들이 TypeSclipt와 Flow이다 **이 둘은 자바스크립트에 정적 타입 시스템을 도입하는 것으로 코드만 봐서는 숩게 구분 할 수 없을 정도로 비슷하지만 그 목표는 확연히 다르다**
플로우의 목표: 비록 간혹 제대로 된 프로그램을 안통과시켜 줘서 프로그래머의 불편을 초래하는 한이 있더라도 문제가 생길 수 있는 프로그램을 최대한 잡아내는게 목표
타입스크립트의 목표: 안전하고 증명 가능하게 올바른 타입 시스템은 목표가 아니며 올바름과 생산성 사이에 균형을 잡는 것이 목표다

아래 링크를 참고하면 TypeSclipt와 Flow를 더 자세히 알 수 있다
TypeScript와 Flow: 자바스크립트 개발에 정적 타이핑 도입하기
(내 생각에 영상속 개발자는 TypeSclipt를 좀 사랑한다...)


profile
매일 도망가는 나 잡아오기
post-custom-banner

0개의 댓글