JavaScript

[새로운 기능] 강화된 객체 표현과 연산자

  • -

es2015에서는 객체를 쉽게 표현하고 분리하거나 추출하는 기능을 제공한다. Vue등 framework에서 많이 볼 수 있는 형태이므로 잘 배워두자.

 

 

강화된 객체 표현(Enhanded Object Literal)은 객체를 표현할 때 좀 더 간결한 문법을 제공하는데 2가지의 개선이 이뤄졌다.

  • property shorthand: 객체의 속성 이름과 참조하려는 변수의 이름이 같을 경우는 하나만 사용
  • concise method: 객체에 함수 정의 시 속성 이름을 함수 이름으로 사용

 

먼저 기존에 객체를 정의하던 형태를 살펴보자.

let language = "javascript"; let oldStyle = { language: language, sayLang: function () { console.log(`사용 언어는 ${this.language} 이다.`); }, };

oldStyle의 languate 는 속성과 값(사용하는 변수)가 같다. 그리고 sayLang 속성은 함수로 선언되어있다. 이 문장을 ES6 형태로 변경하면 아래와 같다.

let language = "javascript"; let newStyle = { language, sayLang() { console.log(`사용 언어는 ${this.language} 이다.`); }, };

 

Spread Operator는 기존의 객체 또는 배열의 값을 다른 객체나 배열로 복제하거나 옮길 때 사용한다.

예를 들어 아래와 같은 객체가 있다고 생각해보자.

let normal = { name:"hong", age:30, }

이제 새로운 객체를 만들껀데 우연찮게 normal에 있는 내용을 그대로 가져간다. 예를 들어 아래와 같이 구성된다.

let special = { name:"hong", age:30, nick:"율도국왕" }

즉 special 이라는 객체는 normal 객체의 속성에 추가로 nick이 있는 새로운 객체이다.

special을 만들기 위해 이전의 javaScript는 아래와 같이 작성할 수 있었다.

let oldHero = { name: normal.name, age: normal.age, nick: "율도국왕", }; console.log(oldHero, normal);

즉 새로운 객체를 만들면서 기존 객체의 속성을 하나씩 가져오고 추가 속성을 작성하면 된다. 물론 반복문을 이용할 수도 있었을 것이다.

 

spread operator(...)는 단어 뜻 그대로 객체를 펼쳐서 넣어준다.

let newHero = { ...oldHero, wish: `아버지를 아버지라고 부르고 싶어함.`, }; console.log(newHero, oldHero, normal);

이렇듯 spread operator를 사용하면 기존 객체의 속성을 이용하여 쉽게 새로운 객체를 생성할 수 있다.

let addr = { zip: "200-100", sido: "서울", gugun: "중랑구" }; let tel = { part1: "010", part2: "1234", part3: "5678" }; let person = { name: "홍길동", ...addr, ...tel };

이 연산자는 배열에서도 동일하게 적용될 수 있다.

let arr = [1, 2, 3]; let newArr = [...arr, 4, 5, 6];

 

일반적으로 객체나 배열을 사용하는 이유는 여러 가지 데이터를 하나의 변수에 담아서 사용하기 위해서 사용한다. 이 과정을 구조를 만드는(structuring) 것이라고 이야기 할 수 있다.

let person = { name: "홍길동", age: 10, addr: "서울 중랑구", };

그런데 person의 속성들을 하나씩 꺼내서 변수에 할당하고 사용하려면 상당히 수고스럽다.

let name = person.name; let age = person.age; let addr = person.addr; console.log(`${name}${age}살인데 ${addr}에 살아.`);

 

de-structuring은 변수 선언 시 { } 를 이용해서 여러 변수를 선언할 수 있고 객체에 뭉쳐있던 속성들이 해체되서 할당된다.

let { name, age, addr } = person; console.log(`${name}${age}살인데 ${addr}에 살아.`);

즉 위와 같은 한 줄의 코드로 3줄을 대체할 수 있다. 물론 이 과정에서 person의 모든 속성을 다 받아들여야 하는 것은 아니다. 필요한 것만 변수에 선언해주면 된다.

de-structuring은 특히 객체가 함수의 파라미터로 전달 될 때 코드를 간략하게 하기 위해서 사용된다.

function printUser({ name, age, addr }) { console.log(`${name}${age}살인데 ${addr}에 살아.`); }

위의 함수는 파라미터 부분에 de-structuring 연산자가 사용되었다. 즉 함수 호출 시 전달되는 객체에서 name, age, addr 속성을 뽑아서 바로 변수에 할당해주는 형태이다. 

 

 

가끔 객체의 속성을 동적으로 만들어야 하는 경우가 있는데 이때 사용할 수 있는 방법이 computed property name이다. 이 방법은 객체의 속성 선언 시 []를 사용할 수 있는데 [] 안의 내용을 실행해서 속성 이름으로 사용할 수 있다.

다음의 코드는 dynamic_prop_obj를 만들면서 name_1이라는 속성을 동적으로 만들고 있는 예를 보여준다.

let dynamic_prop_obj = { ["name"+"_1"]:"hong" } console.log(dynamic_prop_obj) // {name_1: 'hong'}

이 기법은 일반적으로 키의 이름을 배열등에 저장하고 이것을 참조해서 키 이름을 구성할 때 유용하다.

const propNames = ["name", "age", "addr"]; const user = { [propNames[0]]: "hong gil dong", [propNames[1]]: 20, [propNames[2]]: "seoul", };

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

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