[js] 자바 스크립트 기본 문법(변수/ 자료형/연산자/조건문/반복문)
변수
- 변수란 프로그램을 실행하는 동안 값이 여러 번 달라질수있는 데이터
- 상수란 값을 한번 지정하면 바뀌지 않는 데이터
변수 선언 규칙
1. 변수 이름의 첫글자는 영어 대소문자, 언더바만 쓸 수 있다.
2. 영어 대소문자를 구별하며, 예약어는 변수이름으로 쓸 수 없다.
3. 여러 단어를 연결한 변수이름은 중간에 대문자를 섞어 쓴다. (camel case)
4. 변수 이름은 의미있게 작성해야함
변수 선언과 값 할당
var 예약어이용
var 변수명;
var 변수명, 변수명, 변수명;
var birthYear;
birthYear = 1995;
var currentYear = 2021;
나이 계산 프로그램 만들기
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>나이 계산하기</title>
</head>
<body>
<script>
var currentYear = 2023;
var birthYear;
var age;
birthYear = prompt("태어난 연도를 입력하세요. (YYYY)","")
age = currentYear - birthYear +1;
document.write(currentYear + "년 현재<br>");
document.write(birthYear + "년에 태어난 사람의 나이는 "+age+"세입니다.");
</script>
</body>
</html>
자바 스크립트의 데이터 유형 자동 변환
자바스크립트는 데이터 유형이 유연하게 바뀐다.
프롬프트 창에서 태어난 해를 입력받는 예제에서 입력받은 값은 문자열이었지만 사칙연산에 사용된 문자열을 자동으로 숫자형으로 변환되었다.
자료형
기본유형
- 숫자형(number) : 정수 와 실수를 모두 묶어 number라고 한다, 따옴표 없이 숫자로만 표기ex) 2000
- 문자열 : 작은따옴표(문자)나 큰따옴표(문자열)로 묶어서 나타냄, 만약 큰따옴표 안에 또 다른 문자열을 넣어야하는경우 " ' ' " 이런식으로 표기한다.
- 논리형 : 소문자로만 표시 ex)true, false
복합 유형
- 배열 : 하나의 변수에 여러개 값 저장 ex) var seasons= ["봄","여름","가을",'겨울']
- 객체 : 함수와 속성을 함께 표현한다. ex) var date = new Date();
특수 유형
- undefined :자료형이 지정되지않은 상태, 변수선언만하고 값이 할당되지 않은상태
- null : 값이 유효하지 않을떄 상태, 변수에 할당된 값이 유효하지 않은 상태
연산자
+ ,- ,* , / ,%, ++, --
여기서 증감연산자는 어디에 붙냐에 따라 결과가 다른데
var a= 10;
//뒤에붙는경우 -> 연산식을 먼저 실행한 후 a를 1 증가시킨다.
var b = a++ + 5; // b=15 a=11
//앞에붙는경우 -> 1을 증가시킨 후 연산식을 실행한다.
var c = ++a + 5; // c= 16 a=11
할당 연산자(= 대입 연산자)
오른쪽의 실행결과를 왼쪽 변수에 할당한다.
= , +=, -=, *=, /=, %=
연결 연산자
둘 이상의 문자를 합쳐서 하나의 문자열로 만든다.
+ 기호를 사용한다.
비교 연산자
== 피연산자가 서로 같으면 true , 피연산자의 자료형을 자동으로 변환해서 비교한다.
=== 피연산자도 같고 자료형도 같으면 true , 피연산자의 자료형을 변환하지 않는다.
!= 피연산자가 서로 다르면 ture
!== 피연산자가 서로 같지 않거나, 자료형이 같지 않으면 true
< , <=, >, >= 크기 대소비교후 true, false
문자열의 비교
비교 연산자는 숫자뿐만 아니라 문자열도 서로 비교할수있는데, 피연산자가 문자열이라면 문자열에 있는 문자들의 아스키값을 비교해서 결정한다. 문자열에서 비교할 문자가 여러개인 경우는 맨 앞 문자부터 하나씩 비교한다.
논리 연산자
||(or), &&(and), !(not)
조건문
if~else문
if(조건) {
조건 결괏값이 true일때 실행
} else{
조건 결괏값이 false일떄 실행
}
<script>
var userNumber = prompt("숫자를 입력하세요.");
if(userNumber %3 === 0){
alert("3의 배수입니다.");
}
else{
aleart("3의 배수가아닙니다.")
}
</script>
중첩된 if~else 문
위 예제는 사용자가 값을 입력하지 않고 [취소]를 누르는 동작도 고려해야한다. [확인] 버튼을 눌렀을때만 3의 배수를 체크하게 구현해야함
프롬프터에서 [취소]를 누르면 변수에는 null이 저장된다.
<script>
var userNumber = prompt("숫자를 입력하세요.");
if(userNumber !== null){
if(userNumber %3 === 0){
alert("3의 배수입니다.");
}
else{
alert("3의 배수가아닙니다.")
}
}
else{
alert("입력이 취소되었습니다.");
}
</script>
else if문
if() {
}
else if() {
}else{
}
조건 연산자
만약 조건이나 하나이고, true일떄와 false일때 실행할 명령어가 각각 하나뿐이라면 조건 연산자를 이용한다.
(조건) ? true일떄 실행 : false일때 실행
<script>
var userNumber = prompt("숫자를 입력하세요.");
if(userNumber !== null){
userNumber % 3 === 0 ? alert("3의배수입니다") : alert("3의배수가아닙니다");
}else{
alert("입력 취소");
}
</script>
논리 연산자
조건을 2개 이상 체크할때는 논리연산자(|| , &&, !)를 사용해 조건식을 만든다.
<script>
var numberOne = prompt("50미만인 숫자를 입력하세요");
var numberTwo = prompt("50미만인 숫자를 입력하세요");
if(numberOne < 10 || numberTwo <10)
alert("숫자 2개 중 최소 하나는 10 미만입니다");
else{
alert("숫자 2개 중 10 미만인 수가 없습니다.")
}
</script>
단축평가
조건계산을할떄 or연산자일경우 true가 될 확률이 높은 식을 첫번째 조건식으로 배치하고, and연산자일경우 false가 될 확률이 높은 식을 첫번째 조건식으로 배치한다.
switch문
- 처리할 명령이 많은경우 if~else문보다는 switch문을 사용하는게 좋다.
- switch의 조건이 값1과 일치하면 명령1을 실행하고 다음에 만나는 break문을 만나 switch문을 빠져나가는 구조이다. 조건과 일치하는 case문이 없으면 마지막으로 default문을 실행하고 switch문이 종료된다.
- case문에서는 값만 사용가능하고 식은 사용할수없다.
switch(조건)
{
case 값1: 명령1
break
case 값2: 명령2
break
...
default: 명령n
}
자리 배치도 알고리즘
parseInt() : 결과값을 정수로 변환해 주는 함수
전체입장객수/한줄에 앉을 사람수 에서 나머지값이 없으면 남는 자리가 없으므로 그 해당 결과값을 반환하면 되지만 나머지가 발생하면 한줄을 더 추가해야한다.
<script>
var memNum = parseInt(prompt("입장객은 몇명인가요?"));
var colNum = parseInt(prompt("한줄에 몇명씩 앉나요?"));
//prompt()문은 문자열을 받으므로,,paseInt를 통해 숫자로 바꿔놔야 오류를 사전에 방지할수있다.
if(memNum % colNum === 0){
rowNum = memNum/colNum;
}
else
rowNum = ( memNum / colNum )+1;
document.write("모두 "+rowNum+"개의 줄이 필요합니다.")
</script>
반복문
for문
반복 크기가 일정할경우에 사용한다.
초깃값 -> 조건 -> 명령 -> 증가식 순서
for(초깃값; 조건; 증가식){
명령
}
<script>
var i;
var sum=0;
for(i=1;i<1001;i++){
sum += i;
}
document.write(sum);
</script>
중첩 for 문
안쪽 for문을 모두 실행한 후 바깥쪽 for문을 실행한다.
<script>
var i, j;
for(i=1;i<10;i++){
document.write("<h3>"+i+"단</h3>");
for(j=1;j<10;j++){
document.write(i+"x"+j+"="+i*j+"<br>");
}
}
</script>
구구단에 스타일시트 적용하기
구구단 소스 앞뒤로 스타일 추가한 <div> </div>태그를 추가한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>나이 계산하기</title>
<style>
div{
display: inline-block; /*가로로 배치하겠음*/
padding: 0 20px 30px 20px;
margin: 15px;
border: 1px solid #ccc;
line-height: 2; /* 줄간격 2.0 */
}
</style>
</head>
<body>
<script>
var i, j;
for(i=1;i<10;i++){
document.write("<div>")
document.write("<h3>"+i+"단</h3>");
for(j=1;j<10;j++){
document.write(i+"x"+j+"="+i*j+"<br>");
}
document.write("</div>");
}
</script>
</body>
</html>
while문과 do~while문
조건만 주어졌을때 많이 사용한다.
while문 - 조건이 true인 동안 명령을 반복한다.
while(조건){
명령
}
do~while문 - 일단 명령을 한번실행한 후 while문에서 조건을 체크한다, 그러므로 조건이 false여도 일단 명령은 최소한 한번실행된다.
if문과 while문을 적절히 활용하여 팩토리얼을 구하는 예제이다.
<script>
var n = prompt("숫자를 입력하세요.");
var msg = ""; //빈문자열
if(n !== null){ //취소를 누르지않았다면
var nFact =1;
var i =1;
while(i<=n){
nFact *= i;
i++
}
msg = n+ "!= " + nFact;
}else
msg = "값을입력하지않았음."
document.write(msg);
</script>
break, continue
break : 반복문이 종료조건이 되기 전에 반복문을 빠져나가야하는 경우 사용한다.
continue : 주어진 조건에 해당하는 값을 만나면 해당 반복문을 건너뛴다. 그리고 반복문의 맨앞으로 되돌아가 다음과정으로 넘어가도록한다.
1부터 10까지 중 짝수만 더하는 예제 - continue 사용
<script>
var i;
var n = 10;
var sum = 0;
for(i=1;i<=n;i++){
if(i % 2 === 1){
continue
}
sum += i;
}
document.write(sum);
</script>
위에 했던 자리배치 알고리즘을 통해 실제로 자리배치표를 만들어봅시다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>나이 계산하기</title>
<style>
table, td{
border: 1px solid #ccc;
border-collapse: collapse;
}
td{
padding:5px;
font-size: 0.9em;
}
</style>
</head>
<body>
<script>
var i, j;
var memNum = parseInt(prompt("입장객은 몇명인가요?"));
var colNum = parseInt(prompt("한줄에 몇명이 앉습니까?"));
if(memNum % colNum ===0) //입장객 $ 한줄앉는수 = 0 이면 rowNum은 딱맞게 앉은것
rowNum = memNum/colNum;
else
rowNum = memNum/colNum +1; //0이 아니면 한줄을 추가해야됩니다.
document.write("<table>");
for (i=0; i<rowNum; i++){
document.write("<tr>");
for(j=1; j<= colNum; j++){ //자리 1 부터시작합니다.
seatNo = i*colNum + j;
if(seatNo > memNum) break; //반복문 정지조건으로, 입장객수를 넘어가면 종료한다.
document.write("<td>좌석 "+seatNo+" </td>");
}
document.write("<tr>");
}
docment.write("</table>");
</script>
</body>
</html>
마무리문제1
- prompt받을때 바로 parseInt로 정수로 바꿔버리면 ,[취소]를 누르는경우 null이 아닌 숫자로 바뀌므로 반복문에서 내가원하는 "값이입력되지않았습니다"가 아닌 "4의 배수가 아닙니다" 문이 출력된다.
- 그렇기때문에 처음부터 parseInt로 바꾸지 말고 num !== null 인 조건문 내부에서 parseInt로 바꿔준다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>나이 계산하기</title>
<style>
h1 , div{
text-align : center;
}
</style>
</head>
<body>
<h1>4의 배수일까 아닐까</h1>
<script>
var num = prompt("숫자를 입력하세요.");
document.write("<div>");
if(num !== null){
if (parseInt(num) % 2 === 0)
document.write(num+"는 4의 배수입니다.");
else
document.write(num+"는 4의 배수가 아닙니다.");
}
else
alert("값이 입력되지않았습니다.");
document.write("</div>");
</script>
</body>
</html>
마무리문제2
숫자를 입력받은 후 1부터 그 숫자까지 3의 배수를 모두 화면에 출력한다, 그리고 출력된 3의 배수가 총 몇개인지도 출력
[내가만든 코드]
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>나이 계산하기</title>
<style>
h1 , div{
text-align : center;
}
p{
color:red;
font-weight: bold;
}
</style>
</head>
<body>
<h1>3의 배수 찾기</h1>
<script>
var num = prompt("몇 까지 3의 배수를 찾을까요?");
document.write("<div>")
if(num !== null){
i=1;
count =0;
for(i;i*3<num;i++){
count++;
document.write(i*3+", ");
}
document.write("<br>")
document.write("<p>"+num+"까지 3의 배수의 개수 : "+count+"</p>");
}
else
alert("값을 입력하거라");
document.write("</div>")
</script>
</body>
</html>
[해답 코드]
다른점
1. 교재에선 스타일을 body태그로 주어 전체 적용을 수월하게 하였다. 나는 div태그로 세세하게 했음
2. 내가짠 코드는 3의 배수인 경우만 사용가능한데, 교재답안은 i %3 ===0 을 이용하여 꼭 3의배수가 아니더라도 다른 배수여도 쉽게 수정이 가능하므로 훨씬 사용하기 좋은 코드인것같다.
3. document.write문 내부에 HTML코드를 삽입하여 코드를 더욱 간결하게만들었다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>연습문제 2</title>
<style>
body {
font-size:1.2em;
text-align:center;
}
p {
color:#f00;
font-weight: bold;
}
</style>
</head>
<body>
<h2>3의 배수 찾기</h2>
<script>
var i;
var userNumber = parseInt(prompt("몇 까지 3의 배수를 찾을까요?", "100"));
var count = 0;
if (userNumber !== null) {
for (i = 1; i <= userNumber; i++) {
if (i % 3 === 0) {
count++;
document.write(i + ", ");
}
}
document.write("<p>" + userNumber + "까지 3의 배수의 갯수 : " + count + "</p>");
}
</script>
</body>
</html>
참고 서적 http://easyspub.co.kr/20_Menu/BookView/PUB/421/PUB