/ JAVASCRIPT

Set함수와 do...while문

오늘은 간단하면서 익숙하지 않던? 함수를 알아보도록 하겠다 며 칠전 프로그래머스에서 알고리즘 문제를 3시간 정도 걸려서 푼 문제를 아주 간단하게 풀어낸 분의 코드에서 Set()함수의 용이함을 깨닫게 되어 이렇게 글로 쓰게 되었다. 이 함수를 이용하면 아주 쉽게 중복되는 요소를 삭제하고 고유한 값들만 남게 재구성 할 수 있다는 것이 가장 큰 장점인 것 같다.

Set() 함수

자료형에 관계 없이 원시 값과 객체 값과 객체 참조 모두 유일한 값을 저장할 수 있다

let arrs = [1, 2, 3, 4, 2, 3, 1, 3]
var newArrs = [... new Set(arrs)]
    
console.log(newArrs)
[ 1, 2, 3, 4 ]
/* 모든 코드의 변수는 공유되고 있다 */ 
arrs = [1, 2, 3, 4, 2, 3, 1, 3]
let newSet = new Set(arrs)
let newArrs2 = Array.from(newSet)

console.log(newArrs2)
[ 1, 2, 3, 4 ]

위 와 같이 Set함수를 이용하면 reduce같은 복잡한 매서드를 이용하지 않고도 아주 손쉽게 중복 요소를 제거 할 수 있다. Array.from을 이용하여 배열로 바꿀 수 있다.

Set함수는 매개변수로 반복가능한 객체(iterable)을 받아 Set객체를 리턴한다

arrs = [1, 2, 3, 4]
let sets = new Set(arrs)
console.log(sets)
Set { 1, 2, 3, 4 }
sets.has(1)               // 배열의 includes처럼 해당 요소를 찾고 boolean값을 반환한다
console.log(sets.has(1))

sets.size                 // 배열의 length 대신 size를 이용하여 길이를 알수있다
console.log(sets.size)

console.log(sets.delete(1))// 해당 요소를 삭제함 mutable(원본값이 변함)

sets.add(1)                // 해당 요소를 추가한다
console.log(sets.add(1))
true
4
true
Set { 2, 3, 4, 1 }

이처럼 Set함수 값을 이용할때 사용되는 매서드는 일반적인 배열 매서드와 조금 다르므로 주의하자

do…while문

반복문에서 for문이나 while문은 자주 사용하지만 do...while문은 나에겐 상대적으로 생소한 문법이었다. 우연히 발견한 페이지에서서 참고해 prompt와 함께 사용해보니 이해하는데 유용해 보았다.

우선 while문과 do...while문의 가장 큰 차이점은 조건식이 실행되는 순서라고 한다.

let condition = false

while (condition) {
    console.log("한 번도 실행되지 않는다")
}

do {
    console.log("무조건 한번은 실행한다")
} while(condition)
무조건 한번은 실행한다

위 식을 보면 while문do...while문보다 조건식이 먼저 실행되는데 Falsy한 값이기에 내부 코드가 실행되지 않지만 do...while문은 내부 코드가 먼저 실행된 후에 조건식이 실행되기에 무조건 한번은 코드가 실행되는 특징이 있다

다음으로 prompt를 이용하여 조건식이 충족하지 않다면 무한 loop를 돌리는 예제를 알아보자

do {
    var answer = parseInt(prompt("1 + 1 = ?"))
    if(answer !== 2) console.log("입력 : ", answer, " 오답 입니다!")
} while (answer !== 2)
    console.log("입력 : ", answer, " 정답 입니다!")

위 식에서 유의할점은 scope 규칙에 의해 do 내부의 변수 answer을 선언할때 let이 아닌 var를 써야 한다는 점이다.

그리고 prompt입력받은 문자열을 반환하고 아무것도 입력하지 않는다면 빈 문자열, 취소를 누르면 null을 반환한다

위에서 조건식이 숫자와 비교하므로 문자열을 숫자로 바꾸는 작업이 필요하다