본문 바로가기
  • 사람은 무언가를 배울 필요가 있을때가 되서야 비로소 배우게 된다.
JavaScript

[JS] "10"와 "15"중 큰 수는 ? - 문자열 크기 비교에 대해서

by YoHaYo 2023. 10. 6.
728x90
반응형

단순히 입력한 수 중에 큰 수를 출력해주는 함수가 있다.

function compare(a, b) {
  if (a > b) {
    console.log(`입력된 수: ${a},${b} / 큰수 : ${a}`)
  } else if (a < b){
    console.log(`입력된 수: ${a},${b} / 큰수 : ${b}`)
  } else if (a===b){
    console.log("Same Value, Same Type")
  } else if (a==b) {
    console.log("Same Value, Different Type")
  } else {
    console.log("오류발생!")
  }
};
compare(5, '15'); // case 1
compare('5', '9'); // case 2
compare('5', '15'); // case 3

스크롤을 내리기 전에 case 1, 2, 3의 결과를 조금만 고민해보자.

 

 

 

.

 

 

.

 

 

.

 

 

.

 

 

 

결과는 ? 

compare(5, '15'); // 입력된 수: 5,15 / 큰수 : 15
compare('5', '9'); // 입력된 수: 5,15 / 큰수 : 9
compare('5', '15'); // 입력된 수: 5,15 / 큰수 : 5

 

우선 case별로 살펴보자.

 

case 1

5와 '15'의 비교.

이 경우 자바스크립트같은 동적언어의 특징인 자동 타입변환이 일어나면서 

'15' 를 15로 변환해서 판정해준다.

그러므로 결과는 단순히 큰 수를 출력해준다. 

 

case 2 

그렇다면 문자열과 문자열의 비교는 어떨까?

일단 '5' 와 '9' 중 '9'가 크니 결과는 '9' 일 것 같다. 

그리고 실제로 실행해보니 예측한대로 나왔다. 

 

여기까지만 하면 큰 문제가 없다.

 

case 3 

일단 결과가 믿기 힘들다. '5', '15' 중 대체 왜 큰 수가 '5'가 나올까?

그리고 case 2에서는 왜 제대로 큰 수가 나왔을까?

 

해답은 아스키코드( ASCII )에 있다.

 

숫자와 알파벳 대소문자의 아스키코드를 보자.

  • 숫자 0 ~ 10 : 48 ~ 57
  • 알파벳 대문자  A ~ Z : 65 ~ 90
  • 알파벳 소문자  a ~ z : 97 ~ 122

숫자 < 알파벳 대문자 < 알파벳 소문자 순으로 코드 값이 커진다.

 

 

즉, case 2 에서 비교했던 값은 단순히 '5'와 '9'비교한것이 아닌 아스키코드값 53과 56을 비교했던 것이다.

 

그럼 case 3 의 경우는?

 

아스키코드를 비교할때 사전 순으로 빠를 수록 큰 수라는 것을 명심하자.

apple과 banana 중 사전에 먼저오는 단어는 당연히 apple일 것이다. 즉, 단어의 첫 글자로 우선순위를 매기는 것이다.

 

이제 case 3 를 보자.

 

아스키코드의 시점으로  '5', '15' 를 보자. 

 '5', '15' 를 비교하는 것이 아니다. 단어의 첫글자인  '5', '1' 를 비교하고 있는 것이다.

그렇게 보는 순간 당연히  '5', '1' 중 큰 수는 당연히  '5'이다.

 

 

 

이제   '5', '15' 를 비교하면  '5'가 큰 수로 나오게 되는 어처구니 없는 현상을 이해할 수 있게 되었다..!

 

반응형

댓글