TIL 2022/06/15

김병영·2022년 6월 15일
0

TIL

목록 보기
8/19
post-thumbnail

1일1로그 100일완성 IT지식

016 / 017

흔히 컴퓨터라고 하면 우리는 노트북이나 데스크톱 컴퓨터를 떠올린다. 주변에서 가장 쉽게 접할 수 있기 때문이다. 또, 휴대전화나 테블릿도 흔히 접할 수 있는 컴퓨터이다. 이 외에도 다양한 컴퓨터가 존재한다.
슈퍼컴퓨터는 많은 수의 프로세서와 대량의 메모리로 구성된 컴퓨터로 과학기술 연산이나 다양한 분야에서 사용되는 고속 연산기이다. 사용되는 프로세서도 일반적인 프로세서와 다르게 특정 종류의 데이터를 훨씬 빨리 처리하는 명령어로 구성되어 있다.
분산컴퓨팅은 네트워크로 연결되어 서로 독립적으로 작동하는 여러대의 컴퓨터를 말하며 메모리를 공유하지 않고 물리적으로 넓게 흩어져 있다. 검색엔진이나 SNS, 클라우드 컴퓨팅과 같이 대규모 웹서비스에서 사용된다.
이러한 다양한 컴퓨터는 논리적인 면에서 같은 능력을 가지고 있는데 엘런 튜닝의 범용 튜링머신을 통해 증명되었다.

JAVASCRIPT

얕은복사와 깊은복사

javascript의 데이터형은 기본 데이터 타입과 참조형 데이터 타입으로 구분된다.
기본 데이터 타입은 아래와 같이 데이터를 복사하게 된다.

  • 기본 데이터 타입
const a = 1
const b = a

b = 2

console.log(a) // 1
console.log(b) // 2

const c = 1
const d = c

c = 2

console.log(c) // 2
console.log(d) // 1

참조형 데이터 타입 (Array, Object)의 경우 기본형과 동일하게 데이터를 복사하게 되면 얕은 복사(참조 주소 공유)가 되어 다음과 같이 동작한다.

  • 얕은 복사
const arr1 = ['a', 'b', 'c', 'd']
const arr2 = arr1

arr2[4] = 'e'

console.log(arr1) // ['a', 'b', 'c', 'd', 'e']
console.log(arr2) // ['a', 'b', 'c', 'd', 'e']

const arr3 = ['a', 'b', 'c', 'd']
const arr4 = arr3

arr3[4] = 'e'

console.log(arr3) // ['a', 'b', 'c', 'd', 'e']
console.log(arr4) // ['a', 'b', 'c', 'd', 'e']

이는 우리가 흔히 예상하는 결과는 아니다. arr1와 arr4는 ['a', 'b', 'c', 'd'] 로 그대로 남아있길 예상하지만 얕은 복사의 경우는 배열(객체)데이터의 참조 주소만 공유될 뿐 참조 공간이 복사 되는 것은 아니다. 참조 공간까지 복사하기 위해서는 깊은 복사를 해야한다.

  • 깊은 복사 (1차원)
const arr1 = ['a', 'b', 'c', 'd']
const arr2 = arrA.slice()
// slice(), concat(), spread 연산자, Array.from()

arr1[4] = 'e'

console.log(arr1) // ['a', 'b', 'c', 'd', 'e']
console.log(arr2) // ['a', 'b', 'c', 'd']

const obj1 = {
	id: 'id'
}
const obj2 = Object.assign({}, obj1)
// Object.assign(), spread 연산자

obj1.name = 'name'

console.log(arr1) // { id: 'id', name: 'name' }
console.log(arr2) // { id: 'id' }

1차원 배열(객체)의 경우 여러 메서드를 통해 깊은 복사가 가능하다. 하지만 2차원 배열(객체)의 경우에는 해당 메서드를 통해서 복사를 하더라도 얕은 복사가 된다.

  • 얕은 복사 (2차원)
const arr1 = ['a', 'b', [ 'c', 'd' ]]
const arr2 = arrA.slice()
// slice(), concat(), spread 연산자, Array.from()

arr1[1] = 'x'
arr1[2][0] = 'y'

console.log(arr1) // ['x', 'b', [ 'y', 'd']]
console.log(arr2) // ['a', 'b', [ 'y', 'd']]

const obj1 = {
	id: 'id'
	name: {
		first: 'name'
		last: 'kim'
	}
}
const obj2 = Object.assign({}, obj1)
// Object.assign(), spread 연산자

obj1.id = 'ID'
obj1.name.first = 'NAME'

console.log(arr1) // { id: 'ID', name: { first: 'NAME', last: 'kim' } }
console.log(arr2) // { id: 'id', name: { first: 'NAME', last: 'kim' } }

2차원 배열(객체)까지 더 나아가 다차원 배열(객체)까지 깊은 복사를 위해서는 다른 방법이 필요하다. 많이 사용하는 방법으로는 재귀함수를 통해 모든 깊이를 깊은 복사하는 방법과 JSON을 사용하는 방법이 있다. 그 중 JSON을 활용한 방법에 대해서 알아보자.

  • 깊은 복사 (JSON)
const arr1 = ['a', 'b', [ 'c', 'd' ]]
const arr2 = JSON.parse(JSON.stringify(arr1))

arr1[1] = 'x'
arr1[2][0] = 'y'

console.log(arr1) // ['x', 'b', [ 'y', 'd']]
console.log(arr2) // ['a', 'b', [ 'c', 'd']]

const obj1 = {
	id: 'id'
	name: {
		first: 'name'
		last: 'kim'
	}
}
const obj2 = JSON.parse(JSON.stringify(obj1))

obj1.id = 'ID'
obj1.name.first = 'NAME'

console.log(arr1) // { id: 'ID', name: { first: 'NAME', last: 'kim' } }
console.log(arr2) // { id: 'id', name: { first: 'name', last: 'kim' } }

JSON을 활용하여 깊은 복사를 해보았는데 위에 예시에는 없지만 몇가지 데이터 타입에 대해서는 복사되지 않거나 데이터 타입이 달라지는 문제점이 있다. (undefined, date객체 등...)


오늘의 한줄
오늘은 하드웨어 챕터를 마무리 하는 내용으로 하드웨어에 대한 전체적인 요약이 주된 내용이었다.

대학생 때 C언어를 배우면서 포인터의 개념을 배웠는데 javascript를 사용하며 그 내용을 잊고 있었는데
얕은 복사로 인한 문제를 겪어보고 내용을 정리하면 그 때 배운 포인터와 비슷한 개념이라는 생각이 들었다.
profile
--- 생각중 ---

0개의 댓글