개발 기본 상식

출처 : https://github.com/junh0328/prepare_frontend_interview/

프로그래밍 🔥

프로그래밍이란 뭐라고 생각하나요?

프로그래밍(programming)이란 이와 같이 특정 목적을 달성하기 위해 설계된 알고리즘(algorithm)을 프로그래밍 언어를 사용하여 구체적인 프로그램으로 작성하는 과정을 가리킵니다. 간단히 프로그래밍이란 프로그램을 만드는 모든 작업이라고 볼 수 있는 것입니다.

컴파일러는 뭐고 인터프리터는 뭔가요?

  1. Compiler란? 컴파일러란?

컴파일러란 우리가 작성한 코드를 컴퓨터로

실행 가능한 코드로 컴파일 뒤 실행파일을 생성시킵니다.

이때 컴파일 도중 컴파일러는 이러한 코드의 명령(들)을 어떤 순서에 맞게

프로세서에 전달해야 하는지 결정을 하게 되며 효율적이게 최적화시킵니다.

또한 이후, 이러한 명령(들)이 또 다른 명령(들)을 기다릴 필요가 없다면,

프로세서는 이러한 명령(들)을 병렬 처리하게 됩니다.

장점과 단점.

장점 :

  • 컴파일 도중의 속도는 그다지 빠르지 않을 수 있습니다.

하지만 컴파일을 마친 실행파일은 좀 더 빠르게 실행됩니다.

그러하여 규모가 크거나 코드 자체가 긴 경우에 효과적입니다.

  • 컴파일 후 생성된 코드는 더 효과적이고 최적화되어 있습니다.

단점 :

  • 컴파일된 파일은 Windows, Mac 그리고 Linux와 같은 OS에 의존적입니다.

그러하여 Windows에서 컴파일된 파일을 Mac에서 실행하려 한다면,

Mac OS에 맞게 다시 컴파일해야 합니다.

또한 버전에 따라서 새로 컴파일해야 할 수 있습니다.

(요즘은 호환 모드를 통해서 어느 정도 오래된 버전과 다른 OS에서도

별다른 컴파일 없이 작동하지만 당연히 그 한계점은 존재합니다.)

  • 개발과 버그 fix 과정에서 좀 더 많은 노력을 요합니다.

즉 코드가 바뀌거나, 수정된다면 다시 컴파일해주어야 하기 때문입니다.

이러한 Complier를 주로 사용하는 언어는.

C, C++, Pascal, Delphi, Modula, COBOL, Fortran.

등등입니다.

  1. Interpreter란? 인터프리터란?

인터프리터란 우리의 코드를 실시간으로 읽고

컴퓨터에게 전달해 줍니다.

이때 인터프리터는 한 번에 모든 코드를 전달하는 것이 아닌

한 줄씩 번역하고 분석한 뒤 프로세서에게 전달, 실행됩니다.

이러한 작업은 코드가 끝날 때까지 실행되고,

작업 중 에러를 만나게 된다면, 곧바로 중지되며 에러를 표시합니다.

그러하여 개발자는 어느 부분에서 에러가 발생했는지

빠르고 쉽게 알 수 있고 빠르게 대처할 수 있습니다.

인터프리터는 추가로 실행파일을 생성하지 않습니다.

그렇기에 인터프리터는 따로 기계어로 변환 키지 않습니다.

단지 프로그래밍 언어와 기계 사이에 중재자 역할을 합니다.

인터프리터는 실시간으로 코드를 한 줄씩 읽고 분석한 뒤

상응하는 루틴을 인터프리터 자신의 Library를 통해

프로세서가 원하는 행동을 수행합니다.

장점과 단점.

장점 :

  • 실시간으로 인터프리터가 한 줄씩 코드를 읽고 프로세서에게 전달해 주기 때문에,

에러가 발생한다면 인터프리터는 즉각 에러를 표시합니다.

그러하여 개발자는 발 빠르게 에러를 수정할 수 있습니다.

단점 :

  • 실시간으로 일고 전달한다는 것은 컴파일러보다 빠르다고 느껴질 수 있습니다.

실제로 한 줄씩 읽고 실행시키기에 그 과정은 빠를 수 있습니다.

하지만 결과적으로는 한 줄씩 계속해서 실행하기에 컴파일러보다 느립니다.

-실시간으로 계속해서 읽고 실행한다는 것은 코드가 바뀌거나 수정되면,

다시 처음부터 순서대로 한줄씩 읽어 내려간다는 뜻입니다.

즉 비효율적입니다.

이러한 Interpreter를 사용하는 언어는.

Javascript, PHP, Python, LISP, Perl 등이 있습니다.

