<body>
<script>
document.write("hi")
</script>
</body>
HTML은 위에서 아래로 코드를 읽기 때문에 body 태그 끝나는 지점에 script 태그 사이에 넣어서 작성한다.
<body>
<script src="main.js"></script>
</body>
Js파일을 생성 후 src를 이용하여 HTML과 Js파일을 연결해준다.
<body>
<script>
document.write("hi");document.write("nice");document.write("good");
// 아래는 주석입니다.
// document.write("hi");document.write("nice");document.write("good");
/* document.write("hi");document.write("nice");document.write("good");
document.write("hi");document.write("nice");document.write("good");
*/
</script>
</body>
세미콜론은 Js 코드를 구분해주는 역할을한다. 가독성을 높이기 위해 보통은 줄바꿈으로 코드를 구분하지만 한줄에 코드가 적혀있을 때는 세미콜론으로 구분해줘야한다.
단일줄 주석처리는 //로 가능하다. 주석은 코드를 동작시키고 싶지 않을 때 사용하거나 코드설명을 적을 때, 사용한다.
/* */ 안에 코드를 넣으면 구간 주석도 가능하다.
변수란, 이름표가 붙은 데이터 상자이다.
var name = "kim"; // 문자형
var num = 10; // 숫자형 (정수: int, 실수: float)
var girlfriend = true; //bool형
document.write(typeof name) // typeof를 사용하면 데이터의 형을 확인 할 수 있다.
최신문법 ES6에서는 var 대신에 let,const를 사용하기도 한다.
변수에 대해 자세히 들어가면 어려워지니 이번 글에서는 이정도만 있다고 알고 가자.
중복된 숫자 없이 무작위로 6개의 번호를 뽑아주는 로또번호 추첨기를 만들어보자.
프로젝트를 할 때, 한꺼번에 하려하지 말고 1개부터 뽑아보는 방향으로 시작하는 것이 좋은 선택이다.
Math.random(); // 0이상 1미만의 실수(float)를 무작위로 1개 return 한다.
Math.random() * 45 + 1 // 사칙연산을 사용하여 1부터 45까지의 숫자가 나오도록 한다.
parseInt(); // ()안을 정수로 변환해주는 기능
// 1부터 45의 정수를 무작위로 1개 return 한다.
parseInt(Math.random() * 45 + 1);
로또 번호는 총 6개, 그렇다면 번호 6개를 뽑기 위해서 이렇게 단순 반복 6개를 해줘야하나?
var ball1 = parseInt(Math.random() * 45 + 1);
var ball2 = parseInt(Math.random() * 45 + 1);
var ball3 = parseInt(Math.random() * 45 + 1);
var ball4 = parseInt(Math.random() * 45 + 1);
var ball5 = parseInt(Math.random() * 45 + 1);
var ball6 = parseInt(Math.random() * 45 + 1);
그렇지 않다. 배열을 사용하여 하나의 변수 안에 여러개의 데이터를 관리 할 수 있다.
우리는 배열에 데이터를 넣는 방법을 배워보자.
var lotto = [];
var num = Math.random() * 45 + 1;
var ball = parseInt(num);
lotto.push(ball); // 배열 맨뒤에 값을 추가
document.write(lotto) // 출력
// i = 0 일 때 시작하고 반복문 속 코드를 1회 실행하면 i에 1을 더해서 반복문을 실행하고 i가 6이 되었을 때, 조건을 만족하지 않으니 중단한다.
for (var i = 0; i < 6; i++) {
lotto.push(parseInt(Math.random() * 45 + 1));
};
document.write(lotto);
하지만 위의 방식으로 로또 번호를 뽑는다면 중복된 번호가 나올 수도 있다.
// 조건을 만족하지 않을 때 까지 아래 코드를 반복한다.
while (lotto.length < 6) {
lotto.push(parseInt(Math.random() * 45 + 1));
}
.length는 배열의 길이를 알려준다. 위 코드는 배열의 길이가 6개가 되면 기능을 멈춘다.
반복문이 다 돌고 나온 결과를 보니 중복값도 그대로 출력되었다면 조건문을 사용하여 중복값은 배열에 추가 하지 않도록 해줄 수 있다.
var num = Math.random() * 45 + 1;
// if (조건) {조건이 참일 때 실행할 코드}
if (lotto.indexOf(num) == -1) { // 즉 lotto 배열안에 num 숫자가 없으면~ 아래코드 실행해주세요
lotto.push(num); // 배열 맨 뒤에 num 값을 추가해주세요
}
.indexOf()는 괄호 안에 숫자가 존재하면(true) return 숫자의 index(위치), 존재하지않으면(false) return -1
반복문과 조건문을 끝낸 로또 번호를 오름차순으로 정렬하기 위해 .sort() 를 사용한다.
var ex = [1,2,3,33,22,11]
document.write(ex.sort())
// result
[1,11,2,22,3,33]
.sort()는 사전순으로 정렬이 된다.
따라서 오름차순으로 정렬하기 위해서는 특정 조건을 추가해줘야한다.
.sort((a,b) => a-b) // 다음 조건을 넣어줘야 오름차순이 작동한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>로또 번호 추첨기</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>로또 번호 추첨기</h1>
<script>
var lotto = [];
while (lotto.length < 6) {
var num = parseInt(Math.random() * 45 + 1);
if (lotto.indexOf(num) == -1) {
lotto.push(num);
}
}
lotto.sort((a,b)=>a-b);
document.write(lotto);
</script>
</body>
</html>
HTML/CSS을 이용하여 각자 로또 번호를 디자인 해볼 수 있다.
var lotto = [];
var num = parseInt(Math.random() * 45 + 1);
while (lotto.length < 6) {
if (lotto.indexOf(num) == -1) {
lotto.push(num);
}
}
lotto.sort((a,b)=>a-b);
document.write(lotto);
위와 같이 num 변수가 반복문 바깥에 있으면 어떻게 될까?
num 변수에 Math.random()이 로또 번호를 할당하고 있다.
while 밖에 num 변수가 있으면 num변수에 할당을 반복하지 않고 한번만 해준다.
만약 번호가 30이 나왔다고 치면, 랜덤 번호 생성은 1회로 끝나고 배열에 30이라는 숫자가 있는지 확인하는 조건문만 반복해서 작동한다.
근데 배열에 30이라는 번호가 있으니 배열에 더 이상 중복 숫자는 추가는 못하고 그래서 while 조건인 배열의 길이가 6이 넘지 못하여 무한 반복된다.
이번 프로젝트에서는 화면을 구성하는 모든 것들에 접근이 가능한 DOM을 다뤄보도록 한다.
DOM에 접근하기 위해서
document.getElementById('id')를 사용할 것이다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>자소서 글자수 계산기</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<style>
h1 {
margin-top: 30px;
}
#count {
float: right;
}
</style>
</head>
<body class='container'>
<h1>자기소개</h1>
<textarea class="form-control" rows="3" id="jasoseol">안녕하세요 김이주입니다.</textarea>
<span id="count">(0/200)</span>
<script>
</script>
</body>
</html>
다음과 같은 html 문서에서 textarea 태그 안의 입력값을 가져오기 위해서 아래 코드를 사용한다.
// 아이디가 자소설이라는 것의 입력값을 가져온다.
var content = document.getElementById(‘jasoseol’).value;
// console창에 출력
console.log(content);
var content = document.getElementById(‘jasoseol’).value;
// 콘솔창에 입력값 길이 출력
console.log(content.length);
// 위에 HTML 문서에서 span 태그의 id 'count'를 가져와서 그 안에 내용물(innerHTML)을 오른쪽 걸로 바꿔주세요~
document.getElementById(‘count’).innerHTML = ‘(’+content.length+”/200)”
"",''를 이용하여 문자열을 붙여서 작성할 수 있다.
// 지금까지 만든 긴 코드를 함수에 넣어 축약
function count() {
var content = document.getElementById('jasoseol').value;
document.getElementById('count').innerHTML = '(' + content.length + '/200)';
};
// 함수 사용 방법
count();
글자를 입력했을 때 이벤트 = onkeydown
이벤트 핸들링 = count() 함수
<textarea 이벤트=이벤트핸들링></textarea>
<script>
function count() {
var content = document.getElementById('jasoseol').value;
document.getElementById('count').innerHTML = '(' + content.length + '/200)';
};
</script>
if 조건문을 사용하여 일정 글자수가 넘으면 넘어가는 입력값을 자르자.
substring() 기능을 사용하여 구현한다.
글자수를 200글자고 제한하고 싶다면 아래와 같이 코드를 작성하면된다.
if (content.length > 200) { // 만약 글자길이가 200보다 크면
content = content.substring(0,200); // content를 200글자까지 보여주고 나머지는 잘라주세요~
document.getElementById('jasoseol').value = content; // 200글자만 보여준 값을 다시 id='jasoseol'의 입력값으로 넣어주세요~
}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>자소서 글자수 계산기</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<style>
h1 {
margin-top: 30px;
}
#count {
float: right;
}
</style>
</head>
<body class='container'>
<h1>자기소개</h1>
<textarea onkeydown = count() class="form-control" rows="3" id="jasoseol">안녕하세요 김이주입니다.</textarea>
<span id="count">(0/200)</span>
<script>
function count() {
var content = document.getElementById("jasoseol").value;
if (content.length > 100) {
content = content.substring(0,100);
document.getElementById('jasoseol').value = content;
}
document.getElementById('count').innerHTML = "("+content.length+"/100)"
};
count();
</script>
</body>
</html>
그냥 같다고 생각하자.
왼쪽에 보라색 드론을 클릭하면 드론이 침을 뱉어 오른쪽 파란색 벙커를 공격하고 HP가 1씩 감소하여 HP가 0이 되면 벙커는 사라진다.
본격적인 프로젝트에 들어가기에 앞서 새로운 개념 jQuery 라이브러리에 대해 알고 넘어가자.
jQuery는 기존의 Js코드가 너무 길어서 사용하기 힘든 것을 보완하여 나온 라이브러리이다.
code.jquery.com에 접속하여 최신 버전 minified 파일을 클릭하여 나온 코드를 복사하여 body 태그 끝나는 지점에 붙여넣는다.
우리가 js 코드를 작성할 때는 jQuery CDN 붙여넣은 곳 아래에 작성해야지 잘 작동한다.
이전에 배웠던 Js 이벤트와 이벤트 핸들링에서는 선택자의 태그 안에 이벤트 = 이벤트 핸들링을 해줘야하는데 jQuery는 필요없다.
우리가 함수를 쓰는 이유는 자주 사용하는 코드가 너무 길어 함수로 축약해서 사용하는 것인데, 원할 때 마다 한번 씩 사용하고 싶은데 그 때마다 함수를 만들면 번거로우니 그럴 땐, 익명함수를 사용한다.
익명함수: 한번만 사용할 함수
function(){
console.log(‘hi’)
}
우선 침은 미리 보여지면 안되니 #spit의 css 속성에 display: none;을 해주었다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>스타크래프트</title>
<style>
.background {
position: relative;
background-image: url('background.png');
background-size: 500px 330px;
width: 500px;
height: 330px;
}
#drone {
position: absolute;
width: 100px;
height: 100px;
top: 100px;
left: 60px;
}
#bunker {
position: absolute;
width: 150px;
height: 150px;
top: 80px;
right: 20px;
}
#spit {
display: none;
position: absolute;
top: 140px;
left: 150px;
width: 50px;
height: 30px;
z-index: 2;
}
</style>
</head>
<body>
<h1 id='hp'>HP: 3</h1>
<div class='background'>
<img id='drone' src="drone.png" alt="drone">
<img id='spit' src="spit.png" alt="spit">
<img id='bunker' src="bunker.png" alt="bunker">
</div>
<script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous">
</script>
<script>
여기에 우리 js 코드 작성!!
// #drone에 클릭 이벤트 생성
$('#drone').click(function(){
console.log('침 발사');
});
</script>
</body>
</html>
어떻게 나타나게 하는지 모르겠다면 무조건 구글링이 답이다. jQuery 홈페이지 "API Documentation"에 가서 검색해보면 함수의 사용 방법이 나와있고 사용 예제도 나와있어 도움이 된다.
우리는 .fadeIn() 기능을 이용할 것이다.
.fadeIn([duratioin],[complete]) []안에 있는 것들은 생략가능
$('#drone').click(function(){
$('#spit').fadeIn();
});
이번에는 침 발사를 위해 이동하는 기능을 구현할 수 있는 .animate() 기능을 사용하였다.
발사된 후 사라지게 하는 기능은 .fadeOut()
다시 사라진 침 다시 원위치 시키는 기능은 .css를 사용하였다.
.animate(css 속성,[duration],[easing],[complete]) css 속성 넣을 때, {}사이에 넣어야한다.
$('#drone').click(function(){
$('#spit').fadeIn();
$('#spit').animate({left:'+=250px'}); // animate({css속성: " 숫자여도 따옴표 안에 들어가야한다. "}) 서서히 움직이게 해준다.
$('#spit').fadeOut(); // 침 사라진다.
$('#spit').css({left: '150px'}); // 사라진 침이 원래 자리로 돌아온다.
});
var hp = 3;
$('#drone').click(function(){
$('#spit').fadeIn();
$('#spit').animate({left:'+=250px'});
$('#hp').text('HP: '+hp) // id=hp인 요소의 text를 ()안에 있는 것으로 바꿔주세요~
$('#spit').fadeOut();
$('#spit').css({left: '150px'});
});
근데 위와 같이 코드를 짜고 실행하면 fadeOut 동작이 끝나기 전에 hp가 먼저 깎여서 어정쩡하다.
fadeOut이 완료되고 hp를 깎이게 하고 싶으면 즉, 함수의 동작이 끝나고 다음 순서로 함수를 동작하게 하려면 콜백(call back)함수는 사용한다.
$('#spit').fadeOut(function(){ // fadeOut 종료되면 아래 코드 실행해주세요~
hp = hp - 1;
$('#hp').text('HP :' + hp);
});
위 와같이 fadeOut()안에 익명함수를 넣고 그 함수에 대한 코드로 HP 깎이는 코드를 작성하면 된다.
조건문 if를 사용하여 간단하게 할 수 있다.
if (hp == 0) {
$(“#bunker”).fadeOut();
}
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>스타크래프트</title>
<style>
.background {
position: relative;
background-image: url('background.png');
background-size: 500px 330px;
width: 500px;
height: 330px;
}
#drone {
position: absolute;
width: 100px;
height: 100px;
top: 100px;
left: 60px;
}
#bunker {
position: absolute;
width: 150px;
height: 150px;
top: 80px;
right: 20px;
}
#spit {
display: none;
position: absolute;
top: 140px;
left: 150px;
width: 50px;
height: 30px;
z-index: 2;
}
</style>
</head>
<body>
<h1 id='hp'>HP: 3</h1>
<div class='background'>
<img id='drone' src="drone.png" alt="drone">
<img id='spit' src="spit.png" alt="spit">
<img id='bunker' src="bunker.png" alt="bunker">
</div>
<script src="https://code.jquery.com/jquery-3.5.1.js"integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc="crossorigin="anonymous">
</script>
<script>
var hp = 3;
$('#drone').click(function(){
$('#spit').fadeIn();
$('#spit').animate({left:'+=250px'});
$('#spit').fadeOut(function(){
hp = hp - 1;
$('#hp').text('HP: '+hp);
if (hp == 0) {
$("#bunker").fadeOut();
}
});
$("#spit").css({left:'150px'});
});
</script>
</body>
</html>
기념일 계산기를 이용하여 연인과의 만난 날짜와 기념일 까지 며칠이 남았는지 계산을 해주는 프로그램을 만들어보자.
프로젝트에 들어가기 전 객체에 대해 짚고 넘어가자.
key와 value로 구성된 요소
value에는 문자,숫자 값 뿐만 아니라 배열, 객체, 함수까지 들어갈 수 있다. value에 들어간 함수는 "메서드"라고 부른다.
위 그림과 같이 객체의 이름.key 값을 이용하여 value값을 출력할 수 있다.
그런데 메서드를 불러 올 때는 모양이 앞서 배운 내용과 비슷한 구조를 띈다.
// Js의 모든 것은 객체이다.
content.length;
document.write();
console.log();
날짜를 계산하기 위해서 자바스크립트 내장 객체를 사용할 것이다.
//1. Date 객체 생성
var now = new Date(); // 오늘을 기준으로 date 객체를 생성하고 now 라는 변수에 저장
//2. 연도를 가져오는 메서드 .getFullYear()
console.log(now.getFullYear());
//3. 월 정보를 가져오는 메서드 .getMonth() 현재 달 보다 1 적게 나온다.
console.log(now.getMonth());
//4. 일 정보를 가져오는 메서드 .getDate()
console.log(now.getDate());
//5. 1970년 1월 1일 00:00:00을 기준으로 흐른 시간을 밀리초(ms)로 표시하는 메서드 .getTime()
console.log(now.getTime());
//6. 특정 일의 Date 객체 생성
var christmas = new Date('2020-12-25');
console.log(christmas);
//7. 특정 ms의 Date 객체 생성 ex) 1000일 언제야 우리?
var ms = new Date(1000);
console.log(ms);
이정도 기능을 익혀둔 체 우리 며칠 째? 인지 알아 보러 가자.
<body>
<h3 id='love'>0일째</h3>
<h4 class="date">2020.6.30</h4>
<script>
var now = new Date(); // 현재 date 객체 생성
var start = new Date('2020-06-30'); // 특정 일의 date 객체 생성
var timeDiff = now.getTime() - start.getTime(); // 두 기간의 밀리초 차, 만난 밀리초
var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1); // Math.floor()는 정수로 변환, +1을 더한 이유는 사귄날부터 0일이 아닌 1일로 생각하기때문이다.
$('#love').text(day + '일째'); // id=love인 요소의 text를 ()안에 있는 걸로 바꿔주세요~
</script>
</body>
var valentine = new Date('2023-02-14'); // 미래의 발렌타인 date 객체 생성
var timeDiff2 = valentine.getTime() - now.getTime(); // 발렌타인ms 와 현재ms 차
var day = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1); // ms를 일수로 변환
$('#valentine').text(day + '일 남음'); // id=valentine인 요소의 text 변경
1000일 ms 구하는게 조금 헷갈릴 수도 있다. 하지만 천천히 논리를 따져가며 생각해보자.
var ms = start.getTime() + 999 * (1000 * 60 * 60 * 24);
var thousand = new Date(ms);
thousand_date = thousand.getFullYear()+’.’+(thousand.getMonth()+1)+’.’+thousand.getDate(); // text 바꿔주기 위해 변수에 저장
$('#thousand-date').text(thousand_date);
var now = new Date();
var ms = start.getTime() + 999 * (1000 * 60 * 60 * 24);
var timeDiff3 = thousand.getTime() - now.getTime(); // ms == thousand.getTime() 같다.
var day3 = Math.floor(timeDiff3 / (1000 * 60 * 60 * 24) + 1);
$('#thousand').text(day3 + '일 남음');
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<title>기념일 계산기</title>
<style>
* {
color: #333333;
}
p {
margin-bottom: 1px;
}
.photos {
margin-top: 50px;
display: flex;
justify-content: center;
align-items: center;
}
#duhee {
width:150px;
height:150px;
object-fit:cover;
border-radius:50%;
margin-right: 30px;
}
#jisook {
width:150px;
height:150px;
object-fit:cover;
border-radius:50%;
margin-left: 30px;
}
#heart {
width:50px;
height:50px;
}
.gray {
color: #a0a0a0;
}
.special-day {
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
}
.days-left {
text-align: right;
}
.date {
text-align: right;
color: #a0a0a0;
}
</style>
</head>
<body class="container">
<section class='photos'>
<img id='duhee' src="duhee.jpeg" alt="duhee">
<img id='heart' src="heart.png" alt="heart">
<img id='jisook' src="jisook.jpeg" alt="jisook">
</section>
<div class='container d-flex flex-column justify-content-center align-items-center mt-3'>
<h3>두희♥지숙</h3>
<h3 id='love'>0일째</h3>
<h4 class="date">2020.6.30</h4>
</div>
<hr/>
<section class='special-day'>
<h3 class='title'>발렌타인 데이</h3>
<div class='date-box'>
<p id='valentine' class='days-left'>0일 남음</p>
<p class='date'>2021.2.14</p>
</div>
</section>
<hr/>
<section class='special-day'>
<h3 class='title'>1000일</h3>
<div class='date-box'>
<p id='thousand' class='days-left'>0일 남음</p>
<p id='thousand-date' class='date'>0000.00.00</p>
</div>
</section>
<hr/>
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha2569/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous">
</script>
<script>
var now = new Date();
var start = new Date('2020-05-17');
// 우리 몇 일째?
var timeDiff = now.getTime() - start.getTime();
var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
$('#love').text(day + '일째');
// 다음 발렌타인까지 남은 날짜는?
var valentine = new Date('2023-02-14');
var timeDiff2 = valentine.getTime() - now.getTime();
var day2 = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1);
$('#valentine').text(day2 + '일 남음');
// 1000일은 언제인가?
var thousand = new Date(start.getTime() + 999 * (1000 * 60 * 60 * 24));
var thousandDate = thousand.getFullYear() + '.' + (thousand.getMonth()+1) + '.' + thousand.getDate();
$('#thousand-date').text(thousandDate);
// 1000일까지 남은 날짜는?
var timeDiff3 = thousand.getTime() - now.getTime();
var day3 = Math.floor(timeDiff3 / (1000 * 60 * 60 * 24) + 1);
$('#thousand').text(day3 + '일 남음');
</script>
</body>
</html>
https://hackmd.io/@oW_dDxdsRoSpl0M64Tfg2g/ByfwpNJ-K
위 레퍼런스를 참고하여 깃헙에 가입해보자.
터미널에 아래 코드를 순서대로 적는다.
본인 Git hub 주소 확인하고 복붙하면 된다.
https://goddino.tistory.com/190
아래 레퍼런스를 참고하여 배포까지 마무리 해보자.
드디어 온라인 강의 5일차 한주가 지났다. 오늘 수업은 프로젝트 위주의 수업인데다 게임도 만들어봐서 재밌게 배우면서 들었던 것 같다. 이제 다음주 화요일부터 진짜 시작이다. 주말동안 마음을 다잡고 그동안 배웠던 것을 복습하는 시간을 가져봐야겠다.