Java Script ES5와 ES6의 차이점
AI-X 과정을 열심히 무사히 수료하고 취업 겸 기술 면접을 준비하며 공부했던 내용들을 정리해볼 계획이다.
JavaScript
JavaScript는 HTML과 CSS와 함께 사용되어 웹 페이지에 인터랙티브한 요소를 추가하는 프로그래밍 언어이다.
JS 특징
- 동적 타이핑 (Dynamic Typing): 변수의 타입을 선언할 필요 없이 변수에 저장된 값에 따라 자동으로 데이터 타입이 결정된다.
let variable = "Hello, world!"; // 문자열로 시작
console.log(typeof variable); // "string"
variable = 42; // 숫자로 변경
console.log(typeof variable); // "number"
- 객체 기반 (Object-Based): JavaScript는 모든 것이 객체로 표현될 수 있다. 특히 JSON(JavaScript Object Notation)이라는 데이터를 쉽게 처리할 수 있다.
let person = {
name: "Alice",
age: 25,
greet: function() {
console.log("Hello, " + this.name);
}
};
person.greet(); // "Hello, Alice"
- 프로토타입 기반 (Prototype-Based): JavaScript의 상속은 클래스 기반이 아닌 프로토타입을 통해 이루어진다. 즉 객체는 다른 객체를 상속받을 수 있으며, 모든 객체는 자신의 프로토타입 객체로부터 속성 및 메소드를 상속받는다. 이를 통해 객체 간 상속을 구현할 수 있다.
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(this.name + ' makes a noise.');
};
let dog = new Animal('Dog');
dog.speak(); // "Dog makes a noise."
- 비동기 처리 (Asynchronous Processing): JavaScript는 콜백 함수, Promise, async/await 를 통해 비동기 작업을 지원한다. 비동기 처리는 웹 페이지나 애플리케이션의 응답성을 유지하면서 긴 작업을 수행하는 데 유용하다.
- 콜백 함수 (Callback Functions)
콜백 함수는 다른 함수에 인수로 전달되어 실행되는 함수이다. JavaScript 는 기본적으로 비동기 처리를 위해 콜백 패턴을 많이 사용하는데, 특히 오래 걸리는 작업이 완료된 후 실행해야 할 작업을 지정할 때는 콜백 함수를 사용한다.
function fetchData(callback) {
setTimeout(() => {
callback('Data fetched');
}, 1000);
}
function logData(data) {
console.log(data);
}
fetchData(logData);
fetchData 함수는 1초 후에 콜백 함수로 전달된 logData를 실행하면서 데이터를 출력한다.
but, 여러 개의 콜백 함수가 중첩되면 코드가 복잡해지고 가독성이 떨어지는 '콜백 지옥' 문제를 야기할 수 있어 주의해야 한다.
- Promise
Promise는 콜백 패턴의 단점을 보완하기 위해 등장한 객체이다. Promise는 비동기 작업이 성공 혹은 실패 시의 처리 내용을 정의할 수 있어 콜백 지옥을 피할 수 있고 가독성 높은 코드를 작성할 수 있다.
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched');
}, 1000);
});
promise
.then(data => console.log(data)) // 성공 시 실행
.catch(error => console.log(error)); // 실패 시 실행
1초 후 데이터를 성공적으로 가져오면 콘솔에 데이터를 출력하고, 실패할 경우 catch블록에서 에러를 처리할 수 있다.
- async/await
async/await는 Promise를 더 간결하고 직관적으로 사용하기 위한 문법이다. await는 Promise가 처리될 때까지 기다리게 하며, 비동기 코드를 동기적으로 작성할 수 있게 한다. 예외 처리 또한 try/catch 블록으로 간단하게 처리 가능.
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched');
}, 1000);
});
}
async function getData() {
try {
const data = await fetchData();
console.log(data);
} catch (error) {
console.error(error);
}
}
getData();
getData 함수는 fetchData의 Promise가 완료될 때까지 기다린다. await 키워드로 인해 동기적으로 작성된 코드 같지만, 실제로는 비동기 작업을 처리하고 있음.
ES 란?
ES (ECMAScript) 는 JavaScript 의 표준 스펙이다. 즉 자바스크립트 언어가 준수해야 할 규칙 및 세부 사항, 지침이라고 할 수 있다.
뒤에 숫자는 버전을 의미하는데 ES5(2009년) ES6(2015년)에 각각 출시하였다.
ES6이후 매년 새로운 버전이 출시되고 있지만, 자바 스크립트에서 큰 전환점이 되는 두 가지 주요 버전이기에 차이점을 알아보자
ES5와 ES6의 주요 차이점
1. let과 const (변수 선언)
- ES5 : 변수 선언 시 var만 사용함
- ES6 : 새로운 변수 선언 키워드인 let과 const가 도입됨
- let : 블록 스코프 변수를 선언
- const : 상수 선언으로, 한 번 값을 할당하면 변경할 수 없음
// ES5
var name = "John";
// ES6
let age = 30;
const PI = 3.14159;
2. 화살표 함수 (Arrow Functions)
- ES5 : 함수 선언은 일반 함수 또는 익명 함수로 작성됨
- ES6 : 화살표 함수가 도입되면서 간결한 함수 표현 가능. 특히, 화살표 함수는 this를 바인딩하지 않아, 콜백 함수에서 this 문제를 해결할 수 있음
// ES5
var add = function(a, b) {
return a + b;
};
// ES6
const add = (a, b) => a + b;
3. 템플릿 리터럴 (Template Literals)
- ES5 : 문자열을 연결할 때 + 연산자를 사용하여 여러 줄 문자열을 작성해야 함
- ES6 : 백틱(`)을 사용한 템플릿 리터럴이 도입되어, 문자열 내에서 변수를 삽입하거나 여러 줄을 쉽게 작성 가능
// ES5
var message = "Hello, " + name + "!";
// ES6
let message = `Hello, ${name}!`;
4. 클래스 (Classes)
- ES5 : JavaScript는 원래 클래스 기반 언어가 아니었기 때문에, 프로토타입을 사용하여 객체를 상속받고 확장함
- ES6 : 클래스를 위한 문법이 추가되어 객체 지향 프로그래밍이 더 직관적으로 작성 가능
// ES5
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log("Hello, " + this.name);
};
// ES6
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, ${this.name}`);
}
}
5. 모듈 (Modules)
- ES5 : JavaScript는 원래 모듈 시스템을 지원하지 않으므로 require.js와 같은 외부 라이브러리를 사용해야 함
- ES6 : import와 export 키워드를 사용하여 모듈 시스템을 지원
// ES6 모듈 예시
// person.js
export const name = "John";
// main.js
import { name } from './person';
console.log(name); // John
6. Promise
- ES5 : 콜백 함수로 비동기 작업 처리
- ES6 : Promise 객체가 도입되어 비동기 작업을 더욱 간단하고 직관적으로 처리할 수 있게 됨
// ES5
function fetchData(callback) {
setTimeout(function() {
callback('Data fetched');
}, 1000);
}
// ES6
const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve('Data fetched'), 1000);
});
};
fetchData().then(data => console.log(data));
7. 전개 연산자 (Spread Operator)
- ES5 : 배열이나 객체의 값을 복사하거나 병합할 때는 concat이나 apply 등 을 사용해야 함
- ES6 : 전개 연산자 ... 가 도입되어 배열이나 객체의 값을 쉽게 복사하고 병합할 수 있음
// ES6
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];
console.log(arr2); // [1, 2, 3, 4, 5]