JavaScript에서 어떤 숫자가 홀수인지 판별하는 가장 일반적이고 간단한 방법은 나머지 연산자(Modulo Operator) % 를 사용하는 것이다. 정수를 2로 나누었을 때 나머지가 0이 아니면 홀수이다.
🧮 방법 1: 나머지 연산자 (%) 사용
원리: 홀수/짝수 판별의 핵심 원리는 수학적인 정의에 있다.
- 짝수(even number)는 어떤 정수를 2로 나누었을 때 나누어 떨어지는 정수, 즉 나머지(remainder)가 0인 수이다.
- 홀수(odd number)는 2로 나누어 떨어지지 않는 정수이다. 즉 나머지(remainder)가 1 혹은 -1인 수이다.
- JavaScript의 나머지 연산자 (%)는 바로 이 나머지 값을 계산해주는 연산자이다.
숫자(number) % 2 를 계산하면 'number를 2로 나눈 나머지'가 직접 구해진다.
따라서, 이 나머지 값이 0이 아닌지를 확인하는 number % 2 !== 0 조건은 짝수, 홀수의 수학적 정의를 코드로 직접 구현한 것이 된다.
function isOddUsingModulo(number) {
// number를 2로 나눈 나머지가 0이 아닌지 확인한다.
// 0이 아니면 true(홀수), 0이면 false(짝수)를 반환한다.
return number % 2 !== 0;
}
설명:
- number % 2는 number를 2로 나눈 나머지를 계산한다.
- !== 0은 그 나머지가 0과 다른지 비교한다.
- 정수일 경우, 홀수는 나머지가 1 또는 -1이 되므로 0과 다르다 (true 반환). 짝수 및 0은 나머지가 0이므로 0과 같다 (false 반환).
예시:
console.log(isOddUsingModulo(3)); // true (3 % 2 = 1)
console.log(isOddUsingModulo(10)); // false (10 % 2 = 0)
console.log(isOddUsingModulo(0)); // false (0 % 2 = 0)
console.log(isOddUsingModulo(-5)); // true (-5 % 2 = -1)
console.log(isOddUsingModulo(-8)); // false (-8 % 2 = 0)
💡 주의: 이 방법은 주로 **정수(Integer)**에 대해 홀/짝을 판별할 때 사용된다. 소수(예: 3.14)에 % 2를 사용하면 예상과 다른 나머지 값(1.14)이 나올 수 있으며, number % 2 !== 0 자체는 true를 반환할 수 있다. 만약 정수임을 명확히 하고 홀수 판별을 해야 한다면, 먼저 Number.isInteger(number)를 사용하여 정수인지 확인하는 것이 좋다.
이러는 가장 큰 이유는 애초에 홀수와 짝수는 정수에만 해당하는 개념이기 때문이다. number % 2가 true나 false인 것이 홀수, 짝수의 조건이 아니다.
function isIntegerAndOdd(number) {
return Number.isInteger(number) && number % 2 !== 0;
}
console.log(isIntegerAndOdd(3.14)); // false (정수가 아님)
console.log(isIntegerAndOdd(5)); // true (정수이고 홀수)
⚙️ 방법 2: 비트 연산자 (&) 사용
정수의 경우, 비트 단위 AND 연산자 &를 사용하여 홀수 여부를 판별할 수도 있다. 이 방법은 때때로 나머지 연산보다 성능상 이점이 있을 수 있다 (최신 JavaScript 엔진에서는 최적화로 인해 큰 차이가 없을 수도 있다).
원리:
정수를 2진수로 표현했을 때, 가장 오른쪽 비트(최하위 비트, Least Significant Bit, LSB)가 1이면 홀수이고, 0이면 짝수이다.
비트 AND 연산자 &를 사용하여 number와 1을 연산(number & 1)하면, 다른 모든 비트는 0이 되고 최하위 비트만 남게 된다. 따라서 결과가 1이면 홀수, 0이면 짝수이다.
function isOddUsingBitwise(number) {
// number의 비트와 1의 비트를 AND 연산한 결과가 1인지 확인한다.
// 결과가 1이면 true(홀수), 0이면 false(짝수)를 반환한다.
return (number & 1) === 1;
}
설명:
- number & 1은 number의 이진수 표현과 1의 이진수 표현(...0001) 간의 비트별 AND 연산을 수행한다.
- 결과적으로 number의 최하위 비트 값만 남게 된다 (홀수면 1, 짝수면 0).
- === 1은 이 결과가 1과 같은지 비교한다.
- 이 방법은 양수, 음수 정수 모두에 대해 정확하게 동작한다.
예시:
console.log(isOddUsingBitwise(3)); // true (3 & 1 = 1) (3 = ...0011)
console.log(isOddUsingBitwise(10)); // false (10 & 1 = 0) (10 = ...1010)
console.log(isOddUsingBitwise(0)); // false (0 & 1 = 0)
console.log(isOddUsingBitwise(-5)); // true (-5 & 1 = 1) (음수는 2의 보수 표현, 최하위 비트가 1)
console.log(isOddUsingBitwise(-8)); // false (-8 & 1 = 0) (음수는 2의 보수 표현, 최하위 비트가 0)
💡 참고: 비트 연산자는 정수에 대해서만 의미 있게 동작하므로, 이 방법은 정수 판별에 더 적합하다. 또한, 코드 가독성 측면에서는 % 연산자가 더 직관적일 수 있다.
✨ BigInt의 경우
매우 큰 정수를 다루는 BigInt 타입의 경우에도 위 두 방법 모두 동일하게 적용할 수 있다. 단, 리터럴과 연산자에 n 접미사를 붙여야 한다.
console.log(123n % 2n !== 0n); // true
console.log((123n & 1n) === 1n); // true
console.log(124n % 2n !== 0n); // false
console.log((124n & 1n) === 1n); // false
결론
일반적으로 나머지 연산자 (%) 를 사용하는 것이 가장 가독성이 좋고 이해하기 쉬운 방법이다. 정수 연산의 성능이 매우 중요한 경우 비트 연산자 (&) 를 고려할 수 있다. 어떤 방법을 사용하든, 정수에 대한 홀/짝 판별인지 명확히 하고 필요하다면 Number.isInteger() 검사를 추가하는 것이 좋다.
'프로그래밍 > 개념 뽀개기' 카테고리의 다른 글
무한스크롤 웹페이지에서 페이지란 무엇일까? (0) | 2025.04.01 |
---|---|
✨ 비트 연산자 (Bitwise Operators)란 무엇인가? (0) | 2025.03.29 |
✨ 평가(Evaluation)란 무엇인가? (0) | 2025.03.29 |
✨ 표현식(Expression) 개념, 목적, 예시 (0) | 2025.03.29 |
인스턴스란 무엇인가? (0) | 2025.03.29 |