-
[3주차 개인 S.A] 숙제 1 🐤 JavaScript의 자료형과 JavaScript만의 특성은 무엇일까 ?부트캠프 <항해99> 일지/3~5주차 - 리액트 입문~심화 교육 2022. 5. 20. 16:03
1. 느슨한 타입(loosely typed)의 동적(dynamic) 언어
느슨한 타입(loosely typed)과 강력한 타입(strong type)
■ 느슨한 타입은 타입 없이 변수를 선언한다.
■ 강력한 타입은 타입과 함께 변수를 선언한다
-> 느슨한 타입은 내부적으로 타입이 관리되기 때문에 타입변환과 연관이 깊다.
eg)
자바스크립트에서 변수 선언시 let greeting = 'hi!' 하는 식으로 따로 자료형을 쓰지 않는 반면,
자바에서는 string greeting = 'hi!' 하는 식으로 문자열이라고 미리 정해줘야한다.
정적(static) 언어와 동적(dynamic) 언어
가장 큰 차이는 소스 코드의 타입 체크 시점!
■ 정적언어 (C, C++, Java, C# 등)
컴파일 시점에 소스의 타입을 검사합니다. (문제가 있다면 컴파일 자체가 되지 않음)-> 변수 선언시에 들어갈 값의 형태에 따라 명시적으로 자료형을 지정해주어야 함
■ 동적언어 (JavaScript, Python, Ruby, PHP 등)
런타임(실행) 시점에 소스의 타입을 검사합니다.(소스 작성시에는 잘못된 타입이 입력되어도 문제가 없으나, 실행 시점에 문제 발생)
-> 변수 선언시에는 따로 자료형을 지정해줄 필요가 없으며, 실행시에 자료형이 결정됨
** 정적언어 = 강력한타입, 동적언어 = 느슨한 타입은 아니라고한다.
소스 코드 타입 체크 시점이 기준이라는 것만 기억해두자 :)정적 언어 동적 언어 장점 - 타입 에러로 인한 문제점을 초기에 발견할 수 있어 안정성이 높음
- 컴파일 시에 미리 타입을 결정하기 때문에 실행 속도가 빠름
- 코드의 가독성이 좋음.
- 다수의 협업이나 프로젝트의 장기 개발 및 유지보수에 유리함. (대형 프로젝트에 선호됨)- 소스코드 작성 시 타입에 대한 제한이 없기 때문에 유연성이 높음 (런타임까지 타입에 대한 결정을 끌고 갈 수 있음)
- 타입 관련하여 지켜야 할 규칙이 적기 때문에 상대적으로 코드가 짧다 = 효율적이다!단점 - 매번 코드 작성시 변수형을 결정해줘야 하는 번거로움이 있음
- 컴파일 타임에 타입에 대한 제한으로 코드 작성 시 유연함이 떨어짐- 실행 도중에 변수에 예상치 못한 자료형이 들어와 TypeError를 발생할 수 있음.
- 코드 작성시에는 에러를 모르다가, 실제 실행 되고 나서야 에러가 발생하기 때문에 코드가 길고 복잡해질 경우 타입 에러를 찾기가 어려워짐.2. JavaScript 형변환
암시적 형변환과 명시적 형변환
■ 암시적 형변환
암시적 변환은 코드 실행시 자바스크립트 엔진이 필요에 따라 자동으로 데이터타입을 변환시키는 것이다.
예를 들어, 자바스크립트에서 문자열에 사칙연산을 했을 때(+제외) 정수값이 나오는 현상이 암시적 형변환.
▷ 암시적 형변환이 발생하는 경우 :
- 연결연산자 (+) : 값을 모두 문자열로 바꾸어 연결한다. 산술의 더하기보다 우선시된다.
- 산술연산 ( +, -, *, /, %, **) : 값을 모두 숫자로 바꾸어 연산한다
- 관계비교 (<, <=, >, =>) : 값을 모두 숫자로 바꾸어 연산 후, 결과값은 불린(true or false)로 리턴한다.
- 같음비교 (==, !=) : 동등, 부등. 위와 같음. (===, !==은 암시적 형변환이 일어나지 않는다.)
- 비트 연산자 (|, &, ^, ~)
▷ 암시적 형변환이 일어나면
- 불린(Boolean) -> 숫자(Number) : true = 1, false = 0
- 다른 타입 -> 불린(Boolean) : false, null, undefined, NaN, 0, ''은 false다. (falsy값이라고 함)
이외의 문자열, 숫자 등은 모~두 true다. (문자열 'false'도 true다 ㅋㅋ) - 다른 타입 -> 문자열(String) : 출력 형태 그대로 문자열로 바뀐다
- 문자열(String) -> 숫자(Number) : 빈문자열은 0, 숫자로 변환 가능하면 숫자로, 그외에는 NaN
- null과 Undefined -> 숫자(Number) : null은 0, Undefined는 NaN이다.
- 오브젝트에도 형변환이 일어나지만.. 이건 나중에 🥲
■ 명시적 형변환
개발자가 의도를 가지고 명령어를 써서 데이터타입을 변환시키는 것이다.
숫자 (Number) 타입으로 변경시키기 : Number() , parseInt() //전자는 정수&실수형 숫자로, 후자는 정수로
문자열 (String) 타입으로 변경시키기 : String(), toString() // toString은 숫자를 ()안의 진수로 바꿔준다.
불린 (Boolean) 타입으로 변경시키기 : Boolean()
3. ==, ===
■ 동등(==)과 부등(!=) 연산자 (coercive / 느슨한등호)
두 비교값의 자료형을 일치시킨 후 비교를 한다.
즉, 암묵적 형변환이 강제로 발생한다.
■ 일치(===)와 불일치(!==) 연산자 (strict / 엄격한등호)
자료형 또한 비교대상이다. 즉, 자료형의 변환 없이,
두 피연산자가 엄격히 같은지 판별한다.
코드 작성시에는 타입 변환으로 인한 예상치 못한 오류 발생을 막기 위해,
가급적 ===과 !==를 사용하는 것이 좋다 :)
4. 느슨한 타입(loosely typed)의 동적(dynamic) 언어의 문제점은 무엇이고
보완할 수 있는 방법에는 무엇이 있을까?1번에서 비교한 것과 같이,
- 변수 및 타입 선언이 매우 유연하기 때문에 오히려 예상치 못한 타입변환으로 인해 에러가 발생할 가능성이 있고,
- 코드 작성시에는 에러를 모르다가, 실제 실행 되고 나서야 에러가 발생하게 되어 에러를 찾기 어렵고 시간이 걸린다.
느슨한 타입의 동적언어인 자바스크립트를 보완하기 위해, 2012년 마이크로소프트에서 '타입스크립트' 라는,
자바스크립트(JavaScript)를 기반으로 정적 타입 문법을 추가한 프로그래밍 언어를 발표했다.
(공식 문서에서는 타입스크립트를 자바스크립트의 슈퍼셋 (Superset) 이라고 표현하고 있다.)
자바스크립트의 문제점을 보완하기 위해, 변수에 타입을 직접 지정할 수 있게 하였다.
eg. let name: string = "hello";
5. undefined와 null의 미세한 차이 비교
undefined == null → true
undefined === null → false 이다
undefined null - 프로그램 실행시, 값이 없다는 것을 확인하는 값이다.
(자바스크립트 엔진이 변수를 초기화할 때 사용함)- 의도적으로 빈 값을 표현하기 위해 사용하는 값이다.
(개발자가 의도적으로 할당함)- 선언 후 값이 처음부터 할당되지 않은 변수이다 - 변수에 'null'이라는 값이 할당되어 있다. - 암묵적 형변환으로 숫자형 변환시 NaN이 된다 - 암묵적 형변환으로 숫자형 변환시 0 이 된다 - typeof undefined 는 undefined 이다. - typeof null은 object 이다. '부트캠프 <항해99> 일지 > 3~5주차 - 리액트 입문~심화 교육' 카테고리의 다른 글
[3주차 개인 과제] 일주일 평점 내기 (0) 2022.05.27 [3주차] 항해톡 발표 : Process와 Thread (0) 2022.05.26 [3주차 개인 S.A] 숙제 4 🐤 실습 과제 (0) 2022.05.20 [3주차 개인 S.A] 숙제 3 🐤 호이스팅과 TDZ는 무엇일까 ? (0) 2022.05.20 [3주차 개인 S.A] 숙제 2 🐤 JavaScript 객체와 불변성이란 ? (0) 2022.05.20