class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, myname is ${this.name} and I am ${this.age} years old.`);
}
}
class Employee extends Person {
constructor(name, age, jobTitle) {
super(name, age);
this.jobTitle = jobTitle;
}
work() {
console.log(${this.name} is working as a ${this.jobTitle}.);
}
}
const employee1 = new Employee("John Doe", 30, "Software Engineer");
employee1.greet();
employee1.work();
모듈 (Modules)
코드를 모듈 단위로 나누어 재사용성과 유지보수성을 높임
import와 export를 사용하여 모듈을 불러오거나 내보낼 수 있음
// math.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
Map: 키-값 쌍을 저장하는 데이터 구조, 객체와 유사하지만 키로 어떤 값을 사용할 수 있음
Set: 중복되지 않는 값을 저장하는 데이터 구조
const map = new Map();
map.set("name", "John");
map.set("age", 30);
console.log(map.get("name")); // "John"
const set = new Set([1, 2, 3, 4, 4, 5]);
console.log(set.size); // 5 (중복된 값은 하나로 처리됨)
활용 및 실전 적용
변수 선언 시 let과 const 사용
템플릿 리터럴을 활용한 문자열 처리
화살표 함수를 사용하여 간결한 함수 표현 및 this 바인딩 관리
클래스를 사용한 객체지향 프로그래밍
모듈을 활용하여 코드의 재사용성 향상(컴포넌트 등)
디스트럭처링 할당, 기본 매개변수, 스프레드 연산자로 코드 간결화
프로미스를 사용하여 비동기 작업 처리 개선
정리
JavaScript ES6는 다양한 새로운 문법을 제공하여 개발자가 더 효율적이고 간결한 코드를 작성할 수 있게 도움
최신 브라우저에서 ES6를 지원하며, 구형 브라우저에서는 트랜스파일러를 사용하여 호환 가능
주요 문법: let/const, 템플릿 리터럴, 화살표 함수, 클래스, 모듈, 디스트럭처링 할당, 기본 매개변수, 스프레드 연산자, 프로미스
실제 프로젝트에 적용하여 개발 효율성을 높여보자!
그 외의 JavaScript 문법들
JSON (JavaScript Object Notation) - ES5
JavaScript 객체를 쉽게 문자열로 변환하거나, 문자열을 객체로 변환하는 데 사용되는 데이터 포맷
JSON.stringify(), JSON.parse() 메서드를 사용하여 JSON 데이터를 다룰 수 있음
const person = { name: "John", age: 30 };
const jsonString = JSON.stringify(person); // 객체를 문자열로 변환
const parsedObject = JSON.parse(jsonString); // 문자열을 객체로 변환
Array 메서드들 - ES5
배열을 다루는 데 편리한 메서드들이 추가되었음
forEach(), map(), filter(), reduce(), some(), every(), indexOf(), lastIndexOf() 등
const numbers = [1, 2, 3, 4, 5];
numbers.forEach(num => console.log(num)); // 배열의 각 요소를 출력
const doubled = numbers.map(num => num * 2); // 배열의 각 요소를 2배로 변경
const even = numbers.filter(num => num % 2 === 0); // 배열에서 짝수만 추출
const person = {
name: "John",
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
const greetBound = person.greet.bind(person); // 함수의 this 값을 person 객체로 지정
greetBound(); // "Hello, my name is John" 출력
Object 메서드들 - ES5
객체를 다루는 데 도움을 주는 메서드들이 추가되었습니다.
Object.create(), Object.keys(), Object.values(), Object.freeze(), Object.assign() 등
const person = { name: "John", age: 30 };
const keys = Object.keys(person); // 객체의 키를 배열로 반환
const values = Object.values(person); // 객체의 값들을 배열로 반환
const frozenPerson = Object.freeze(person); // 객체를 동결 (프로퍼티 변경 불가)
const person2 = Object.create(person); // person 객체를 상속하는 새로운 객체 생성
const combinedObj = Object.assign({}, person, { job: "Software Engineer" }); // 객체 병합
String 메서드들 - ES5 & ES7
문자열을 다루는 데 도움을 주는 메서드들이 추가되었습니다.
trim(), startsWith(), endsWith(), includes(), repeat() 등
const str = " Hello, World! ";
console.log(str.trim()); // 공백이 제거된 문자열 반환
console.log(str.startsWith("Hello")); // 문자열이 "Hello"로 시작하는지 확인
console.log(str.endsWith("World!")); // 문자열이 "World!"로 끝나는지 확인
console.log(str.includes("World")); // 문자열에 "World"가 포함되어 있는지 확인
console.log("Hello".repeat(3)); // 문자열을 3번 반복
async/await - ES8
비동기 작업을 동기적으로 처리할 수 있는 문법으로 프로미스를 더욱 쉽게 사용할 수 있게 함
object는 접근하고자 하는 객체를 나타내며, property는 object 내부의 속성을 나타냅니다. method는 property의 값이 함수일 경우 해당 함수를 호출하는 것을 의미합니다.
물음표(?)는 해당 속성이 존재하지 않을 수도 있음을 나타내며, 만약 해당 속성이 존재하지 않으면 undefined를 반환합니다.
Optional Chaining을 사용하면 중첩된 객체 내부의 속성에 접근하는 도중 발생할 수 있는 TypeError와 같은 에러를 방지할 수 있습니다.
const person = {
name: "Alice",
address: {
street: "123 Main St",
city: "Anytown",
state: "CA",
zip: "12345"
}
};
Optional Chaining (계속)
만약 person 객체 내부의 address 속성이 없을 경우, 다음과 같이 Optional Chaining을 사용하여 에러를 방지할 수 있습니다.
const city = person.address?.city;
Optional Chaining (계속)
위의 코드에서 ?.은 person 객체 내부의 address 속성이 존재할 경우 city 속성을 반환하고, 그렇지 않을 경우 undefined를 반환합니다.
번외
비동기의 역사 - JQuery Callback 지옥부터 async/await까지콜백 지옥(Callback Hell)은 비동기 프로그래밍, 특히 jQuery와 같은 라이브러리를 사용할 때 발생할 수 있는 문제입니다. 콜백 지옥은 중첩된 콜백 함수들이 가독성을 해치고 코드 유지 관리를 어렵게 만드는 현상을 말합니다. 이 문제를 이해하기 쉽게 설명하기 위해, 다음과 같이 구성하겠습니다.
콜백 함수란?
콜백 지옥이 발생하는 이유
콜백 지옥의 문제점
콜백 지옥 해결 방법
1. 콜백 함수란?
2. 콜백 지옥이 발생하는 이유
비동기 작업이 순차적으로 실행되어야 할 때
여러 비동기 작업이 종속되어 있을 때
예외 처리가 필요한 경우
3. 콜백 지옥의 문제점*
콜백 지옥은 다음과 같은 문제를 야기합니다:
가독성 저하: 중첩된 콜백 함수들이 코드를 읽기 어렵게 만듭니다.
유지 관리 어려움: 코드의 수정이나 확장이 어려워집니다.
에러 처리 복잡성: 각 콜백 함수에서 발생하는 에러를 처리해야 하므로, 코드가 복잡해집니다.
4. 콜백 지옥 해결 방법*
콜백 지옥을 해결하기 위한 주요 방법은 다음과 같습니다:
모듈화: 콜백 함수를 작은 단위로 분리하여 코드를 간결하게 만듭니다.
프로미스(Promise) 사용: 프로미스는 비동기 작업의 결과를 처리하는 더 효율적인 방법을 제공합니다. jQuery 3.0 이상에서는 $.ajax 등의 비동기 함수들이 프로미스를 지원합니다.
async/await 사용: ES2017에서 도입된 async/await는 비동기 코드를 동기식으로 작성할 수 있게 해줍니다. 이를 통해 코드를 더 읽기 쉽게 이해할 수 있도록 이어서 작성합니다
async/await 사용 (계속): async/await를 사용하면 코드를 더 읽기 쉽고 가독성을 높일 수 있습니다. 단, 이 기능은 jQuery와 함께 사용할 때 주의가 필요합니다. jQuery의 프로미스와 네이티브 JavaScript 프로미스는 약간의 차이가 있기 때문에, Promise.resolve()나 Promise.reject()를 사용하여 호환성을 보장해야 합니다.
예시 코드*
콜백 지옥을 피하기 위한 코드 예시는 다음과 같습니다:
콜백 함수는 어떤 함수의 인자로 전달되어, 해당 함수가 실행을 완료한 후에 실행되는 함수입니다. jQuery에서 콜백 함수는 주로 비동기 작업(예: AJAX 호출)의 결과를 처리할 때 사용됩니다.