[javascript] 변수 값 교환하기

KoEunseo·2022년 10월 3일
0

파헤쳐보자

목록 보기
6/31
post-thumbnail

1. temp(임시저장장소)를 만들어서 교환하기

이 방법은 정보처리기사에서 자주 나오는 방법이다. 아니 자주보다 더 많이 나오는 것 같았음... 항상...
처음에는 너무나도 이해가 안돼서 그냥 대각선으로 줄을 그어서 외워버렸었다. 근데 하버드 컴공 강의 듣고 이해됨! 그리고 문제도 많이 풀어보기도 했고.

  1. temp라는 공간을 하나 만들어주었다. 그리고 그곳에 숫자 하나를 넣어 보관한다.
    이때 큰수를 보관하든 작은수를 보관하든 상관 없다. 나는 그냥 0번 인덱스의 숫자를 temp에 할당해주었다.
    중간점검을 해보자면
arr = [5, 3], temp = 5

인 상태이다.

  1. 0번 인덱스의 데이터는 안전하게 보관했으니 데이터를 잃을 걱정을 하지 않아도 된다. 1번 인덱스의 데이터를 0번에 재할당해준다. 위에서 왜 굳이 임시저장소를 만들어 할당했는지 의문이었다면 여기서 임시저장소가 필요한 이유에 대해 깨달을 수 있을 것이다. temp가 없었다면 '5'는 영영 찾을 수 없게 되었을 것이다.
arr = [3, 3], temp = 5
  1. 임시저장소에 보관해둔 데이터를 1번 인덱스에 재할당한다. 그럼 교환 끝!
arr = [3, 5], temp = 5

(+ 뽀너스 ) 이제 필요하지 않은 쓰레기값이 되어버린 남은 temp는... cs50 강의는 c언어라서 더이상 메모리를 사용하지 않을거라면 free()를 아마 해줬던 것 같다. free가 맞는지 모르겠는데 여턴 메모리 누수를 막기 위한 작업을 꼭 마무리로 해줬다.
자바스크립트는 이 작업을 자동으로 해준다고 한다.

데이비드 말론 교수님의 컴공 강의.

자바스크립트로 된 강의는 아니지만 아주 강추! 컴퓨터가 연산하는 과정을 이해할 수 있게 해준다.
차근차근 가르쳐주기때문에 따라가기 전혀 어렵지 않음. 하바드 하바드 하는 이유가 있구나 싶었다ㅋㅋㅋ 🥹
https://www.edwith.org/cs50

2. 구조분해 할당을 통해 교환하기

이건 며칠전에 유튜브를 보다가 진짜 호들짝 놀랐던 방법인데, 알고보니 데일리코딩 레퍼런스에 있더라. 섹션 3 데일리코딩 문제를 다시 풀기로 해서 푸는중인데, 레퍼런스 보고 깜짝 놀랐다.
나는 코딩문제를 풀고 레퍼런스를 잘 보지 않기 때문에(...) 이런 불상사가 일어남ㅋㅋㅋ 진짜 복습 필수다 필수.

구조분해할당이란?

처음에 이 개념에 대해 들었을 때는 뭔소리지 했다. 데이터의 구조를 분해하고 할당한다는 말 그대로의 문법이다. 개념적으로 접근하면 어려운데 막상 사용하면 그냥 편리함을 위한 문법이라는 것을 금방 깨달을 수 있음.

배열 분해하기

const 개린이리스트 = [
  {name: 'seolgi', age: 3, gender: 'female' },
  {name: 'arong', age: 10, gender: 'male' }
]
let [설기, 아롱이] = 개린이리스트
설기;
{name: 'seolgi', age: 3, gender: 'female'}

설기를 영어로 치면 얼마나 귀찮게요? 그리고 배열에 접근하기 얼마나 귀찮게요? 구조분해할당으로 한글로 할당할 수 있다. 설기만 치면 바로 객체가 반환된다.

  • 이때 주의할 것은 배열의 순서대로 할당이 된다는 것이다! 주소에 이름을 준다고 생각하면 이해가 쉬울 것 같다.
  • 필요 없는 요소는 쉼표로 버릴 수도 있다.

객체 분해하기

let 설기 = { 종류: 'pome' };
let {이름 = '설기', 나이 = 3, 성별 = '암컷'} = 설기;
설기 // { 종류: 'pome' }
이름 // '설기'
나이 // 3

값 교환하기

[설기, 아롱이] = [아롱이, 설기]

위에서는 이렇게 바로 할당하면 값을 영영 잃어버린다더니, 이게 어떻게 가능한거냐고 물어본다면...
원시값이 아니라 레퍼런스값이라 가능하다. 레퍼런스값은 값 자체가 아니라 값이 있는 주소를 가리킨다는 뜻.
바로 위의 코드에서 설기는 아롱이의 값이 저장된 주소를 할당하게 되고, 아롱이는 설기의 값이 저장된 주소를 할당받게 된다.
그래서 설기를 치면 아롱이 데이터가 반환되고, 아롱이를 치면 설기 데이터가 반환되게 된다. 설기가 살던 주소인 설기동에 아롱이가 이사가고, 아롱이동에 설기가 이사갔다고 생각하면 이해가 쉬울 것 같다.

arr[5, 3] 의 값을 교환해보자.

let arr = [5, 3]
[5, 3] = [3, 5] // ⚠️ error!
  1. 위에서처럼 원시값을 교환하려고 하면 에러가 뜬다.
    Invalid destructuring assignment target : 잘못된 구조분해할당 대상이라는 의미.
[arr[0], arr[1]] = [arr[1], arr[0]]
arr // [3, 5]
  1. 이렇게 arr의 주소로 접근해서 작성하면 할당이 잘 되는 것을 알 수 있다.

3. XOR로 값 교환하기

이건 진짜 처음 본다.
XOR은 2진법으로 생각해야하는데... 하 귀찮다...
1과 1이 만나면 0,
1과 0이 만나면 1,
0과 0이 만나면 0을 리턴한다.
서로 다른 값이 만나야 1, 같은 값이 만나면 0이다. 이건 진짜 봐도봐도 헷깔림ㅠㅠ
5는 2진법으로 101(2)이고 3은 2진법으로 나타내면 011(2)이다.

let arr = [5, 3]

arr[0] ^= arr[1] //5 ^= 3 일때 
//101(2) ^= 011(2)
//110(2) = 6
//arr[0] = 6이 된다.

여기서 arr = [6, 3] 인 상태.

arr[1] ^= arr[0] // 3 ^= 6 일때
// 011(2) ^= 110(2)
// 101(2) = 5
//arr[1] = 5가 된다.

여기서 arr = [6, 5] 인 상태.

arr[0] ^= arr[1] // 6 ^= 5 일때
// 110(2) ^= 101(2)
// 011(2) = 3
// arr[0] = 3이 된다.

여기서 arr = [3, 5] 인 상태.

바꾸고 싶은 값 두개에 xor을 세번 해주면 되는구나... @.@ 숫자는 정말... 신비롭다...

profile
주니어 플러터 개발자의 고군분투기

0개의 댓글