JavaScript 계산기 · DOM 실습
이 폴더는 DOM 조작과 이벤트 처리 연습을 모은 장입니다. 작은 예제가 많기 때문에 코드가 어느 요소를 찾고, 어떤 이벤트에서 어떤 스타일이나 값을 바꾸는지 구분하는 것이 핵심입니다.
계산기는 LCD 역할을 하는 input 하나와 숫자/연산자 버튼으로 구성됩니다. 버튼을 누르면 버튼의 value가 LCD에 누적되고, = 버튼을 누르면 eval로 계산합니다.
| 함수 | 역할 | 대상 |
|---|---|---|
| addInput | 숫자/기호 입력 | lcd.value |
| backward | 마지막 문자 삭제 | substr |
| calculate | 수식 계산 | eval |
| clearLcd | 초기화 | 0 |
LCD 값이 초기값 0이면 새 입력으로 교체하고, 이미 다른 값이 있으면 뒤에 붙입니다. 그래서 1, +, 2를 차례로 누르면 1+2가 됩니다.
| 현재 LCD | 누른 버튼 | 결과 |
|---|---|---|
| 0 | 7 | 7 |
| 7 | + | 7+ |
| 7+ | 5 | 7+5 |
| 7+5 | * | 7+5* |
backward()는 LCD 문자열 길이를 구한 뒤 마지막 한 글자를 제외한 문자열만 다시 넣습니다. 빈 문자열이면 바로 return합니다.
eval(lcd.value)는 LCD에 쌓인 문자열을 JavaScript 코드처럼 실행합니다. 계산기 예제에서는 편하지만 사용자 입력을 그대로 실행한다는 점을 이해해야 합니다.
| 입력 | 결과 | 주의 |
|---|---|---|
| 1+2 | 3 | 정상 |
| 7*5 | 35 | 정상 |
| 1+ | 오류 | try/catch 필요 |
| 임의 코드 | 위험 | eval 위험성 |
span/p 예제는 getElementById로 특정 span을 찾고, style.border를 직접 바꿉니다. DOM에서 하나의 요소를 찾아 스타일을 바꾸는 가장 기본적인 패턴입니다.
getElementsByTagName("p")는 문서 안의 모든 p 요소를 모아줍니다. 반환된 목록의 length를 읽으면 개수를 알 수 있습니다.
| 코드 | 의미 | 결과 |
|---|---|---|
| getElementsByTagName | 태그명으로 찾기 | p 목록 |
| pArray | 찾은 p 요소들 | HTMLCollection |
| pArray.length | 개수 | 3 |
| alert | 결과 표시 | 대화상자 |
랜덤 배경 예제는 더블클릭 이벤트에서 RGB 값을 만들고 body 배경색을 바꿉니다. 각 색상 값은 0부터 255까지의 정수입니다.
| 코드 | 범위 | 의미 |
|---|---|---|
| Math.random() | 0 이상 1 미만 | 기본 난수 |
| * 256 | 0 이상 256 미만 | 색상 범위 확대 |
| Math.floor | 0부터 255 | 정수화 |
| rgb(r,g,b) | CSS 색상 | 배경색 적용 |
원문 주석처럼 문자열 더하기 대신 템플릿 리터럴을 쓰면 RGB 문자열을 더 읽기 쉽게 만들 수 있습니다.
| 실수 | 증상 | 해결 |
|---|---|---|
| lcd id 오타 | 버튼을 눌러도 값이 안 바뀝니다. | getElementById 문자열을 확인합니다. |
| eval 오류 처리 없음 | 잘못된 식에서 멈춥니다. | try/catch를 추가합니다. |
| 초기 0 처리 누락 | 07처럼 값이 붙습니다. | 0이면 교체합니다. |
| style 값 단위 누락 | 스타일이 적용되지 않습니다. | CSS 문자열 형식을 지킵니다. |
| RGB 문자열 출력 기대 | 화면에 문자열이 안 보입니다. | 속성 적용과 출력은 다릅니다. |
| 체크 | 통과 기준 |
|---|---|
| addInput | 버튼 value를 LCD에 붙이는 흐름을 설명합니다. |
| backward | substr로 마지막 글자를 지우는 방식을 압니다. |
| calculate | eval 계산과 위험성을 함께 압니다. |
| setBorder | id로 요소를 찾아 style을 바꿉니다. |
| howMany | 태그 목록 length를 읽을 수 있습니다. |
| randomBackground | RGB 난수 생성 흐름을 설명합니다. |
| 확인 | 콘솔 예시 | 의미 |
|---|---|---|
| LCD 요소 | console.log(lcd) | input을 찾았는지 확인합니다. |
| LCD 값 | console.log(lcd.value) | 버튼 입력 결과를 봅니다. |
| p 개수 | console.log(pArray.length) | 태그 검색 결과를 확인합니다. |
| RGB 값 | console.log(r,g,b) | 난수 범위를 확인합니다. |
| 배경색 | console.log(document.body.style.backgroundColor) | CSS 적용 값을 봅니다. |
| 케이스 | 입력 | 예상 결과 |
|---|---|---|
| 숫자 입력 | 7 | LCD가 7 |
| 연산 입력 | 7+5 | LCD가 7+5 |
| BACK | 7+5에서 클릭 | 7+로 변경 |
| = | 7+5 | 12 표시 |
| border | 버튼 클릭 | span 테두리 표시 |
| 더블클릭 | body 더블클릭 | 배경색 변경 |
기본 계산기는 핵심 흐름을 보기 좋지만, 실제 사용성을 생각하면 몇 가지 예외 처리가 더 필요합니다.
| 개선 | 이유 | 확인 |
|---|---|---|
| 연산자 검사 | 1++2 같은 식을 막습니다. | 마지막 문자 확인 |
| 빈 값 검사 | eval 오류를 줄입니다. | lcd.value 길이 확인 |
| 0 나누기 표시 | Infinity 결과를 설명합니다. | 결과 문자열 확인 |
| 결과 후 입력 | 다음 계산 시작을 자연스럽게 합니다. | 계산 완료 상태 변수 |
| NONE 제거 | 버튼 구성을 정리합니다. | 필요한 기능으로 교체 |
이 파일에는 id로 하나를 찾는 방식과 태그명으로 여러 개를 찾는 방식이 함께 나옵니다. 선택 방식에 따라 반환값의 형태가 달라집니다.
| 선택 방식 | 반환 | 사용 예 |
|---|---|---|
| getElementById | 요소 하나 | lcd, mySpan |
| getElementsByTagName | 요소 목록 | p 태그 개수 |
| style 속성 | 인라인 스타일 | border, backgroundColor |
| value 속성 | 폼 입력값 | 계산기 LCD |
| length 속성 | 목록 개수 | pArray.length |
| 연습 | 목표 |
|---|---|
| 버튼 추가 | 소수점이나 괄호 버튼을 추가해 봅니다. |
| 색상 출력 | 생성된 RGB 값을 화면에 함께 표시합니다. |
| p 개수 변경 | p 태그를 추가하고 length 변화를 확인합니다. |
핵심 한 줄 요약
Tags
'php' 카테고리의 다른 글
| JavaScript DOM 동적 삽입 완전 정리 (0) | 2026.07.06 |
|---|---|
| JavaScript e.target 이벤트 완전 정리 (0) | 2026.07.06 |
| JavaScript 타이머 산수 · Enter 계산기 완전 정리 (0) | 2026.07.06 |
| JavaScript onmousemove · onblur · radio 이미지 완전 정리 (0) | 2026.07.06 |
| JavaScript 산수 게임 완전 정리 (0) | 2026.07.06 |
왕진 블로그

댓글