Bibi's DevLog ๐ค๐
[์ธํ๋ฐ]Javascript์ ๋ฌธ - ๊ณ์ฐ๊ธฐ ๋ง์ง๋ง - ํ ์ค๋ก ์ ๋ ฅ๋ฐ์ ์ฒ๋ฆฌ ๋ณธ๋ฌธ
[์ธํ๋ฐ]Javascript์ ๋ฌธ - ๊ณ์ฐ๊ธฐ ๋ง์ง๋ง - ํ ์ค๋ก ์ ๋ ฅ๋ฐ์ ์ฒ๋ฆฌ
๋น๋น bibi 2020. 10. 28. 17:57* ์ด ๊ธ์ ์ธํ๋ฐ์์ ์ ๊ณตํ๋ ํธ๋ ์ค๋์ ์ ๋ฃ ๊ฐ์ '์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋ฐฐ์๋ณด๋ Javascript ์ ๋ฌธ - ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ ์ฝ์ค ๋ ๋ฒจ1'๋ฅผ ๋ฃ๊ณ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๊ฐ์ ๋ด์ฉ์ ๋ํด, ์ ๊ฐ ํ๊ธฐํ๊ณ ๊ตฌ๊ธ๋งํ ๋ด์ฉ์ด ์ ๋ฆฌ๋์ด ์์ต๋๋ค. ์ด๋ณด์ธ ์ ๊ฐ ์ดํดํ ๋๋ก ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋ถ์ ํํ ๋ด์ฉ์ด ์์ ์ ์์์ ๊ฐ์ํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๋ ์ธํ๋ฐ ์ธก ๋ต๋ณ์ ๋ฐ์ ์ ์ด ์์ผ๋(https://bibi6666667.tistory.com/37), ์ ์๊ถ์ ๋ฌธ์ ๊ฐ ๋๋ค๋ฉด ๋ณดํธ ๋ชจ๋(๋น๊ณต๊ฐ)๋ก ์ ํํ๊ฒ ์ต๋๋ค.
ํ์ต ๋ชฉํ
- ๋ฌธ์์ด์ ์กฐ์๊ณผ ๋ฆฌ์คํธ์ ์ฌ์ฉ์ ๊ฒฝํํ๋ค.
์๊ตฌ์ฌํญ
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฌธ์์ด ๊ฐ์ ๋ฐ๋ผ ์ฌ์น์ฐ์ฐ์ ์ํํ ์ ์๋ ๊ณ์ฐ๊ธฐ๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- ๋ฌธ์์ด ๊ณ์ฐ๊ธฐ๋ ์ฌ์น์ฐ์ฐ์ ๊ณ์ฐ ์ฐ์ ์์๊ฐ ์๋ ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ ๊ณ์ฐ ์์๊ฐ ๊ฒฐ์ ๋๋ค. ์ฆ, ์ํ์์๋ ๊ณฑ์ , ๋๋์ ์ด ๋ง์ , ๋บ์ ๋ณด๋ค ๋จผ์ ๊ณ์ฐํด์ผ ํ์ง๋ง ์ด๋ฅผ ๋ฌด์ํ๋ค.
- ์๋ฅผ ๋ค์ด "2 + 3 * 4 / 2"์ ๊ฐ์ ๋ฌธ์์ด์ ์ ๋ ฅํ ๊ฒฝ์ฐ 2 + 3 * 4 / 2 ์คํ ๊ฒฐ๊ณผ์ธ 10์ ์ถ๋ ฅํด์ผ ํ๋ค.
- ์ ๋ ฅ์ ํ ์คํธ๋ก ํ ์ค๋ก ๋ฐ๊ณ ์ซ์์ ์ฐ์ฐ์ ์ฌ์ด๋ ์คํ์ด์ค๋ก ๋ถํ ํ๋ค. 2 + 3 * 5 ์ฒ๋ผ ์ ๋ ฅ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ค.
- ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ html์ input๊ณผ div ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
ํํธ
- ๋ฌธ์์ด์ split(" ")์ ์ด์ฉํ๋ฉด ์๊ตฌ์ฌํญ๋๋ก ๊ตฌํํ ์ ์๋ค.
๋์ ๊ณผ์
- ๊ณต๋ฐฑ ์์ด ์ ๋ ฅ์ ๋ฐ์๋ณธ๋ค.
- ์ผ๋ฐ ๊ณ์ฐ๊ธฐ์ฒ๋ผ ๋ฒํผ UI๋ฅผ ์ด์ฉํด ๊ตฌํํ๋ค.
- CSS๋ฅผ ์์๊ฒ ์ ํ๋ณธ๋ค.
๋ด๊ฐ ์ง ์ฝ๋
- ์ฒซ ๋ ๊ตฌํํ ์ฝ๋์์ ๊ทธ๋์ ๋ฐฐ์ด ๊ฒ๋ค์ ์์ฉํด๋ดค๋ค. (๊ฐ์ฒด, ํ๋กํผํฐ, ๋ฉ์๋ ์ฌ์ฉ ๋ฑ)
๐พ ๋๋ฒ๊น
โ Uncaught TypeError: Cannot read property 'Value' of null
-> ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ html๋ณด๋ค ๋จผ์ ์คํ๋์ด์ ๋ํ๋๋ ์ค๋ฅ๋ผ๊ณ .
์ฝ๋์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ถ๋ถ์ ๊ฐ๋ฅํ ๋ฌธ์ ์๋ ๋ถ๋ถ์ผ๋ก ์ฎ๊ธฐ๊ณ ๋ค์ ์คํํ๋, ๋ ์ด์ ์์ ๊ฐ์ ์๋ฌ๋ ๋จ์ง ์๋๋ค.
(๊ธฐ์กด <head>ํ๊ทธ ๋ด์ ์๋ <script></script> ๋ถ๋ถ์ <body></body>๋ด๋ก ์ฎ๊ฒผ๋ค.)
์ฐธ๊ณ : sir.kr/cm_free/941891
-๋ค์ ๋ถ์น์ ํ ํ๋ก๊ทธ๋จ์ด์ง๋ง ์๋์ ํ๋ค.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1> ๊ณ์ฐ๊ธฐ ํ๋ก๊ทธ๋จ 1 </h1>
๊ณ์ฐ์์ ์
๋ ฅํ์ธ์.<br>
- ์ซ์์ ์ฐ์ฐ์ ์ฌ์ด์๋ ๊ผญ "๋์ด์ฐ๊ธฐ"๋ฅผ ํด ์ฃผ์ธ์.<br>
- ๋ํ๊ธฐ๋ +, ๋นผ๊ธฐ๋ -, ๊ณฑํ๊ธฐ๋ *, ๋๋๊ธฐ๋ /๋ก ์
๋ ฅํด ์ฃผ์ธ์.<br>
- ๊ณ์ฐ์์ ์๋ถํฐ ์์๋๋ก ๊ณ์ฐํฉ๋๋ค. <br>
- ๋ค์ ๊ณ์ฐํ๋ ค๋ฉด ์๋ก๊ณ ์นจ(F5)์ ๋๋ฅด์ธ์.<br>
<input type="text" id="input">
<button onclick="main()">๊ณ์ฐํ๊ธฐ</button>
<div id="result"></div>
<script>
var input = {};
var calculator = {};
var output = {};
var main = function () {
input.putArr();
calculator.classify();
calculator.calculate();
output.print();
}
input.Arr = [];
input.putArr = function () {
var input = document.getElementById("input").value;
this.Arr = input.split(" ");
console.log("arr : " + this.Arr);
return this.Arr;
}
calculator.numArr = [];
calculator.symArr = [];
calculator.classify = function () {
var arr = input.putArr();
for (var i = 0; i < arr.length; i++) {
if (isNaN(Number(arr[i])) === true) {
this.symArr.push(arr[i]);
} else {
this.numArr.push(arr[i]);
}
}
console.log(this.numArr);
console.log(this.symArr);
}
calculator.result = 0;
calculator.calculate = function () {
result = this.numArr[0];
for (var j = 0; j < this.numArr.length - 1; j++) {
if (this.symArr[j] === "+") {
result = Number(result) + Number(this.numArr[j + 1]);
}
if (this.symArr[j] === "-") {
result = Number(result) - Number(this.numArr[j + 1]);
}
if (this.symArr[j] === "*") {
result = Number(result) * Number(this.numArr[j + 1]);
}
if (this.symArr[j] === "/") {
result = Number(result) / Number(this.numArr[j + 1]);
}
}
console.log(j, result);
return result;
}
output.out = document.getElementById("result"); // div๊ฐ์ฒด
output.print = function () {
var result = calculator.calculate();
this.out.innerHTML = "๊ณ์ฐ๊ฒฐ๊ณผ : " + result;
}
</script>
</body>
</html>
ํด์ค
HTML ) p ์ div์ ์ฐจ์ด
p๋ paragraph์ ์ฝ์๋ก ๋ฌธ๋จ์ ๋๋ ๋ ์ฐ์ธ๋ค. - ์ฃผ๋ก ๋ฌธ์์ ๋ด์ฉ ๊ธฐ์ค.
div๋ division์ ์ฝ์๋ก ๋ฌธ์์ ์์ญ์ ๋๋ ๋ - ์ฃผ๋ก ๋ ผ๋ฆฌ์ ๋จ์ ๊ธฐ์ค.
์ฝ๋ฉ์ ํ๋ฉด์ ๋ถํ์ํ ๋ถ๋ถ์..
- ์ฃผ์์ฒ๋ฆฌํ๊ณ ๋์ค์ ์ง์ฐ๊ธฐ๋ณด๋ค๋, ๊ทธ๋๊ทธ๋ ์ง์ฐ๋ ๊ฒ ์ข๋ค.
- ์ด์ฐจํผ ์ปค๋ฐ๋ง ํ๋ค๋ฉด ๋ณต๊ตฌํ ์ ์๊ณ , ์ง์ฐ์ง ์๊ณ ๋จ๊ฒจ๋์ ์ฝ๋๊ฐ ์๋ก ์ง ์ฝ๋์ ์ถฉ๋์ ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ.
์๋ฐ์คํฌ๋ฆฝํธ eval();
: ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ด์ฅํจ์๋ก, ๋ฌธ์์ด์ ์ฝ๋๋ก ์ธ์ํ๊ฒ ํ๋ ํจ์์ด๋ค.
eval( string );
์๋ฅผ ๋ค์ด.. eval("2+2"); -> "2+2"๊ฐ ๋ฌธ์์ด์์๋ ์ฝ๋๋ก ์ธ์ํด 4๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
์ฐ๋ฆฌ๋ ๋ฐฐ์ฐ๋ ๋จ๊ณ๋๊น ์ด ํจ์๋ ์ฐ์ง ์๋๋ก ํ๋ค!
์ฐธ๊ณ : www.codingfactory.net/11024
๐ํด์ค์์๋ .push(), .pop() (๋งจ ๋ค์ ๋ฃ๊ธฐ / ๋นผ๊ธฐ) ๋ฐ .unshift(), shift() (๋งจ ์์ ๋ฃ๊ธฐ / ๋นผ๊ธฐ) ๋ฅผ ํ์ฉํ๋ค.
: input๊ฐ์ .split(" "); ์ผ๋ก ๋ฐฐ์ด๋ก ๋ง๋ ๋ค,
.shift() ๋ฅผ ํตํด ๋ฐฐ์ด์ ๋งจ ์์์๋ถํฐ ๊ฐ์ ํ๋์ฉ ๋นผ์ ์ฐ์ฐํจ.
.shift()๋ฅผ ํ๋ฉด ๋ฐฐ์ด ์์ ๊ฐ์ ํ๋์ฉ ๋ฝ์ ์ฐ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ํ๋์ฉ ์ค์ด๋ค๊ณ ,
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ ํ์๋, ๋ฐฐ์ด ์ด๊ธฐํํ ํ์๋ ์์.
-> ์ด ๋ฐฉ์์ด ์ฝ๋์ ๊ธธ์ด๋ ์ค์ด๊ณ , ๋ณต์กํจ๋ ๋ํด์ ๋ ๋์ ๊ฒ ๊ฐ๋ค.
NaN์ด๋?
Not a Number์ ์ฝ์๋ก, ์ซ์๊ฐ ์๋๋ผ๋ ๋ป.
NaN์ ์ฐ์ฐ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์๋ฅผ ๋ค์ด 10 * "a" ๋ฅผ ์ฐ์ฐํ๋ฉด ๊ฒฐ๊ณผ๋ก NaN์ด ๋์จ๋ค.
โป ์์
์ ๋ค์ผ๋ฉด์ ๋๊ฐ์ด ๋ฐ๋ผ ์ณค๋๋ฐ, ์ด์ํ๊ฒ ๋์์ด ์ ๋๋ค. ์ฝ์์ฐฝ์กฐ์ฐจ ์ ๋ ์ ๋๋ฒ๊น
๋ ๋ชป ํ๊ฒ ๋ค. ์ ๊ทธ๋ด๊น?ใ
ใ
๋ฌดํ๋ฃจํ ํจ์์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ๊ธด ํ๋ฐ
ํธ๋
์ค๋์ ์๋ณธ ์ ๋ต์ฝ๋๋ ์ฌ๊ธฐ์..
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>๋ฌธ์์ด ๊ณ์ฐ๊ธฐ ๊ตฌํํ๊ธฐ</h1>
<div>
<input type="text" id="input">
<button onclick="calc()">ํ์ธ</button>
</div>
<div id="output">์ฌ๊ธฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ค์ด๊ฐ๋๋ค.</div>
<script>
var input = {};
input.init = function (str) {
this.list = str.split(" ");
}; // str์ ๋ฃ์ผ๋ฉด ์ชผ๊ฐ์ ์ ์ฅ?
input.empty = function(){
return this.list.legnth === 0;
};
input.getValue = function () {
var str = this.list.shift();
var n = Number(str);
return n;
}; // getFirst, getSecond๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ getValue๋ก ํตํฉ.
input.getOperator = function () {
var op = this.list.shift();
if (op === "+" || op === "-" || op === "*" || op === "/") {
return op;
} else { // ์ฌ์น์ฐ์ฐ ์ธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด..
return "$";
}
};
var calculator = {};
calculator.calculate = function (first, second, op) {
var ret;
switch (op) {
case "+":
ret = first + second;
break;
case "-":
ret = first - second;
break;
case "*":
ret = first * second;
break;
case "/":
ret = first / second;
break;
default :// ์ฌ์น์ฐ์ฐ ๊ธฐํธ ์ธ์ ๊ฐ์ ๋ฃ์ผ๋ฉด ๊ณ์ฐํ์ง ์๊ธฐ.
return NaN;
}
return ret;
};
var output = {};
output.out = document.getElementById("output"); // div๊ฐ์ฒด
output.print = function (value) {
this.out.innerHTML = "์ต์ข
๊ฒฐ๊ณผ๊ฐ์ " + value + "์
๋๋ค.";
};
function calc() {
var str = document.getElementById("input").value;
input.init(str);
var result = input.getValue();
while (!input.empty()) { // input.empty๊ฐ ๋น์ด์์ง ์์ผ๋ฉด.
var op = input.getOperator();
var second = input.getValue();
result = calculator.calculate(result, second, op);
}
output.print(result);
}
</script>
</body>
</html>
input.init = function(str) { // ๋ฐฐ์ด ์ด๊ธฐํ : input.list์ str์ split(" ")ํ ๋ฐฐ์ด์ ๋ฃ๋๋ค.
this.list = str.split(" ");
};
์ด๋ ๊ฒ ๋ฉ์๋์ ์์ฑ(๋ฐฐ์ด)์ ๋์์ ์ ์ํด๋ ์ ๋๋๊ตฌ๋..
input.empty = function() {
return this.list.length == 0;
};
//
function calc() {
var str = document.getElementById('input').value;
input.init(str);
var result = input.getValue();
while (!input.empty()) {
var op = input.getOperator();
var second = input.getValue();
result = calculator.calculate(result, second, op);
}
output.print(result);
}
input.empty๋ผ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ๋ฆฌํด๊ฐ์ผ๋ก input.list.length == 0;์ ๋ฃ์๋ค.
๊ทธ๋์ ์๋ calc()๋ด์ while๋ฌธ์์๋ input.empty()๊ฐ ์๋ ๋(!)
์ฆ input.list.length๊ฐ 0์ด ์๋ ๋ ๋ก while ์กฐ๊ฑด๋ฌธ์ ์ฃผ์๋ค.
!input.empty(); -> true(input.list์ ์์๊ฐ ์์ ๋) -> while๋ฌธ ๋ฌดํ๋ฃจํ
!input.empty(); -> false(input.list์ ์์๊ฐ ์์ ๋) -> while๋ฌธ ํ์ถ
** GUI๊ณ์ฐ๊ธฐ ๊ตฌํํ๊ธฐ -> ๋ค์ ๊ฐ์๋ด์ฉ์ ๋ฃ๋ ๊ฒ ์ง๊ธ์ ๋ ์ค์ํ ๊ฒ ๊ฐ์์ ์ฐ์ ์คํตํ๊ธฐ๋ก! **