본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

JavaScript 문자열 연산 — 타입 혼합과 비교 완전 정리

by 왕진 2026. 7. 3.
반응형

 

 

Web Development · JavaScript

JavaScript 문자열 연산 —
+ 연산자의 두 얼굴

숫자+숫자는 덧셈, 문자열이 끼면 연결 — 왼쪽부터 계산되는 순서가 결과를 바꾼다
시작 오늘 분석할 코드

같은 + 연산자인데 어떤 줄은 숫자를 더하고, 어떤 줄은 글자를 이어 붙인다. 심지어 같은 세 값 23, 35, "abc"를 쓰고도 순서만 바꾸면 결과가 완전히 달라진다. 이 코드는 그 함정을 한눈에 보여준다.

초보자가 가장 많이 헷갈리는 지점이 바로 여기다. "숫자처럼 보이는 값"과 "진짜 숫자"를 헷갈리면, 화면에 계산기가 아니라 글자만 이어붙은 결과가 나온다. 아래에서 한 줄씩 왜 이런 결과가 나오는지 순서대로 뜯어본다.

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>문자열 연산</title></head> <body> <h3>문자열 연산</h3> <hr> <script> document.write("abc" + 23 + "<br>"); document.write(23 + "abc" + "<br>"); document.write(23 + "35" + "<br>"); document.write(23 + 35 + "<br>"); document.write(23 + 35 + "abc" + "<br>"); document.write("abc" + 23 + 35 + "<br><hr>"); let name = "kitae"; document.write(name == "kitae"); document.write("<br>"); document.write(name > "park"); </script> </body> </html>
실제 출력 미리보기

문자열 연산


abc23

23abc

2335

58

58abc

abc2335


true

false

용어 용어 정리
+ 연산자피연산자가 둘 다 숫자면 덧셈, 하나라도 문자열이면 연결(concatenation)
형변환타입이 자동으로 바뀌는 것 (implicit type coercion)
문자열 연결두 문자열을 이어 붙여 하나로 합치는 것
좌결합성같은 우선순위 연산자는 왼쪽부터 순서대로 계산
document.writeHTML 문서에 즉시 텍스트를 출력하는 JS 함수
== (동등 연산자)타입을 서로 맞춘 뒤 값이 같은지 비교
사전순 비교문자열의 > < 비교는 문자 코드(유니코드) 순서로 비교
let재할당 가능한 변수를 선언하는 키워드

1 + 연산자의 두 얼굴
왜 같은 기호가 다르게 동작하는가?

JavaScript의 +는 사실 연산자 하나에 두 가지 임무가 있다. 좌우 값이 둘 다 숫자면 산술 덧셈을 하고, 하나라도 문자열이면 두 값을 이어 붙이는 문자열 연결을 한다. 어느 쪽으로 동작할지는 JS 엔진이 실행 순간에 좌우 값의 타입을 보고 그때그때 결정한다.

※ 규칙 한 줄: 둘 다 숫자 → 덧셈 / 하나라도 문자열 → 연결. 이 한 줄만 기억하면 이번 코드의 모든 결과가 설명된다.

2 "abc" + 23 → "abc23"
숫자가 왜 문자로 바뀌는가?

"abc" + 23에서 왼쪽이 문자열이므로 JS는 + 를 연결 연산으로 결정한다. 그 순간 오른쪽의 숫자 23은 계산에 쓰이지 못하고 문자열 "23"으로 강제 변환된 뒤 뒤에 붙는다. 그래서 결과는 58이 아니라 "abc23"이다.

"abc" + 23 → "abc" + "23" (23이 문자열로 변환) → "abc23"

3 23 + "abc" → "23abc"
순서를 바꿔도 결과가 같은 이유

이번엔 숫자가 먼저 온다. 그래도 오른쪽에 문자열 "abc"가 있으므로 규칙은 똑같이 적용된다 — 하나라도 문자열이면 연결. 왼쪽 숫자 23"23"으로 바뀌어 "abc" 앞에 붙는다. 즉 좌우 어느 쪽에 문자열이 있든 결과는 "연결"이라는 점은 변하지 않는다.

