Node.js에서의 JavaScript 기본 (JavaScript Basics in Node.js)
Node.js는 서버 사이드에서 JavaScript를 실행할 수 있는 환경을 제공하며, 클라이언트 사이드와 서버 사이드 모두에서 JavaScript를 사용하는 것이 가능합니다. 이 문서에서는 JavaScript의 기본 문법, 최신 ES6+ 문법, 비동기 프로그래밍, 그리고 객체 지향 프로그래밍 개념을 Node.js 환경에서 어떻게 활용할 수 있는지 자세히 설명합니다.
자바스크립트 문법 복습 (Review of JavaScript Syntax)
JavaScript는 웹 개발에서 널리 사용되는 프로그래밍 언어입니다. Node.js에서는 JavaScript를 사용하여 서버 사이드 애플리케이션을 개발할 수 있으며, JavaScript의 기본 문법은 다음과 같습니다.
변수 선언 (Variable Declaration)
JavaScript에서는 변수를 선언할 때 var
, let
, const
를 사용할 수 있습니다.
var
: 함수 스코프를 가지며, 변수 재선언과 재할당이 가능합니다.let
: 블록 스코프를 가지며, 변수 재할당이 가능하지만 재선언은 불가능합니다.const
: 블록 스코프를 가지며, 상수 값을 선언할 때 사용됩니다. 재할당이 불가능하지만 객체의 프로퍼티는 수정할 수 있습니다.
var name = 'John'; // var 사용 let age = 30; // let 사용 const PI = 3.14; // const 사용 name = 'Jane'; // 가능 age = 31; // 가능 PI = 3.1415; // 오류 발생: Assignment to constant variable
데이터 타입 (Data Types)
JavaScript의 기본 데이터 타입은 다음과 같습니다.
- 문자열 (String): 텍스트 데이터를 표현합니다.
let message = 'Hello, World!';
- 숫자 (Number): 정수와 부동 소수점 숫자를 표현합니다.
let count = 42; let price = 19.99;
- 불리언 (Boolean): 참(
true
)과 거짓(false
)을 표현합니다.
let isActive = true;
- 배열 (Array): 여러 값을 저장할 수 있는 리스트입니다.
let fruits = ['apple', 'banana', 'cherry'];
- 객체 (Object): 키-값 쌍으로 데이터를 저장합니다.
let person = { name: 'Alice', age: 25 };
함수 정의와 호출 (Function Definition and Invocation)
함수는 코드의 재사용을 가능하게 하며, JavaScript에서 함수를 정의하고 호출하는 방법은 다음과 같습니다.
// 함수 정의 function greet(name) { return `Hello, ${name}!`; } // 함수 호출 console.log(greet('John')); // Output: Hello, John!
ES6+ 문법 소개 (Introduction to ES6+ Syntax)
ECMAScript 6(ES6) 이후에는 JavaScript에 많은 기능이 추가되었습니다. ES6+의 주요 기능을 소개합니다.
화살표 함수 (Arrow Functions)
화살표 함수는 간결한 함수 표현식을 제공합니다. function
키워드 대신 =>
를 사용합니다.
// 기존 함수 표현식 const add = function(a, b) { return a + b; }; // 화살표 함수 const add = (a, b) => a + b; console.log(add(2, 3)); // Output: 5
템플릿 리터럴 (Template Literals)
템플릿 리터럴은 문자열을 더 쉽게 작성할 수 있도록 해줍니다. 백틱(``)을 사용하여 문자열을 정의하고,
${}`를 사용하여 변수를 삽입할 수 있습니다.
let name = 'John'; let age = 30; let message = `Hello, my name is ${name} and I am ${age} years old.`; console.log(message); // Output: Hello, my name is John and I am 30 years old.
비구조화 할당 (Destructuring Assignment)
비구조화 할당을 사용하면 배열이나 객체의 값을 개별 변수로 쉽게 추출할 수 있습니다.
// 배열 비구조화 const numbers = [1, 2, 3]; const [one, two, three] = numbers; console.log(one, two, three); // Output: 1 2 3 // 객체 비구조화 const person = { name: 'Alice', age: 25 }; const { name, age } = person; console.log(name, age); // Output: Alice 25
비동기 프로그래밍 이해 (Understanding Asynchronous Programming)
비동기 프로그래밍은 동시 작업을 처리하는 데 중요한 개념입니다. JavaScript에서는 콜백, 프로미스, async/await
를 사용하여 비동기 작업을 관리할 수 있습니다.
콜백 함수 (Callback Functions)
콜백 함수는 다른 함수에 인수로 전달되어 작업이 완료된 후 실행되는 함수입니다.
function fetchData(callback) { setTimeout(() => { callback('Data loaded'); }, 1000); } fetchData((message) => { console.log(message); // Output: Data loaded });
프로미스 (Promises)
프로미스는 비동기 작업의 완료나 실패를 나타내는 객체입니다. then
과 catch
메서드를 사용하여 결과를 처리할 수 있습니다.
let promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('Data loaded'); }, 1000); }); promise .then((message) => { console.log(message); // Output: Data loaded }) .catch((error) => { console.log(error); });
async/await
async
와 await
를 사용하면 비동기 코드를 동기적으로 작성할 수 있어 가독성이 높아집니다. async
함수는 항상 프로미스를 반환하며, await
는 프로미스가 해결될 때까지 기다립니다.
function fetchData() { return new Promise((resolve) => { setTimeout(() => { resolve('Data loaded'); }, 1000); }); } async function loadData() { try { let message = await fetchData(); console.log(message); // Output: Data loaded } catch (error) { console.log(error); } } loadData();
JavaScript의 객체지향 프로그래밍 개념 (Object-Oriented Programming Concepts in JavaScript)
JavaScript는 객체지향 프로그래밍(OOP) 개념을 지원하며, 객체를 사용하여 데이터와 메서드를 묶어 관리할 수 있습니다.
클래스와 객체 (Classes and Objects)
ES6부터 클래스 문법이 도입되었습니다. 클래스는 객체를 생성하는 청사진을 제공하며, 생성자와 메서드를 포함할 수 있습니다.
// 클래스 정의 class Person { constructor(name, age) { this.name = name; this.age = age; } greet() { return `Hello, my name is ${this.name}`; } } // 객체 생성 const person = new Person('Alice', 25); console.log(person.greet()); // Output: Hello, my name is Alice
상속 (Inheritance)
상속을 통해 기존 클래스의 속성과 메서드를 자식 클래스에서 재사용할 수 있습니다.
class Animal { constructor(name) { this.name = name; } speak() { return `${this.name} makes a noise.`; } } class Dog extends Animal { speak() { return `${this.name} barks.`; } } const dog = new Dog('Rover'); console.log(dog.speak()); // Output: Rover barks.
캡슐화 (Encapsulation)
캡슐화는 객체의 속성을 보호하고, 공개된 메서드를 통해 속성에 접근하는 원칙입니다. ES6에서는 #
를 사용하여 private 필드를 정의할 수 있습니다.
class Counter { #count = 0; increment() { this.#count++; } getCount() { return this.#count; } } const counter = new Counter(); counter.increment(); console.log(counter.getCount()); // Output: 1
이 문서에서는 JavaScript의 기본 문법, ES6+의 새로운 기능, 비동기 프로그래밍, 그리고 객체지향 프로그래밍 개념을 Node.js 환경에서 어떻게 활용할 수 있는지 상세히 설명하였습니다. 이러한 개념들을 이해하고 활용하면, Node.js를 사용하여 강력한 서버 사이드 애플리케이션을 개발하는 데 큰 도움이 될 것입니다.