자동 seo 컨설팅 받으러가기

ECMAScript

by 넥스트티
2024-10-23

목차

 

ECMAScript 개요

ECMAScript의 역사

ECMAScript는 웹 개발에 필수적인 프로그래밍 언어로, JavaScript의 표준 사양이다. ECMAScript의 역사는 1995년으로 거슬러 올라간다. 당시 브렌던 아이크가 Netscape에서 JavaScript를 개발하였고, 이는 이후 웹 브라우저의 표준 스크립트 언어로 자리 잡았다. 1996년에는 ECMA 인터내셔널에 의해 공식적으로 표준화가 시작되었으며, 이를 통해 ECMAScript라는 명칭이 붙여졌다. 1997년, 첫 번째 버전인 ECMAScript 1이 발표되었고, 이후 ECMAScript 2, 3, 4 등 여러 버전이 개발되었다. 특히 ECMAScript 3은 1999년에 발표되어, 널리 사용되는 기능들이 대거 포함되었다. 그러나 ECMAScript 4는 복잡성과 다양한 의견 차이로 인해 개발이 중단되었고, 대신 ECMAScript 5가 2009년에 발표되었다. 이는 JSON 지원, strict mode, 새로운 배열 메서드 등을 포함하여 개발자들에게 큰 도움이 되었다. 이후 ECMAScript 6(또는 ECMAScript 2015)는 자바스크립트의 혁신적인 변화로, 클래스, 모듈, 화살표 함수 등 많은 새로운 기능을 도입하였다. 이 이후에도 ECMAScript는 매년 새로운 버전이 발표되고 있으며, 최신 기능들이 계속해서 추가되고 있다. 이러한 발전은 웹 개발의 효율성을 높이고, 개발자들이 더 나은 코드를 작성할 수 있도록 지원하고 있다.

ECMAScript의 표준화 과정

ECMAScript의 표준화 과정은 다양한 단계를 거쳐 이루어진다. 처음에는 넷스케이프 커뮤니케이션이 자바스크립트를 개발하였고, 이후 ECMA 국제에 의해 표준화가 시작되었다. 1997년, ECMAScript 1이 처음 발표되었으며, 이는 자바스크립트의 첫 번째 공식 표준으로 자리 매김하였다. 이후 1998년에는 ECMAScript 2가 발표되었고, 이는 주로 문서화 작업 및 일부 수정이 포함되었다. 1999년에는 ECMAScript 3이 발표되어, 정규 표현식, try/catch 구문, switch 문과 같은 중요한 기능이 추가되었다. 그러나 ECMAScript 4의 개발은 복잡성과 다양한 의견 차이로 인해 중단되었고, 이후 ECMAScript 5가 2009년에 발표되었다. ECMAScript 5에서는 JSON 지원, strict mode, 새로운 배열 메서드 등의 기능이 도입되어, 개발자들에게 많은 혜택을 제공하였다. 그 뒤로 ECMAScript 6(ECMAScript 2015)가 발표되어, 클래스, 모듈, 화살표 함수 등 혁신적인 기능이 추가되었다. 이러한 표준화 과정은 웹 개발의 발전에 기여하며, 매년 새로운 버전이 발표되고 있다. 각 버전의 출시는 ECMA-262라는 문서에 명시되며, 이는 ECMAScript의 공식 표준을 정의하는 역할을 한다. 이러한 과정은 개발자들이 웹 환경에서 더 나은 애플리케이션을 개발할 수 있도록 지원하며, ECMAScript의 발전은 계속해서 이어지고 있다.

ECMAScript 버전별 주요 기능

