Rest Operator와 Spread Operator

web/javaScript|2018. 10. 6. 01:20

es6를 사용하면서 보게된 Rest Operator와 Spread Operator에 대해 정리를 해보자.


Rest Operator

기존에 리터널 문법을 사용하여 객체나 배열의 값을 변수로 바인딩하여 사용할 수 있었다.
근데 object라는 객체의 값이 많은경우에는 여기서 값을 모두 하나하나 뽑아내는건 어렵기 때문에 하나의 객체로 뽑아낼때 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 기존에 하나씩 속성을 뽑아서 사용하던 방식
const object = {a : 'wedul', b : 'cjung', c : 'gglee', d : 'babo'};
const {a, b} = object;
console.log(a, b);
 
#출력
wedul, cjung
 
// Rest Operator 를 사용하여 여러 속성을 하나로 묶어서 진행
const object = {a : 'wedul', b : 'cjung', c : 'gglee', d : 'babo'};
const {a, b, ...obj} = object;
console.log(a, b, obj);
 
#출력
wedul cjung { c: 'gglee', d: 'babo' }
 
// 배열일때도 마찬가지로 사용가능한데 배열인 경우에는 뒤에 요소가 배열로 만들어진다.
// Rest Operator
const array = ['wedul', 'cjung', 'gglee', 'babo'];
const [a, b, ...obj] = array;
console.log(a, b, obj);
 
#출력
wedul cjung [ 'gglee', 'babo' ]
cs


Spread Operator

배열이나 Object에 있는 내용들이 열거되어 사용할 수 있도록 해주는 기능
아래의 예에서는 입력된 배열의 요소들이 getlternalTest() 함수수의 내용들이 name, age, address 순서대로 열거된다.

1
2
3
4
5
6
7
8
9
10
11
12
getleternalTest(name, age, address) {
  console.log(name, age, address);
  #출력 결과 cjung 23 seoul
}
 
 
#테스트
it('liternal test', () => {
  // array
  test.getleternalTest(...['cjung', 23, 'seoul']);
});
 
cs


Push로 기존에 배열에 데이터를 추가할 수도 있다.

1
2
3
4
let data = ['dd', 'cg', 'zz', 'cjung'];
data.push(…data);
console.log(data);
-> [“dd", "cg", "zz", "cjung", "dd", "cg", "zz", "cjung"] 
cs


Object도 동일하게 사용가능


궁금사항으로 이렇게 복사된 항목들은 깊은복사가 될까였다. 그래서 테스트를 해봤다.
-> 테스트 결과 해당 객체가 만들어질때 데이터가 값이 복사가 되기 때문에 서로 별개로 동작하게 된다. 아래 예를 보면 동작이 이해가 가능하다.

1
2
3
4
5
6
7
8
> copyBabo // babo 오브젝트에서 복사된 copyBabo의 항목
< {name: "cjung", age: 23, addr: "seoul"}
 
// copyBabo name 속성 변경
> copyBabo.name = 'gglee';
 
> babo // babo의 속성을 확인했을 때 바뀌지 않은걸 알 수있다.
< {name: "cjung", age: 23, addr: "seoul"}
cs




댓글()

규칙 56 - 일반적으로 통용되는 작명 관습을 따르라

JAVA/Effective Java|2018. 5. 29. 23:50

자바의 작명관습은 두 가지 범주로 나눌 수 있다.

철자.
-> 패키지, 클래스, 인터페이스, 메서드, 필드 그리고 자료형 변수에 관한 것
-> 아주 그럴듯한 이유가 없이 이 규칙을 어겨서는 안 된다.

1). 패키지
-> 마침표를 구분점으로 사용하는 계층적 이름 이어야 한다.
-> 각각의 컴포넌트는 알파벳 소문자로 구성하고, 숫자는 거의 사용하면 안된다.
-> 패키지 시작은 회사 조직의 도메인으로 시작한다. com.wedul
-> 패키지명 컴포넌트는 짧아야 하며, 8자리 이하여야 한다.
-> 약어를 사용하여 의미를 충분히 전달할 수 있어야한다.

2). 클래스, 인터페이스, Enum
-> 하나이상의 단어로 구성된다.
-> 각 첫 글자는 대문자로 시작해야 하며 널리 사용 되는 약어를 제외하고는 약어를 사용해서는 안된다.
-> 단어의 첫 글자만 대문자로 사용하는 것이 좋다.

3). 메서드와 필드
-> 메서드와 필드도 클래스와 인터페이스와 동일한 규칙을 따르지만, 소문자로 시작한다.
-> 상수 필드는 하나 이상의 대문자로 구성되며 단어 마다 _로 구분한다. VALUE_FIELD 
-> 지역 필드에 경우 약어로 사용해도 무관하다. (ex. i, xref..)


문법.
-> 철자 규칙보다는 덜 속박받는 규칙으로 사용된다. (의견이 분분하기 때문에 알맞게 사용하면 된다.)

1) 클래스, enum
-> 명사나, 명사구를 사용한다. 
-> 클래스에 경우 형용사구를 사용하는 경우가 있다. Runnable, Iterable 등등..

2) 메서드
-> 일반적으로 동사, 동사구를 사용하ㅓㄴ다. append 

3) boolean
-> is, has로 시작하여 사용한다.



요약하면, 표준적 작명 관습을 숙지하고 사용하라. 
잘 작성된 명명 규칙만으로도 개발자들 사이에서는 백마디 말보다 더 빠른 이해력을 도울 수 있다. 

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙56 인용.

댓글()