본문 바로가기
혼공학습단 11기(完)

[혼공스] 06 - 3 '객체와 배열 고급' 정리(3)

by jaeheon0520 2024. 1. 29.

 

오늘은 06 - 3장의 내용을 정리해보자.

 

자바스크립트를 활용해서 리액트, 뷰 프레임워크 등을 개발할 때 사용하는 문법에 대해 알아볼 것이다.

 

나중에 웹 개발 하면서 관련 내용이 나왔을 때 당황하지 않도록 잘 정리해야한다.

 

속성 존재 여부 확인

객체 내부에 어떤 속성이 있는지 확인해보는 코드는 굉장히 자주 사용하는 코드이다. 

 

객체에 없는 속성에 접근하면 undefined 자료형이 나온다. 따라서 조건문으로 undefined 인지 아닌지 확인하면 속성 존재 여부를 확인할 수 있다.

 

<script>
	// 객체를 생성한다.
    const object = {
    	name: '혼자 공부하는 파이썬',
        price: 18000,
        publisher: '한빛미디어'
    }
    
    // 객체 내부에 속성이 있는지 확인한다.
    if (object.name !== undefined) {
    	console.log('name 속성이 있습니다.')
    } else {
    	console.log('name 속성이 없습니다')
    }

    if (object.author !== undefined) {
    	console.log('author 속성이 있습니다.')
    } else {
    	console.log('author 속성이 없습니다')
    }
</script>

 

개발자들은 일반적으로 더 간단하게 검사하려고 다음과 같은 코드를 사용하기도 한다. 객체의 특성 속성이 false로 변환될 수 있는 값(0, false, 빈 문자열 등)이 아닐 때와 같은 전제가 있어야 안전하게 사용할 수 있다.

 

<script>
	// 객체를 생성한다.
    const object = {
    	name: '혼자 공부하는 파이썬',
        price: 18000,
        publisher: '한빛미디어'
    }
    
    // 객체 내부에 속성이 있는지 확인한다.
    if (object.name) {
    	console.log('name 속성이 있습니다.')
    } else {
    	console.log('name 속성이 없습니다')
    }

    if (object.author) {
    	console.log('author 속성이 있습니다.')
    } else {
    	console.log('author 속성이 없습니다')
    }
</script>

 

더 짧게 사용한다면 다음과 같은 짧은 조건문을 사용할 수도 있다.

 

<script>
	// 객체를 생성한다.
    const object = {
    	name: '혼자 공부하는 파이썬',
        price: 18000,
        publisher: '한빛미디어'
    }
    
    // 객체 내부에 속성이 있는지 확인한다.
    object.name || console.log('name 속성이 없습니다.')
    object.author || console.log('author 속성이 없습니다.')
</script>

 

이러한 내용을 활용해서 객체의 기본 속성을 지정하는 경우도 많다. 다음은 객체의 속성이 있는지 확인하고 있다면 해당 속성을, 없다면 별도의 문자열을 지정하는 코드이다.

 

<script>
	// 객체를 생성한다.
    const object = {
    	name: '혼자 공부하는 파이썬',
        price: 18000,
        publisher: '한빛미디어'
    }
    
    // 객체의 기본 속성을 지정한다.
	object.name = object.name !== undefined ? object.name : '제목 미정'
    object.author = object.author !== undefined ? object.author : '저자 미상'
    
    // 객체를 출력한다.
    console.log(JSON.stringify(object, null, 2))
</script>

 

기본 속성 지정하기

 

배열 기반의 다중 할당

최신 자바스크립트부터 배열과 비슷한 작성 방법으로 한 번에 여러 개의 변수에 값을 할당하는 다중 할당 기능이 추가되었다.

 

[식별자, 식별자, 식별자, ...] = 배열

 

배열 기반의 다중 할당

 

할당 연산자(=) 왼쪽에 식별자의 배열을 넣고, 오른쪽에 배열을 위치시키면 배열의 위치에 맞게 값들이 할당된다. 처음에 [a, b] = [1, 2]라고 할당했으므로 a에 1이 할당되고, b에 2가 할당된다. 이때 let [a, b] 형태로 선언했으므로 a 와 b는 변수가 된다.

 

참고로 배열의 크기는 같을 필요 없고, const 키워드로도 사용할 수 있다.

 

다음 코드를 살펴보자. 배열의 길이가 5인 arrayA의 값을 [a, b, c]에 할당한다. 이렇게 하면 앞의 3개만 할당된다.

 

길이가 다른 할당

 

(☆)객체 기반의 다중 할당(☆)

최신 자바스크립트에서는 객체 내부에 있는 속성을 꺼내서 변수로 할당할 때 다음과 같은 코드를 사용할 수 있다.

 

{ 속성 이름, 속성 이름} = 객체
{ 식별자 = 속성 이름, 식별자 = 속성이름} = 객체

 

<script>
	// 객체를 생성한다
    const object = {
    	name: '혼자 공부하는 파이썬',
        price: 18000,
        publisher: '한빛미디어'
    }
    
    // 객체에서 변수를 추출한다
    const { name, price } = object // name 속성과 price 속성을 그대로 꺼낸다
    console.log('# 속성 이름으로 그대로 꺼내서 출력하기')
    console.log(name, price)
    console.log('')
    
    // name 속성을 a라는 이름으로, price 속성을 b라는 이름으로 꺼낸다
    const { a=name, b=price } = object
    console.log('# 다른 이름으로 속성 꺼내서 출력하기')
    console.log(a, b)
</script>

 

객체 속성 꺼내서 다중 할당하기

 

배열 전개 연산자

배열과 객체는 할당할 때 얕은 복사라는 것이 이루어진다. 

 

