Q. 동등 연산자(==)와 일치 연산자(===)의 차이점을 설명해주세요.
동등 연산자(==)와 일치 연산자(===)는 모두 피연산자에 값을 비교하고 Boolean값을 반환합니다. 동등 연산자는 오직 값에 대한 비교를 수행하지만, 일치 연산자는 값과 자료형 모두를 비교합니다.
'1' == 1 // t
10 == '10' // t
0 == false // t
1 == true // t
'' == false // t
0 == '' // t
------
let a = 0;
alert( Boolean(a) ); // false
let b = "0";
alert( Boolean(b) ); // true
alert(a == b); // true!
falsy값: false, 0, "", undefined, null, NaN
------
0 === false // false
0 === '' // false
JavaScript
복사
Q. 컴파일 언어(compilation)와 인터프리터 언어(interpretation)의 차이는 무엇인가요?
컴파일 언어의 경우, 소스코드(사용자가 작성한 원시코드)를 다른 형태인 기계어로 전부 변환 시킨 후 코드를 실행하는 언어이며, 대표적으로는 C, C++, 자바 등이 있다. 인터프리터 언어는 소스코드를 기계어로 변환하는 과정 없이 한 줄씩 실시간으로 해석하며 바로 실행하는 언어이다. JavaScript, Python, Ruby 등이 있다.
컴파일 언어는 프로그래밍 언어로 짠 코드 컴파일이란 과정을 통해 다른 형태 (기계어)로 바꿔준다. 그 결과물을 실행하는 것이 컴파일 언어의 특성이다. 반면 인터프리터 언어는 코딩 후 다른 과정을 거치지 않고 코드가 그대로 실행할 곳으로 보내져서 인터프리터라는 프로그램을 통해 곧바로 통역되어 실행된다.
컴파일러 (compiler)
•
전체 파일을 스캔하여 한꺼번에 번역
•
초기 스캔시간이 오래 걸리지만, 한번 실행 파일이 만들어지고 나면 빠르다.
•
대표적인 언어로 C, C++
인터프리터 (interpreter)
•
한번에 한문장씩 번역후 실행 시키기 때문에 실행 시간이 느리다.
•
프로그램을 실행시키고 나서 오류를 발견하면 바로 실행을 중지 시킨다. 실행 후에 오류를 알 수 있다.
•
• 대표적인 언어로 Python, Ruby, Javascript 등
Java는 하이브리드 언어다.
정적 타입과 동적 타입의 특성
컴파일 언어는 정적 타입의 언어이다. 변수 등에 지정된 자료형을 바꿀 수 없다. 컴파일 시에 자료형에 맞지 않은 값이 들어있으면 컴파일 에러가 발생한다. 하지만 컴파일 시에 타입에 대한 정보를 결정하기 때문에 실행시 속도가 빠르고, 타입 에러로 인한 문제점을 초기에 발견할 수 있어 타입의 안정성을 높혀준다.
반면 인터프리터 언어는 동적 타입의 언어이다. 변수에 다른 자료형의 값(숫자형, 문자형)을 넣을 수 있다. 자료형의 일관성이 강제되지 않기 때문에 자유롭고 편한 프로그래밍이 가능하지만, 실행 시점이 되어서야 오류가 확인되거나 잘못된 자료형에 의한 오류의 위험성이 높다. JavaScript도 이런 한계를 갖는데, 이를 보완하고자 정적 타입의 TypeScript가 탄생했다. 프로그래밍 할때에는 타입스크립트로 안정적이게, 배포할 떄에는 js로 빌드해서 사용한다.
이 작업을 언제 실행하느냐에 따라 둘 중 한 범주(컴파일 언어, 인터프리터 언어)에 들어가게 됩니다. 사실 컴파일 언어에도 인터프리터가 있고, 인터프리터 언어에서도 컴파일 과정이 있다고 한다. 그렇기 때문에 해당 구분이 절대적인 것은 아니며, 어디까지나 일반적인 ‘경향’으로 기억하면 된다.