8.1 의사난수
가끔 프로그래머는 "특정 리스트에서 저녁에 볼 무작위 영화를 선택하기", "복권 당첨자 선택하기", "스마트폰 흔들 때 노래 목록 섞기", "메시지를 암호화할 무작위 숫자 선택하기" 같은 단순해 보이는 문제를 마주할 때가 있어. 그럴 때마다 당연한 질문이 드는 거지: 그럼 무작위 숫자는 어떻게 얻지?
사실 "진짜 무작위 숫자"가 필요하다면, 그걸 얻는 건 꽤 어려워. 그래서 컴퓨터에 특별한 수학적인 보조 프로세서를 장착하기도 하는데, 이들은 진정한 무작위성을 충족하는 숫자를 생성할 수 있어.
그래서 프로그래머들은 그들만의 해결책을 고안했어 — 의사난수들. 의사난수란 일종의 시퀀스로, 겉보기에는 무작위로 보이지만, 전문가가 자세히 분석하면 특정 패턴을 찾아낼 수 있는 숫자들이야. 비밀 문서를 암호화하기에는 적합하지 않지만, 게임에서 주사위를 던지는 걸 흉내내기에는 충분해.
의사난수 시퀀스를 생성하는 알고리즘이 많이 있고, 거의 모든 알고리즘은 이전 숫자와 몇 가지 보조 숫자를 기반으로 다음 무작위 숫자를 생성해.
예를 들어, 이 프로그램은 화면에 1000개의 고유한 숫자를 출력할 거야:
let a = 41;
let c = 11119;
let m = 11113;
let seed = 1;
function getNextRandom() {
seed = (a * seed + c) % m;
return seed;
}
for (let t = 0; t < 1000; t++) {
let x = getNextRandom();
console.log(x);
}
참고로, 우리는 개별 의사난수에 대해 말하는 것이 아니라 시퀀스에 대해 이야기하는 거야, 왜냐면 개별 숫자를 보고 그게 무작위인지 아닌지 알 수 없거든.
무작위 숫자는 여러 방법으로 얻을 수 있어:
function getNextRandom() {
return 4; # 이건 진짜 무작위 숫자야 (나는 이 숫자를 주사위로 던졌어)
}
8.2 switch 연산자
switch
연산자는 표현식의 값에 따라 여러 코드 블록 중 하나를 실행하는 데 사용돼. 특히 하나의 값을 여러 가능한 옵션과 비교해야 할 때 유용해.
구문:
switch(expression) {
case value1:
// expression === value1이면 실행될 코드
break;
case value2:
// expression === value2이면 실행될 코드
break;
// ...
default:
// 어떤 값도 일치하지 않으면 실행될 코드
}
예시:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "월요일";
break;
case 2:
dayName = "화요일";
break;
case 3:
dayName = "수요일";
break;
case 4:
dayName = "목요일";
break;
case 5:
dayName = "금요일";
break;
case 6:
dayName = "토요일";
break;
case 7:
dayName = "일요일";
break;
default:
dayName = "잘못된 요일";
}
console.log(dayName); // "수요일"
8.3 ?? 연산자
??
연산자, 또는 nullish coalescing operator,는 좌측 피연산자가 null
이거나 undefined
일 때 기본값을 할당하기 위해 사용돼. 이는 0
, false
, 빈 문자열(""
) 같은 다른 falsy 값을 위한 기본값을 피할 수 있게 해줘.
구문:
let result = value1 ?? value2;
만약 value1이 null
이 아니거나 undefined
가 아니라면, result는 value1이 될 거야. 그렇지 않으면 result는 value2가 돼.
예시들:
let foo = null ?? 'default';
console.log(foo); // 'default'
let bar = 0 ?? 'default';
console.log(bar); // 0 (0은 null이나 undefined가 아님)
let baz = undefined ?? 'default';
console.log(baz); // 'default'
논리적 OR (||)와의 차이점
||
연산자도 기본값을 설정하는 데 사용될 수 있지만, 이 연산자는 0
, ""
, NaN
같은 모든 falsy 값에 대해 오른쪽 피연산자를 반환해.
비교 예시:
let value = 0 || 'default';
console.log(value); // 'default' (왜냐면 0은 falsy 값이기 때문에)
let value2 = 0 ?? 'default';
console.log(value2); // 0 (왜냐면 0은 null이나 undefined가 아니기 때문에)
응용
??
연산자는 null
이나 undefined
일 때만 기본값을 설정하고, 0
이나 ""
같은 falsy 값을 유지해야 하는 상황에서 유용해.
실제 사용 예시
예시 1. 구성 객체의 기본값:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'blue';
// 설정 로직의 나머지 부분
}
예시 2. 함수의 기본 매개변수:
function printMessage(message) {
message = message ?? 'No message provided';
console.log(message);
}
printMessage(null); // 'No message provided'
printMessage('Hello'); // 'Hello'
??
연산자의 사용은 더 깔끔하고 예측 가능한 코드를 작성할 수 있게 해줘, 특히 null
이나 undefined
같은 무값을 고려해야 할 때 말이야.
GO TO FULL VERSION