🤚컴파일러는 전체 소스코드를 보고 명령어를 수집하고 재구성하지만 인터프리터는 소스코드의 각 행을 연속적으로 분석하며 실행한다.

🤚 인터프리터는 고레벨 언어를 바로 기계어로 번역하지 않고 중간 형태로 변환시킨 후 실행한다. 반면 컴파일러는 고레벨 언어를 바로 기계어로 변환한다.

자바스크립트란 🔥

자바스크립트의 특징은 뭐가 있나요?

  1. 자바스크립트는 객체 기반의 스크립트 언어입니다.

  2. 자바스크립트는 동적이며, 타입을 명시할 필요가 없는 인터프리터 언어입니다.

  3. 자바스크립트는 객체 지향형 프로그래밍과 함수형 프로그래밍을 모두 표현할 수 있습니다.

변수 🔥

변수란 무엇인가요?

자바스크립트에서 변수란 값을 저장하기 위해 확보한 메모리 공간 자체 또는 메모리 공간을 식별하기 위한 식별자입니다.

식별자란 무엇인가요? 🔥

식별자는 자바스크립트에서 이름을 붙일 때 사용하는 단어이다. 식별자의 예로는 변수명과 함수명이 있다.

변수를 선언한다는 것은 어떤 것을 의미하나요?

변수나 함수의 자료형이 무엇인지 알려주는 일이 ‘선언’입니다.

그렇다면 앞으로 사용할 변수나 함수가 정수형인지 문자형인지 알려줄 필요가 있습니다. 정수형 변수임을 알려주어야 정수 자료를 정수형 변수에 대입할 수 있기 때문입니다. 변수나 함수의 자료형을 알려주는 일을 ‘변수를 선언(declaration)한다’ ‘함수를 선언한다’는 말로 표현합니다.

이처럼 ‘선언한다’라는 표현은 나중에 쓸 함수나 변수에 대한 기본골격을 미리 알려주는 것을 말합니다. 선언한다는 말은 변수나 함수에만 사용하는 것이 아닙니다. 배열이니 포인터니 공용체니 하는 것을 다룰 때도 선언한다는 말을 자주 사용합니다.

변수는 사용하기 전에 이름과 자료형을 선언해주어야 합니다.

var 키워드는 뭔가요?

변수(variable)입니다. variable의 앞 세 글짜를 따서 var입니다.

호이스팅이 뭔가요? 🔥🔥🔥🔥

함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말한다.

var 키워드의 문제점은 무엇이 있나요? 🔥🔥

  1. 같은 이름의 변수를 여러번 생성가능하다.
  2. var는 function 단위의 scope를 가진다 var를 사용할 경우, 변수 생성과 hoisting, scope를 고려하여야한다.

let 키워드는 var 키워드와 어떤 점이 다른가요? 🔥🔥🔥

var는 function-scoped이고, let, const는 block-scoped입니다.

TDZ 🔥🔥🔥

TDZ(Temporal Dead Zone) 란, 한글로 직역하자면 일시적인 사각지대란 뜻입니다. 이 일시적인 사각지대는 스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 TDZ(Temporal Dead Zone) 라고합니다.

TDZ라는 것은 변수 선언 및 초기화 하기 전 사이의 사각지대 인 것을 알 수 있습니다! 즉 변수를 선언 및 초기화 하기전에 사용하게 되면 TDZ 상태에서 사용하는 것 이기 때문에 ReferenceError 에러가 나타나게 됩니다 !!

const 키워드는 어떤 특징이 있나요? 🔥🔥

const는 상수를 만드는데 사용함. block-level scope 재할당 불가능 객체의 내용 변경 가능 가독성, 유지보수를 위해 사용

식별자 네이밍 규칙은 어떤 것들이 있나요?

*명명규칙

-공백이 들어가면 안된다.

-특수문자는 _과 $만 가능하다.

-숫자로 시작하면 안된다.

-키워드를 사용하면 안된다.

-한자,한글을 사용할 수 잇으나 영어를 사용하는게 관례이다.

-의미없는 단어보다 함축된 단어가 좋다.

-변수,인스턴스,함수,메서드의 이름은 항상 소문자로 시작한다.

-생성자 함수의 이름은 대문자로 시작한다.

네이밍 컨벤션은 어떤 것들이 있나요?

하나 이상의 영어 단어로 구성된 식별자를 만들 때 가독성 좋게 단어를 한눈에 구분하기 위해 규정한 명명 규칙

  1. 카멜 케이스 (camelCase)

  2. 스네이크 케이스 (snake_case)

  3. 파스칼 케이스 (PascalCase)

  4. 헝가리언 케이스 (typeHungarianCase)

리터럴이 뭔가요?

코드상에서 데이터를 표현하는 방식을 리터럴이라고 한다.