ECMAScript는 웹 개발에서 중요한 역할을 하는 프로그래밍 언어 표준이다. 각 버전은 새로운 기능과 개선사항을 포함하여 개발자들에게 유용한 도구를 제공한다. ECMAScript 3는 정규 표현식, try/catch 문법, switch 문 등 다양한 기능을 도입하였으며, 이는 기본적인 프로그래밍 패러다임을 확립하는 데 기여하였다. 이후 ECMAScript 5는 2009년에 발표되었고, JSON 지원, strict mode, 새로운 배열 메서드 등의 기능을 추가하여 개발자들이 더 안전하고 효율적으로 코드를 작성할 수 있도록 하였다. ECMAScript 6 또는 ECMAScript 2015는 클래스, 모듈 시스템, 화살표 함수와 같은 혁신적인 기능이 포함되어 있어, 현대적인 자바스크립트 개발의 토대를 마련하였다. 이 외에도 비동기 프로그래밍을 위한 async/await 구문이 도입되어, 비동기 처리를 보다 간편하게 할 수 있게 되었다. 이후의 버전에서는 이러한 기능을 기반으로 더욱 다양한 기능들이 추가되고 있으며, ECMAScript의 발전은 웹 애플리케이션의 성능과 개발 효율성을 향상시키는데 기여하고 있다. 이러한 발전을 통해 개발자들은 더 나은 사용자 경험을 제공할 수 있는 애플리케이션을 설계하고 구현할 수 있게 된다.

ECMAScript의 기본 구조

변수 및 데이터 타입

ECMAScript는 웹 프로그래밍에 필수적인 언어로, 다양한 변수 및 데이터 타입을 지원하여 개발자들이 효율적으로 코드를 작성할 수 있도록 돕는다. ECMAScript에서는 기본적으로 다섯 가지 주요 데이터 타입이 존재한다. 이들은 Number, String, Boolean, Object, Undefined로 구성된다. Number 타입은 정수와 부동 소수점을 포함하며, String 타입은 문자들의 집합을 나타낸다. Boolean 타입은 true 또는 false 값을 가질 수 있으며, 조건문에서 자주 사용된다. Object는 키-값 쌍으로 데이터를 저장할 수 있는 복합 데이터 타입이다. 마지막으로 Undefined는 선언되었으나 초기화되지 않은 변수에 자동으로 할당되는 타입이다. 이러한 데이터 타입들은 다양한 방식으로 변수에 할당될 수 있다. 변수를 선언할 때는 var, let, const 키워드를 사용한다. var는 함수 스코프를 가지며, let과 const는 블록 스코프를 가진다. const는 상수 선언 시 사용되며, 이후 값을 변경할 수 없다. 다음은 ECMAScript에서 변수를 선언하고 데이터를 할당하는 예시이다:let name = ‘John’;const age = 30;var isStudent = true;이와 같은 방식으로 데이터를 저장하고 조작할 수 있으며, 이러한 기본 구조는 ECMAScript의 핵심 요소로 자리 잡고 있다. 변수 및 데이터 타입의 올바른 사용은 코드의 가독성과 유지 보수성을 높이는 데 기여한다. 따라서 개발자는 다양한 데이터 타입을 이해하고 적절히 활용하는 것이 중요하다. 이러한 기본적인 구조가 잘 이해되면, 복잡한 로직을 구현하는 데 도움이 된다.

연산자와 표현식

ECMAScript에서 연산자와 표현식은 프로그래밍의 기본적인 요소로, 변수를 조작하고 데이터를 처리하는 데 필수적이다. 연산자는 특정 작업을 수행하는 기호로, 주로 수치 연산, 논리 연산, 비교 연산 등을 포함한다. 산술 연산자는 덧셈(+), 뺄셈(-), 곱셈(*) 및 나눗셈(/)을 사용하여 숫자 간의 계산을 수행한다. 예를 들어, 두 숫자의 합을 구하는 표현식은 다음과 같이 작성할 수 있다: let sum = 10 + 5;. 비교 연산자는 두 값을 비교하고, 그 결과를 불리언(true 또는 false)으로 반환하는 데 사용된다. 예를 들어, let isEqual = (5 === 5);는 true를 반환한다. 논리 연산자는 여러 조건을 결합하여 하나의 진리값을 생성하는 데 사용되며, AND(&&), OR(||), NOT(!) 등이 있다. 이러한 연산자들은 복잡한 조건문을 작성하는 데 유용하다. 표현식은 값을 생성하는 코드 조각으로, 연산자와 피연산자가 결합하여 구성된다. 예를 들어, let result = (10 * 2) + (5 / 5);는 계산된 값을 result 변수에 저장한다. 이와 같이 연산자와 표현식을 적절히 활용하면, 다양한 로직을 구현할 수 있으며, 코드의 가독성과 효율성을 높이는 데 기여한다.

제어 구조