23 + "abc" → "23" + "abc" (23이 문자열로 변환) → "23abc"

 

반응형

 

4 23 + "35" → "2335"
둘 다 숫자처럼 생겼는데 왜 덧셈이 아닌가?

"35"는 숫자처럼 보이지만 따옴표로 감싼 순간 문자열이다. JS는 값의 겉모습이 아니라 실제 타입만 본다. 오른쪽이 문자열이므로 23"23"으로 바뀌어 연결되고, 결과는 58이 아니라 두 글자를 이어붙인 "2335"가 된다.

※ 이 함정이 실무에서 제일 많이 발생한다. 폼 입력값, URL 파라미터, JSON에서 온 값은 숫자로 보여도 실제론 문자열인 경우가 많다.

5 23 + 35 → 58
진짜 덧셈이 일어나는 유일한 조건

이번엔 양쪽 모두 순수한 숫자 리터럴이다. 문자열이 단 하나도 끼어있지 않으므로 JS는 +산술 덧셈으로 처리한다. 23 + 35 = 58. 여기까지는 다들 익숙한 계산기 그대로다.

23 + 35 → (둘 다 숫자) → 58

6 23 + 35 + "abc" → "58abc" — 왼쪽부터 계산되는 순서
왜 "2335abc"가 아니라 "58abc"인가?

여기가 이번 코드의 핵심 함정이다. +가 세 개 이상 이어지면 JS는 한꺼번에 계산하지 않고 왼쪽에서 오른쪽 순서로 두 개씩 계산한다. 먼저 23 + 35부터 계산되는데, 이 시점엔 둘 다 숫자이므로 먼저 58이라는 숫자로 확정된다. 그 다음에야 58 + "abc"가 계산되고, 여기서 처음으로 문자열이 등장하니 그제서야 연결이 일어나 "58abc"가 된다.

23 + 35 + "abc" 1단계) 23 + 35 → 58 (둘 다 숫자 → 덧셈) 2단계) 58 + "abc" → "58abc" (문자열 등장 → 연결) 결과: "58abc"
※ 핵심 규칙 — 평가 순서가 값을 결정한다
  • + 는 한 번에 하나씩, 왼쪽 두 값부터 순서대로 계산된다
  • 어느 단계에서 문자열이 처음 나타나느냐에 따라 그 뒤부터 전부 연결로 바뀐다
  • 숫자끼리 먼저 만나면 그 부분은 미리 계산되어 숫자로 "굳어진다"

7 "abc" + 23 + 35 → "abc2335" — 문자열이 앞서면 끝까지 연결
같은 숫자인데 왜 이번엔 58이 안 나오는가?

이번엔 문자열이 맨 앞에 있다. 1단계에서 "abc" + 23을 계산하는데, 왼쪽이 이미 문자열이므로 이 시점부터 결과가 문자열로 확정된다 — "abc23". 그러면 2단계는 "abc23" + 35가 되고, 왼쪽이 문자열이니 오른쪽 35"35"로 변환되어 그냥 뒤에 붙는다. 결과는 "abc2335". 앞서 6번 섹션과 피연산자는 똑같은데(23, 35, "abc") 순서만 달라서 정반대의 결과가 나온 것이다.

"abc" + 23 + 35 1단계) "abc" + 23 → "abc23" (문자열 등장 → 이후 전부 연결로 확정) 2단계) "abc23" + 35 → "abc2335" (35도 문자열로 변환되어 연결) 결과: "abc2335"
23 + 35 + "abc"
숫자 둘이 먼저 만남 → 58로 굳어진 뒤 문자열과 연결 → "58abc"
"abc" + 23 + 35
문자열이 먼저 만남 → 그 즉시 연결 모드 확정 → "abc2335"

8 문자열 비교 — ==과 사전순 >
name == "kitae"와 name > "park"은 왜 이렇게 나오는가?

let name = "kitae" 상태에서 name == "kitae"는 두 문자열의 글자가 완전히 동일하므로 true다. 반면 name > "park"는 숫자 비교가 아니라 사전순(문자 코드 순서) 비교다. 알파벳 순서로 "kitae"의 첫 글자 k는 "park"의 첫 글자 p보다 앞에 오므로(코드값이 더 작으므로) "kitae" > "park"false다.

