새소식

반응형
FRONTEND/기술 면접 시리즈

[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드

  • -
반응형

[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드

 

javascript 코딩 경험이 많다면 다 겪어봤을 개념들 입니다. 정확한 명칭은 생각이 안나도 개념과 흐름은 어느정도 파악하고 있는분들께는 한번더 전체적인 개념 정립에 도움이 될것입니다.

 

면접에서 자주 등장하는 자바스크립트 개념을 정리하고, 실전에서 활용할 수 있도록 예제 코드와 설명을 제공합니다.


1. 메모리 관리

자바스크립트가 메모리를 어떻게 처리하는지 이해하면 최적화된 코드를 작성할 수 있습니다.

🔹 Hoisting (호이스팅)

변수와 함수 선언이 실행 컨텍스트 생성 단계에서 어떻게 끌어올려지는지 살펴봅니다.

console.log(x); // undefined
var x = 10;

sayHello(); // "Hello"
function sayHello() {
    console.log("Hello");
}

console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 20;

console.log(add(1, 2)); // TypeError: add is not a function
var add = function(a, b) {
    return a + b;
};

📌 설명: 변수 선언은 호이스팅되지만 값 할당은 호이스팅되지 않기 때문에 undefined가 출력됩니다.

🔹 Lexical Scope (어휘적 스코프)

자바스크립트가 어휘적 환경에서 변수 접근성을 어떻게 결정하는지 이해하세요.

function outer() {
    var x = 10;
    function inner() {
        console.log(x); // 10
    }
    inner();
}
outer();

📌 설명: 내부 함수 inner는 자신을 포함하는 외부 스코프 outer의 변수 x에 접근할 수 있습니다.

반응형

🔹 Closures (클로저)

클로저는 함수가 부모 함수 실행 후에도 변수에 접근할 수 있도록 합니다.

function outerFunc() {
    var count = 0;
    return function() {
        count++;
        return count;
    };
}
var counter = outerFunc();
console.log(counter()); // 1
console.log(counter()); // 2

📌 설명: count 변수는 outerFunc가 종료된 후에도 counter 함수가 유지하면서 값을 증가시킬 수 있습니다.

🔹Scope & Closure Chaining (스코프 및 클로저 체이닝)

중첩 스코프의 개념과 클로저를 사용하여 private 변수와 캡슐화를 만드는 방법을 깊이 탐구하세요.

function outer() {
    var privateVar = "secret";
    return function inner() {
        return privateVar;
    };
}
var getSecret = outer();
console.log(getSecret()); // "secret"

설명: privateVar는 외부에서 직접 접근할 수 없으며, inner 함수를 통해서만 접근할 수 있어 캡슐화를 구현합니다.


2. 런타임 환경

자바스크립트 코드가 실행되는 방식을 이해하면 성능 최적화와 디버깅에 도움이 됩니다.

🔹 Execution Context (실행 컨텍스트)

자바스크립트 실행 컨텍스트 스택을 이해하고 코드가 어떻게 실행되는지 살펴보세요.

function outer() {
    console.log("Outer start");
    function inner() {
        console.log("Inner");
    }
    inner();
    console.log("Outer end");
}
outer();

📌 설명: outer가 실행되면 inner가 호출되고, 실행이 끝나면 컨텍스트가 스택에서 제거됩니다.

🔹 Event Loop (이벤트 루프)

이벤트 루프를 통해 비동기 작업이 어떻게 처리되는지 이해하세요.

console.log("Sync 1");
setTimeout(() => console.log("Async"), 0);
console.log("Sync 2");

📌 설명: 동기 코드가 먼저 실행되고, setTimeout의 콜백은 이벤트 루프를 통해 나중에 실행됩니다.

 

🔹 Microtask Queue (마이크로태스크 큐)

마이크로태스크 큐와 특정 작업이 다른 작업보다 우선적으로 처리되는 방식을 이해하세요.

Promise.resolve().then(() => console.log("Microtask"));
console.log("Sync");

설명: console.log("Sync")가 먼저 실행된 후, 마이크로태스크 큐에 있던 Promise.then()이 실행되면서 Microtask가 출력됩니다

 

🔹 Callback Queue (콜백 큐)

콜백이 자바스크립트에서 어떻게 처리되는지와 비동기 작업 관리를 위한 사용법을 탐구하세요.

setTimeout(() => console.log("Callback"), 0);
console.log("Sync");

설명: console.log("Sync")가 먼저 실행되고, setTimeout의 콜백은 콜백 큐를 통해 나중에 실행됩니다.

 


3. 비동기 처리

비동기 작업을 효율적으로 다루는 것은 프론트엔드 개발에서 매우 중요합니다.

🔹 Promises (프로미스)

const promise = new Promise((resolve) => {
    setTimeout(() => resolve("Done"), 1000);
});
promise.then((result) => console.log(result)); // "Done" after 1 second

📌 설명: 프로미스는 비동기 작업 완료 후 .then()을 사용하여 결과를 처리합니다.

 

🔹  Callbacks (콜백)

콜백은 비동기 코드의 흐름을 제어하는 중요한 개념입니다. 비동기 작업이 완료된 후 실행될 함수를 인자로 전달하여, 원하는 시점에 실행할 수 있도록 합니다.

✅ 예제 코드

function fetchData(callback) {
    setTimeout(() => callback("Data received"), 1000);
}
fetchData((data) => console.log(data)); // "Data received" after 1 second

📌 설명:

  • fetchData 함수는 1초 후에 데이터를 가져오는 시뮬레이션을 합니다.
  • setTimeout을 사용하여 1초 후 callback("Data received")을 실행합니다.
  • fetchData를 호출할 때, 콜백 함수 (data) => console.log(data)를 전달하므로 1초 후 "Data received"가 출력됩니다.

 

🔹 Async/Await (비동기/대기)

async function fetchData() {
    const response = await new Promise((resolve) => {
        setTimeout(() => resolve("Data"), 1000);
    });
    console.log(response); // "Data" after 1 second
}
fetchData();

📌 설명: await를 사용하여 동기 코드처럼 비동기 처리를 쉽게 이해할 수 있습니다.


4. 객체 참조

자바스크립트의 객체 지향적 특성을 이해하면 보다 강력한 코드 작성이 가능합니다.

🔹 'this' 키워드

const obj = {
    name: "John",
    greet: function() {
        console.log(this.name);
    }
};
obj.greet(); // "John"

📌 설명: this는 obj를 가리키므로 name 속성에 접근할 수 있습니다.

 

🔹 Prototypes (프로토타입)

function Person(name) {
    this.name = name;
}
Person.prototype.greet = function() {
    console.log(`Hello, ${this.name}`);
};
const person = new Person("Alice");
person.greet(); // "Hello, Alice"

📌 설명: 프로토타입 체인을 활용하여 메서드를 상속받을 수 있습니다.

 

🔹 __proto__ 와 프로토타입 체인

자바스크립트는 프로토타입 기반의 객체 지향 언어입니다. 모든 객체는 __proto__ 속성을 가지며, 이를 통해 프로토타입 체인을 따라가면서 상속된 속성이나 메서드를 찾을 수 있습니다.

✅ 예제 코드

function Person() {}
const person = new Person();
console.log(person.__proto__ === Person.prototype); // true

📌 설명:

  • Person 생성자를 사용해 person 객체를 생성합니다.
  • person.__proto__는 Person.prototype을 참조하므로 true가 출력됩니다.
  • 이를 통해 person 객체는 Person.prototype에 정의된 메서드나 속성에 접근할 수 있습니다.

💡 참고:
프로토타입 체인을 이용하면 여러 객체가 동일한 메서드를 공유할 수 있어 메모리 효율성이 높아집니다.

 

🔹 Call, Apply, Bind

function greet() {
    console.log(`Hello, ${this.name}`);
}
const obj = { name: "John" };
greet.call(obj); // "Hello, John"

📌 설명: call()을 사용하여 this를 obj로 설정할 수 있습니다.


마무리

이 가이드를 활용하여 자바스크립트 개념을 확실히 이해하고 면접 대비를 철저히 하세요. 개념을 연습하고 샘플 면접 질문을 풀어보면 더욱 효과적인 준비가 가능합니다.

 

 

 

함께보면 좋은글

[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)

 

[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)

React에서 디바운스(Debounce) 구현하기React 애플리케이션을 개발하다 보면, 상태(state)가 빠르게 여러 번 변경될 때 불필요한 렌더링이나 성능 저하를 방지해야 할 상황이 종종 발생합니다. 이럴 때

intelloper.tistory.com

JSON 성능 최적화

 

JSON 성능 최적화

JSON은 웹 개발에 널리 채택되고 있지만 속도 문제가 없는 것은 아닙니다. 이 형식은 사람이 읽을 수 있는 특성으로 인해 데이터 페이로드(전송되는 '순수한 데이터')가 커지고 처리 시간이 느려

intelloper.tistory.com

 

[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자

 

[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자

소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유

intelloper.tistory.com

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.