제어 구조는 ECMAScript에서 프로그램의 흐름을 제어하는 데 사용되는 중요한 요소이다. 제어 구조는 주로 조건문과 반복문으로 나눌 수 있으며, 이를 통해 코드의 실행 경로를 결정할 수 있다. 조건문은 특정 조건이 참인지 거짓인지에 따라 코드 블록의 실행 여부를 결정한다. 가장 일반적인 형태는 if, else if, else 문이다. 예를 들어, 다음과 같은 코드를 통해 특정 조건에 따라 다른 코드를 실행할 수 있다: if (condition) {    // 조건이 참일 때 실행할 코드} else {    // 조건이 거짓일 때 실행할 코드}이와 같이 조건문을 사용하면 프로그램의 로직을 유연하게 구성할 수 있다. 반복문은 특정 코드 블록을 여러 번 실행하는 데 사용된다. 가장 일반적으로 사용되는 반복문에는 for문과 while문이 있다. for문은 반복 횟수를 미리 알고 있을 때 유용하며, 다음과 같은 형태로 작성할 수 있다: for (let i = 0; i    // 0부터 9까지의 숫자를 반복하여 실행하는 코드}while문은 조건이 참인 동안 계속 실행되며, 다음과 같은 형태로 작성된다: while (condition) {    // 조건이 참인 동안 실행할 코드}이러한 제어 구조는 ECMAScript의 흐름 제어를 통해 다양한 로직을 구현할 수 있게 해주며, 코드의 가독성과 유지보수성을 높이는 데 기여한다.

ECMAScript의 함수 및 객체

함수의 정의와 호출

ECMAScript에서 함수는 코드의 재사용성을 높이고, 특정 작업을 수행하는 논리를 명확하게 정의할 수 있는 중요한 구성 요소이다. 함수를 정의할 때는 function 키워드를 사용하며, 함수 이름과 매개변수를 지정할 수 있다. 함수의 기본 구조는 다음과 같다: function 함수명(매개변수1, 매개변수2) {     // 함수가 수행할 코드 } 이와 같은 구조를 통해 여러 번 호출할 수 있는 기능 단위를 생성할 수 있다. 함수는 호출 시에 매개변수에 값을 전달받고, 이를 바탕으로 작업을 수행한다. 예를 들어, 두 숫자를 더하는 함수를 정의할 수 있다: function add(a, b) {     return a + b; } 이 함수를 호출할 때는 다음과 같이 작성할 수 있다: let result = add(5, 3); // result는 8이 된다. 함수는 다양한 방식으로 호출할 수 있으며, 필요에 따라 다른 함수의 인자로 전달될 수 있다. 이를 통해 ECMAScript는 높은 수준의 추상화를 제공하고, 코드의 모듈화를 촉진한다. 또한, ECMAScript에서는 함수 표현식도 지원하여 변수를 통해 함수를 정의하고 사용할 수 있다. 다음은 함수 표현식의 예시이다: const multiply = function(x, y) {     return x * y; }; let product = multiply(4, 2); // product는 8이 된다. 이와 같이 ECMAScript의 함수는 프로그램의 구조를 명확하게 하고, 코드의 가독성을 높이는 데 기여한다.

객체 지향 프로그래밍

ECMAScript의 객체 지향 프로그래밍은 코드의 재사용성과 모듈화를 높이는 데 중요한 역할을 한다. ECMAScript는 객체를 중심으로 한 프로그래밍 언어로, 객체는 속성과 메서드를 포함할 수 있는 데이터 구조이다. 객체는 다양한 데이터를 그룹화하여 복잡한 프로그램을 보다 관리하기 쉽게 만든다. 이러한 객체는 생성자 함수나 클래스를 사용하여 생성할 수 있다. 예를 들어, 다음과 같은 코드로 객체를 생성할 수 있다:function Person(name, age) {  this.name = name;  this.age = age;}const john = new Person(‘John’, 30);위의 코드에서는 Person이라는 생성자 함수를 정의하고, 이를 통해 john이라는 객체를 생성하였다. 이처럼 ECMAScript는 객체를 통해 데이터와 기능을 결합하여 프로그램의 구조를 명확하게 한다.ECMAScript의 객체는 프로토타입 기반의 상속을 지원한다. 객체는 다른 객체를 상속받아 그 속성과 메서드를 사용할 수 있으며, 이를 통해 코드의 중복을 줄일 수 있다. 다음은 프로토타입 상속을 이용한 예시이다:function Animal(name) {  this.name = name;}Animal.prototype.speak = function() {  console.log(this.name + ‘가 소리를 냅니다.’);}const dog = new Animal(‘개’);dog.speak(); // 개가 소리를 냅니다.이 예시에서 Animal이라는 객체는 speak라는 메서드를 갖고 있으며, 이를 상속받은 dog 객체는 해당 메서드를 호출하여 자신의 이름을 출력할 수 있다. 이러한 객체 지향 프로그래밍 패러다임은 코드의 재사용성을 높이고, 유지보수성을 향상시키며, 개발자들이 복잡한 시스템을 보다 쉽게 다룰 수 있도록 한다. 따라서 ECMAScript에서의 객체 지향 프로그래밍은 현대 웹 개발에서 필수적인 요소로 자리잡고 있다.

클로저와 스코프

클로저는 ECMAScript에서 중요한 개념으로, 함수와 그 함수가 선언된 렉시컬 환경의 조합을 의미한다. 클로저는 내부 함수가 외부 함수의 변수에 접근할 수 있게 해주며, 이러한 특성 덕분에 데이터 은닉과 상태 유지가 가능하다. 예를 들어, 다음의 코드에서는 클로저를 사용하여 카운터를 구현할 수 있다: function createCounter() {  let count = 0;  return function() {    count += 1;    return count;  };}const counter = createCounter();console.log(counter()); // 1console.log(counter()); // 2이 예시에서 createCounter 함수는 내부에 count 변수를 가지며, 반환된 함수는 이 변수에 접근할 수 있다. 이로 인해 count의 상태를 외부에서 직접 변경할 수 없고, 오직 내부 함수만이 이를 변경할 수 있다. 한편, 스코프는 변수의 접근 가능 범위를 정의하는 중요한 개념이다. ECMAScript에서는 전역 스코프와 함수 스코프, 블록 스코프 세 가지 스코프 유형이 존재한다. 전역 스코프는 코드 어디에서나 접근할 수 있는 변수를 정의하며, 함수 스코프는 함수 내에서만 접근할 수 있는 변수를 의미한다. 블록 스코프는 let이나 const 키워드를 사용하여 정의된 변수가 해당 블록 내에서만 유효함을 의미한다. 다음의 예시를 통해 블록 스코프의 개념을 살펴볼 수 있다: if (true) {  let blockScopedVar = ‘나는 블록 스코프이다’;  console.log(blockScopedVar); // ‘나는 블록 스코프이다’}console.log(blockScopedVar); // ReferenceError: blockScopedVar is not defined이와 같이 블록 스코프는 특정 코드 블록 내에서만 유효하며, 외부에서는 접근할 수 없다. 이러한 클로저와 스코프의 개념은 ECMAScript를 이해하고 활용하는 데 있어 필수적인 요소로 작용하며, 특히 비동기 프로그래밍에서 중요한 역할을 한다. 이들 개념을 잘 이해하면 코드의 복잡성을 줄이고, 더 나은 유지보수성을 가진 소프트웨어를 개발할 수 있다.

ECMAScript의 최신 기능

ES6(ECMAScript 2015)의 주요 개선사항

ES6(ECMAScript 2015)는 ECMAScript 표준의 중요한 이정표로 자리 잡았다. 이 버전은 다양한 기능 개선과 새로운 문법을 도입하여 자바스크립트 프로그래밍의 효율성과 가독성을 크게 향상시켰다. 우선, 화살표 함수는 전통적인 함수 표현식을 대체할 수 있는 간결한 문법을 제공한다. 화살표 함수는 this 바인딩에 대한 새로운 접근 방식을 제시하여, 클로저를 사용할 때의 복잡성을 줄인다. 예를 들어, 다음은 화살표 함수를 사용하는 예시다:const add = (a, b) => a + b;또한, 템플릿 리터럴은 문자열을 보다 직관적으로 작성할 수 있게 해준다. 백틱(`)을 사용하여 여러 줄의 문자열을 생성하고, 표현식을 삽입할 수 있다. 다음은 템플릿 리터럴의 예시이다:const name = ‘홍길동’;const greeting = `안녕하세요, ${name}님!`; 이 외에도, 비구조화 할당은 객체와 배열에서 값을 쉽게 추출할 수 있도록 돕는다. 이를 통해 코드의 가독성이 상당히 개선된다. 예를 들어:const person = { name: ‘홍길동’, age: 30 };const { name, age } = person;마지막으로, 모듈 시스템의 도입은 코드의 재사용성과 관리성을 높여준다. ES6에서는 import와 export를 사용하여 모듈 간의 의존성을 명확히 할 수 있다. 이러한 개선 사항들은 자바스크립트의 발전에 중요한 역할을 하였으며, 많은 개발자들이 ES6의 기능을 통해 보다 효율적인 코드를 작성하고 있다.

비동기 프로그래밍(Async/Await)

비동기 프로그래밍은 현대 웹 개발에서 매우 중요한 개념이다. ECMAScript에서는 비동기 작업을 보다 쉽게 처리할 수 있도록 Async/Await 구문을 도입하였다. Async/Await은 Promise를 기반으로 하여 비동기 코드를 더 직관적으로 작성할 수 있게 해준다. 이를 통해 개발자는 비동기 작업의 결과를 마치 동기 코드처럼 처리할 수 있어 가독성과 유지보수성이 향상된다. 예를 들어, API 호출을 통해 데이터를 가져오는 경우, Async/Await를 사용하면 다음과 같은 코드를 작성할 수 있다:

javascript
async function fetchData() {
try {
const response = await fetch(‘https://api.example.com/data’);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(‘데이터를 가져오는 중 오류 발생:’, error);
}
}

위의 예시에서 `async` 키워드는 함수가 비동기적임을 나타내며, `await` 키워드는 Promise가 해결될 때까지 기다리게 한다. 이러한 방식은 코드의 흐름을 간단하게 유지하면서도 비동기 작업을 효과적으로 처리할 수 있게 해준다. 또한, Async/Await은 에러 처리를 보다 간단하게 수행할 수 있도록 도와준다. `try…catch` 블록을 사용하여 비동기 작업 중 발생할 수 있는 오류를 쉽게 잡아낼 수 있다. 이와 같은 기능은 특히 복잡한 비동기 로직을 다룰 때 코드의 가독성을 크게 향상시키는 데 기여한다. 결과적으로 Async/Await는 자바스크립트 개발자들이 비동기 프로그래밍을 더 쉽게 접근할 수 있도록 돕는 중요한 도구로 자리잡았다.

모듈 시스템

ECMAScript의 모듈 시스템은 현대 자바스크립트 애플리케이션의 구조화를 가능하게 하는 중요한 기능이다. 모듈 시스템은 코드의 재사용성과 유지보수성을 높이는 데 기여한다. ES6(ECMAScript 2015)에서 도입된 이 시스템은 모듈을 통해 코드의 분할과 독립적인 관리가 가능해지며, 각 모듈은 자신만의 범위(scope)를 가지게 된다. 이를 통해 변수나 함수의 이름 충돌을 방지하고, 코드의 가독성을 높이는 효과를 얻을 수 있다. 모듈을 사용하면 필요한 기능만을 가져와 사용할 수 있어, 전체 코드베이스를 간결하게 유지할 수 있다. 예를 들어, 다음과 같은 방식으로 모듈을 정의하고 사용할 수 있다: // math.js export function add(x, y) { return x + y; } export function subtract(x, y) { return x – y; } // main.js import { add, subtract } from ‘./math.js’; console.log(add(5, 3)); // 8 console.log(subtract(5, 3)); // 2 위의 예제에서 math.js 모듈은 두 개의 함수를 정의하고 내보내며, main.js 파일에서는 이 함수를 가져와 사용할 수 있다. 모듈 시스템은 또한 비동기 로딩을 지원하여, 필요한 모듈을 동적으로 가져올 수 있는 기능도 제공한다. 이로 인해 애플리케이션의 초기 로딩 속도를 개선할 수 있다. 모듈 시스템은 자바스크립트의 모던 개발 환경에서 필수적인 요소로 자리잡고 있으며, 다양한 프레임워크와 라이브러리에서 광범위하게 활용되고 있다.

자주 묻는 질문

ECMAScript란 무엇인가요?

ECMAScript는 자바스크립트의 표준 사양으로, 웹 개발에서 중요한 역할을 하는 프로그래밍 언어입니다.

ECMAScript와 JavaScript의 차이점은 무엇인가요?

ECMAScript는 JavaScript의 표준 규격을 정의한 것이며, JavaScript는 그 표준을 따르는 프로그래밍 언어입니다.

ECMAScript 6(ES6)의 주요 기능은 무엇인가요?

ES6는 클래스, 모듈, 화살표 함수, 템플릿 리터럴 등 자바스크립트의 기능을 크게 확장시킨 주요 업데이트입니다.

클로저(Closure)란 무엇인가요?

클로저는 함수와 함수가 선언된 렉시컬 환경을 함께 저장하여 외부 함수의 변수를 유지하는 기능을 의미합니다.

모듈 시스템은 무엇인가요?

모듈 시스템은 코드를 독립적으로 관리하고 재사용할 수 있도록 돕는 ES6의 새로운 기능입니다.

비동기 프로그래밍이란 무엇인가요?

비동기 프로그래밍은 시간이 오래 걸리는 작업을 비동기적으로 처리하여 프로그램이 멈추지 않도록 하는 방식입니다.

async/await는 어떻게 사용하나요?

async/await는 비동기 작업을 동기 코드처럼 처리할 수 있게 하는 구문으로, Promise 기반의 비동기 코드를 쉽게 작성할 수 있습니다.

프로토타입 상속이란 무엇인가요?

프로토타입 상속은 자바스크립트에서 객체가 다른 객체의 속성과 메서드를 상속받는 방식입니다.

참고자료

관련포스트

Angular

목차Angular란?Angular의 구조Angular 개발 환경 설정Angular의 데이터 바인딩Angular란? Angular의 역사 Angular는 2009년 구글에 의해 최초로 개발되었으며, 당시에는 'AngularJS'라는 이름으로 알려져 있었다. 이 프레임워크는 웹... more

Vue.js

목차Vue.js란?Vue.js 설치 및 설정Vue.js 기본 개념Vue.js 고급 기능Vue.js란? Vue.js의 역사 Vue.js는 2014년 Evan You에 의해 개발된 오픈 소스 자바스크립트 프레임워크이다. 초기에는 주로 개인 프로젝트를 위해 만들어졌으나, 점차 많은... more

React.js

목차React.js란?React.js의 주요 개념React.js 개발 환경 설정React.js 활용 사례React.js란? React.js의 정의 React.js는 사용자 인터페이스를 구축하기 위한 JavaScript 라이브러리로, 주로 단일 페이지 애플리케이션(SPA) 개발에 널리 사용된다.... more

TypeScript

목차TypeScript란?TypeScript의 장점TypeScript의 설치 및 설정TypeScript의 기본 문법TypeScript란? TypeScript의 정의 TypeScript는 마이크로소프트에서 개발한 프로그래밍 언어이다. 이는 자바스크립트의 상위 집합으로, 자바스크립트의 모든... more

JavaScript (ES6+)

목차JavaScript (ES6+) 기본 정보ES6의 주요 기능ES6+의 새로운 기능JavaScript(ES6+)의 활용JavaScript (ES6+) 기본 정보 JavaScript란? JavaScript는 웹 개발에 널리 사용되는 프로그래밍 언어로, 동적인 웹 페이지를 생성하는 데 필수적인 역할을... more

CSS3

목차   CSS3 개요 CSS3의 선택자 CSS3의 박스 모델 CSS3의 레이아웃 기법 CSS3의 애니메이션 CSS3 개요 CSS3란? CSS3는 웹 페이지의 스타일을 정의하기 위한 최신 스타일 시트 언어이다. 이는 HTML 문서의 시각적 표현을... more

HTML5

목차   HTML5란? HTML5의 주요 요소 HTML5의 API HTML5의 호환성 HTML5란? HTML5의 정의 HTML5는 웹 페이지의 구조를 정의하기 위한 표준 마크업 언어인 HTML의 최신 버전이다. HTML5는 웹 개발자들이 보다 효율적으로... more

UI 카피라이팅

목차   UI 카피라이팅이란? UI 카피라이팅의 주요 원칙 UI 카피라이팅의 기법 UI 카피라이팅의 실제 사례 UI 카피라이팅이란? UI 카피라이팅의 정의 UI 카피라이팅은 사용자 인터페이스에서 사용되는 텍스트와... more