name == "kitae" → "kitae" 와 "kitae" 완전히 같음 → true name > "park" → 'k'(107) vs 'p'(112) → k가 더 작음 → false
※ 문자열 비교는 첫 글자부터 순서대로 코드값을 비교하다가 다르면 그 자리에서 승패가 결정된다. 마치 사전에서 단어를 찾을 때 앞 글자부터 비교하는 것과 같다.

9 브라우저가 이 코드를 실행하는 순서
위에서 아래로, 한 줄 안에서는 왼쪽에서 오른쪽으로

브라우저는 <script> 안의 코드를 한 줄씩 순서대로 실행하고, 한 줄 안에서 +가 여러 번 나오면 왼쪽부터 두 값씩 계산한다. 이번 코드 전체가 실행되는 흐름을 단계별로 정리하면 다음과 같다.

1
"abc" + 23 + "<br>"왼쪽이 문자열 → 전부 연결 → "abc23<br>" 출력
2
23 + "abc" + "<br>"오른쪽에 문자열 등장 → 연결 → "23abc<br>" 출력
3
23 + "35" + "<br>""35"는 문자열 → 연결 → "2335<br>" 출력
4
23 + 35 + "<br>"둘 다 숫자 → 58 계산 후 문자열과 연결 → "58<br>" 출력
5
23 + 35 + "abc" + "<br>"먼저 58 계산 → 그 다음 문자열들과 순서대로 연결 → "58abc<br>" 출력
6
"abc" + 23 + 35 + "<br><hr>"맨 앞이 문자열 → 처음부터 끝까지 전부 연결 → "abc2335<br><hr>" 출력
7
let name = "kitae"변수 name에 문자열 "kitae" 저장
8
name == "kitae" → name > "park"동등 비교는 true, 사전순 비교는 false → 순서대로 출력
※ 여섯 번의 document.write가 실행될 때마다 결과가 페이지에 그대로 이어 붙는다. 그래서 실제 브라우저 화면에는 여섯 줄의 결과가 위에서부터 순서대로 쌓여 보인다.

10 자주 하는 실수
실수 증상 해결
"23" + 35가 58일 거라 착각 실제론 "2335"로 이어 붙여짐 더하기 전에 Number("23")로 형변환
폼 입력값(문자열) + 숫자를 그냥 더함 사용자가 입력한 숫자가 문자로 이어붙음 (예: 5+3 = "53") Number()·parseInt()로 먼저 변환 후 연산
23+35+"abc""2335abc"로 예상 실제론 "58abc" — 순서를 잘못 이해 + 는 왼쪽부터 두 개씩 계산된다는 규칙 암기
문자열 "10" > "9"를 true로 예상 사전순 비교라 실제론 false ('1' < '9') 숫자로 비교하려면 양쪽 다 Number() 변환
==가 타입까지 검사한다고 착각 1 == "1"처럼 타입 다른데 true가 나옴 타입까지 엄격히 비교하려면 === 사용

핵심 한 줄 요약

+ 연산자둘 다 숫자면 덧셈, 하나라도 문자열이면 연결
형변환문자열과 만나면 숫자가 자동으로 문자열로 바뀜
평가 순서+ 가 여러 개면 왼쪽부터 두 개씩 순서대로 계산
23+35+"abc"숫자 먼저 계산되어 58 → "58abc"
"abc"+23+35문자열이 먼저라 처음부터 끝까지 연결 → "abc2335"
== 비교값이 같은지 (타입 변환 허용)
문자열 > < 비교숫자 크기가 아니라 사전순(문자 코드) 비교

Tags

#JavaScript #문자열연산 #문자열연결 #형변환 #plus연산자 #문자열비교 #사전순 #타입강제 #자바스크립트기초 #JS #암묵적형변환 #연산자우선순위 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
JavaScript, 문자열연산, 문자열연결, 형변환, plus연산자, 문자열비교, 사전순, 타입강제, 자바스크립트기초, JS, 암묵적형변환, 연산자우선순위, 웹개발, 티스토리
반응형

댓글