다음 코드는 물건 '물건_200301'라는 배열을 '물건_200302'로 복사하는 코드이다. 복사한 뒤에는 '물건_200302'에 push() 메소드를 호출해서 자료를 추가했다. 그런 다음 '물건_200301'과 '물건_200302'를 출력하면 어떤 값을 출력할까?

 

<script>
	// 사야 하는 물건 목록
    const 물건_200301 = ['우유', '식빵']
    const 물건_200302 = 물건_200301
    물건_200302.push('고구마')
    물건_200302.push('토마토')
    
    // 출력
    console.log(물건_200301)
    console.log(물건_200302)
</script>

 

얕은 복사 이해하기

 

특이하게도 같은 값이 나온다. 배열은 복사해도 다른 이름이 붙을 뿐이다. 이렇게 복사했을 때 다른 이름이 붙을 뿐인 것을 얕은 복사(참조 복사)라고 부른다. 

 

얕은 복사의 반대말은 깊은 복사이다. 깊은 복사를 하면 두 배열이 완전히 독립적으로 작동한다. 자바스크립트 개발에서는 깊은 복사를 '클론을 만드는 것'이라고도 표현한다. 과거에는 깊은 복사를 위해 반복문을 활용한 긴 코드를 사용하기도 했으나, 최신 자바스크립트에서는 전개 연산자를 사용해 다음과 같이 입력하기만 하면 된다.

 

[...배열]

 

<script>
    // 사야 하는 물건 목록
    const 물건_200301 = ['우유', '식빵']
    const 물건_200302 = [...물건_200301] // 전개 연산자를 사용해서 배열을 복사한다
    물건_200302.push('고구마')
    물건_200302.push('토마토')
    
    // 출력
    console.log(물건_200301)
    console.log(물건_200302)
</script>

 

전개 연산자를 사용해 배열 복사하기

 

위와 같이 복사한 뒤에 자료를 추가하는 코드도 많이 사용되므로 다음과 같은 패턴으로 쉽게 작성할 수 있다. 

 

[...배열, 자료, 자료, 자료]

 

<script>
    // 사야 하는 물건 목록
    const 물건_200301 = ['우유', '식빵']
    const 물건_200302 = ['고구마', ...물건_200301, '토마토'] 
    // 해당 위치에 복사되어 전개되는 것이므로 위치를 원하는 곳에 놓아서 요소들의 순서를 바꿀 수 있다.
    
    // 출력
    console.log(물건_200301)
    console.log(물건_200302)
</script>

 

전개 연산자로 배열 전개하고 자료 추가하기

 

전개 연산자를 입력한 곳에 배열이 전개되어 들어가는 것뿐이므로 배열을 여러 번 전개할 수도 있다. 또한 다른 2개 이상의 배열을 붙일때도 활용할 수 있다.

 

전개 연산자 활용

 

객체 전개 연산자

객체에도 깊은 복사를 할 때 전개 연산자를 사용할 수 있다.

 

{...객체}

 

먼저 얕게 복사하는 예를 살펴보자.

 

다음 코드에서 구름을 별에 복사하고 별 이름과 나이를 수정했는데, 구름 이름과 나이까지 수정되는 것을 확인할 수 있다.

 

<script>
    const 구름 = {
    	이름: '구름',
        나이: 6,
        종족: '강이지'
    }
    const 별 = 구름
    별.이름 = '별'
    별.나이 = 1
    
    console.log(JSON.stringify(구름))
    console.log(JSON.stringify(별))
</script>

 

얕은 복사로 객체 복사하기

 

전개 연산자를 사용해서 깊은 복사를 하면 두 객체가 독립적으로 동작하는 것을 볼 수 있다.

 

<script>
    const 구름 = {
    	이름: '구름',
        나이: 6,
        종족: '강이지'
    }
    const 별 = {...구름}
    별.이름 = '별'
    별.나이 = 1
    
    console.log(JSON.stringify(구름))
    console.log(JSON.stringify(별))
</script>

 

전개 연산자를 사용해 깊은 복사하기

 

또한 추가로 자료를 넣을 수도 있다.

 

{...객체, 자료, 자료, 자료}

 

예를 들어 '구름'이라는 객체에 변경하고 싶은 속성만 넣어 추가로 입력한다면 다음과 같이 할 수 있다.

 

<script>
    const 구름 = {
    	이름: '구름',
        나이: 6,
        종족: '강아지'
    }
    const 별 = {
    	...구름,
        이름: '별', // 기존 속성 덮어쓰기
        나이: '1', // 기존 속성 덮어쓰기
        예방접종: true
    }
    
    console.log(JSON.stringify(구름))
    console.log(JSON.stringify(별))
</script>

 

변경하고 싶은 속성만 추가하기

 

객체는 전개 순서가 중요하다. 전개를 어떤 위치에서 하는지에 따라 결과가 달라진다. 이전의 코드에서 전개 부분을 뒤로 옮기면 다음과 같이 출력된다.

 

<script>
    const 구름 = {
    	이름: '구름',
        나이: 6,
        종족: '강아지'
    }
    const 별 = {
        이름: '별',
        나이: '1',
        예방접종: true,
        ...구름 // 뒤에 입력하면 구름이라는 객체가 모두 덮어쓴다
    }
    
    console.log(JSON.stringify(구름))
    console.log(JSON.stringify(별))
</script>

 

전개 부분 뒤로 이동하기

 

생각과 달랐던 부분은 전개를 뒤에 해서 덮어썼음에도 이름과 나이가 먼저 출력되는 것이었다.

 

06 - 3장의 내용은 여기서 마무리된다.

 

내일은 5주차 미션을 진행해보자!

 

오늘 하루도 쌓였다.