일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- git 버전관리
- git
- html 끝
- 코딩테스트
- box-sizing: border-box
- 백준 정리
- calc()
- Pull
- button:focus cursor: pointer; outline: none;
- max-width
- 생활코딩 WEB2-JavaScript
- margin 0 auto
- 생활코딩
- 라매개발자
- WEB2-JavaScript
- 백준
- nav태그
- :root
- 백준 자바스크립트
- HTML
- li 태그
- 할만한데?
- 드림코딩
- 크롬웹
- 노마드 코더
- border radius
- 단계별로 풀어보기
- 나도코딩 파이썬
- error: ENOENT: no such file or directory
- 나도코딩
- Today
- Total
코딩응애의 개발블로그
생활코딩 WEB2-JavaScript ( 리팩토링(refactoring) ~ 함수의 활용) 본문
리팩토링 중복의 제거
코딩을 하고 나면 코드가 비효율적인 면들이 생기기 마련인데 여기서 동작하는건 그대로 두고 코드 자체는 효율적으로 만들어서 그 코드의 가독성을 높이고 중복코드를 줄이고 유지보수를 편리하게 하는 이러한 방향으로 코드를 개선하는 작업을 리팩토링이라고 한다.
<input id="night_day" type="button" value="night" onclick="
if(document.querySelector('#night_day').value === 'night'){
document.querySelector('body').style.backgroundColor = 'black';
document.querySelector('body').style.color = 'white';
document.querySelector('#night_day').value = 'day';
} else {
document.querySelector('body').style.backgroundColor = 'white';
document.querySelector('body').style.color = 'black';
document.querySelector('#night_day').value = 'night';
}
">
위에 코드를 보면 몇개 반복되는 문장들을 볼 수 있는데 이 코드를 리팩토링 하면 더 가독성을 높일 수 있다.
리팩토링 하기전 잠깐 this라는 개념에 대해 알아보면 위에 onclick과 같은 이벤트 안에서 실행되는 코드들은 즉 이 구간안에서는 이 코드들이 속해있는 태그 (즉 여기서는 input 태그를 의미함) 를 가리키도록 약속되어 있는 특수한 키워드가
있는데 바로 this 이다. 그리고 이 코드 document.querySelector('#night_day')가 onclick 이벤트가 속해있는 input 태그를 가리키는거나 다름이 없다. 따라서 이 코드는 this로 바꿔도 같은 역할을 하는것이다. 그리고 id값도 지워야함
(맞게 이해한건지는 모르겠는데 이거 이해하는데 엄청 오래걸림;)
다음으로 document.querySelector('body') 이 코드도 반복되는것을 볼 수 있는데 이거는 변수 하나 선언해서 하면된다
var target = document.querySelector('body');
그러면 저 반복되는 코드를 target으로 바꿔주어도 같은역할을 하는 것이다. 최종적으로 보면은 이렇게 된다.
<input type="button" value="night" onclick="
var target = document.querySelector('body');
if(this.value === 'night'){
target.style.backgroundColor = 'black';
target.style.color = 'white';
this.value = 'day';
} else {
target.style.backgroundColor = 'white';
target.style.color = 'black';
this.value = 'night';
}
">
배열
영어로는 array 라고 하고 ["ㅁ" , "ㅇ"] ; 콤마로 구분하고 이런 모양새다 ex) var hoho = ['java' , 'C'] ; 이런식으로 할 수 있다.
<script>
var coworkers = ["egoing", "leezche"];
</script>
<script>
document.write(coworkers[0]);
document.write(coworkers[1]);
</script>
<!-- 배열의 몇번째 있는거를 출력 -->
<script>
coworkers.push('duru');
coworkers.push('taeho');
</script>
<!-- push는 추가하는것 -->
<script>
document.write(coworkers.length);
</script>
<!-- 배열의 갯수 세는것 -->
위에 코드들 처럼 배열은 여러가지 명령들이 있는데 이를 처음부터 외우는것보다는 검색해서 그때마다 찾아서 쓰는것이 더 중요하다.
반복문
조건문과 함께 프로그램에 실행순서에 흐름을 제어하는 제어문이라고 할 수있다.
var n = 0;
while (n < 3) {
n++;
}
<!-- 예시 조건식을 정해서 얼마만큼 반복할건지 정하는게 중요하다 조건식이 true일때는 계속해서 반복하기
때문이다. -->
배열과 반복문
<script>
var coworkers = ['egoing','leezche','duru','taeho'];
</script>
<h2>Co workers</h2>
<ul>
<script>
var i = 0;
while(i < coworkers.length){
document.write('<li>'+coworkers[i]+'</li>');
i = i + 1;
}
</script>
</ul>
while () 안에 조건식을 i < 4 이런식이 아닌 coworkers.length를 이용해서 배열의 수가 늘어나도 조건식을 그때마다 바꿔주지 않아도 된다
배열과 반복문 활용
night day 버튼을 누를때마다 링크가 있는 글자색이 달라지는것을 해보자면 아래 코드를 이용할수 있다
var alist = document.querySelectorAll('a');
var i = 0;
while(i < alist.length){
alist[i].style.color = 'powderblue';
i = i + 1;
}
여기서 document.querySelectorAll('a'); 이 부분은 뭐냐면 a태그를 선택한다는 의미인데 기존에 querySelector를 사용하면 a태그 하나만 가져오기 때문에 querySelectorAll을 사용해야 한다. 콘솔 창에 입력하면 NodeList(4) [a, a, a, a] 이렇게 모든 a 태그를 배열(완벽한 배열은 아님) 형태로 결과가 나와서 배열처럼 사용할수 있다 위에 코드는 글자 색을 powderblue 라는 색으로 변화시켜준다 이를 이용해서 완성된 코드를 보면
<input id="night_day" type="button" value="night" onclick="
var target = document.querySelector('body');
if(this.value === 'night'){
target.style.backgroundColor = 'black';
target.style.color = 'white';
this.value = 'day';
var alist = document.querySelectorAll('a');
var i = 0;
while(i < alist.length){
alist[i].style.color = 'powderblue';
i = i + 1;
}
} else {
target.style.backgroundColor = 'white';
target.style.color = 'black';
this.value = 'night';
var alist = document.querySelectorAll('a');
var i = 0;
while(i < alist.length){
alist[i].style.color = 'blue';
i = i + 1;
}
}
">
함수
영어로는 function 이라고 한다. 대표적인 구조?를 보면 이렇다
function myFunction() {
document.write(1+1); //반복되고 싶은 코드 붙여넣기
}
코딩을 하다보면 반복문을 쓸수 없는경우가 있는데 반복되는 코드가 연속적이지 않게 반복된다면 반복문을 쓰기 힘들거나 못쓴다. 이때 바로 함수를 이용하는것이다. 저렇게 함수를 만들고 나서 사용하려면 함수이름(); 이렇게 해주면 된다
함수: 매개변수와 인자
함수는 입력과 출력으로 이루어져 있는데 입력은 매개변수(parameter) & 인자(argument) 로 이루어져 있다
함수로 위에 코드처럼 결과를 표출하는데 만약 입력값에 따라서 다른 결과를 출력할 수있는 함수를 만들 수있다면?
function sum(left, right){ // 괄호안에 left, right가 매개변수이고
document.write(left+right+'<br>');
}
sum(2,3); // 2,3 이 값들이 인자라고 한다 이 두가지는 함수로 들어오는 입력값과 관련이 있다
인자값에 따라서 결과가 위에 코드 처럼 5가 될수 있고 sum(3,4)라고 하면 7이 될 수도 있다.
함수(리턴)
출력은 return 이라고 한다. 어느때 쓰냐면 위에 sum 함수를 변화없이 그냥 저대로 쓴다면 문제가 없겠지만 저 함수를 예를들어서 빨간색으로 만들고 싶다거나 글씨를 크게 하고 싶다거나 하면 함수 자체를 새로 만들어야 된다 이렇게
function sumColorRed(left, right){
document.write('<div style="color:red">'+(left+right)+'</div><br>');
}
sumColorRed(2,3);
함수 이름도 바꿔 줘야 하고 새로 내용도 추가를 해줘야 한다. 지금은 1개라서 뭐 별로 안힘든데? 라고 할수 있겠지만 저 코드가 엄청 복잡하고 만들어야 할 개수가 1억개 라면 말이 달라진다 이를 해결하기 위해 나온게 바로 return 이다.
코드를 보면서 설명을 다시 해보자면
function sum2(left, right){
return left+right;
}
document.write(sum2(2,3)+'<br>');
document.write('<div style="color:red">'+sum2(2,3)+'</div>');
document.write('<div style="font-size:3rem;">'+sum2(2,3)+'</div>');
이렇게 return을 사용하면 원래의 함수 밖에서 함수의 값을 활용을 할 수가 있다. 이게 무슨 이야기냐면 위에 sum() 함수는 이미 무언가 실행해야할 결과값을 함수 안에다가 넣어놔서 이 값을 위에처럼 빨간색으로 하고 싶다던지 활용을 할려면 함수 자체를 바꿨어야 했는데 sum2() 함수는 실행한 결과가 sum()함수 처럼 무언가 실행한 결과가 아니라 sum2() 실행한 결과의 값을 돌려준다면? 굳이 새 함수를 만들지 않고 그냥 위에 코드처럼 해주면 된다. 즉 함수 갯수를 줄일 수있다.
함수의 활용
function nightDayHandler(self) {
var target = document.querySelector('body');
if(self.value === 'night') {
target.style.backgroundColor = 'black';
target.style.color = 'white';
self.value = 'day';
var alist = document.querySelectorAll('a');
var i = 0;
while( i < alist.length) {
alist[i].style.color = 'powderblue';
i++
}
}
else {
target.style.backgroundColor = 'white';
target.style.color = 'black';
self.value = 'night';
var alist = document.querySelectorAll('a');
var i = 0;
while( i < alist.length) {
alist[i].style.color = 'blue';
i++
}
}
}
onclick 내부의 있던 문장을 head 태그 안에 script 태그로 묶어서 nightDayHandler라는 함수로 만든 후에
<input type="button" value="night" onclick="
nightDayHandler(this);
">
이렇게 함수이름을 써줘도 전과 같은 기능을 해준다. 중간중간 this 랑 self 가 바뀌거나 했는데 이건 아직 이해하지 않아도 된다고 해서 나중에 객체 할때 배울려나?
22.06.26
저 this는 input을 가르키는 거라서 함수를 새로 만들어서 this.value 라고 해도 더이상 input을 가리키는 상태가 되는게 아닌거임 그래서 생각대로 동작이 안됨 .
앞서 배운 함수의 특징을 이용해서 저 새로 만든 함수를 nightDayHandler(self) 이런식으로 매개변수를 self라고 해주고
(매개변수 이름은 의미없음) 함수안에 this도 다 self로 바꾸어준다.
그리고 함수를 실행 시킬때 인자값을 nightDayHandler(this) 이런식으로 this로 해주어서
함수가 동작이 되면 self 안에 this가 들어가서 잘 동작이 되는것이다.
'JavaScript' 카테고리의 다른 글
노마드 코더 - 바닐라 JS로 크롬 앱 만들기(#2.5 ~ #2.10) (0) | 2022.02.09 |
---|---|
노마드 코더 - 바닐라 JS로 크롬 앱 만들기(#1 ~ #2.4) (0) | 2022.01.25 |
생활코딩 WEB2-JavaScript (객체 ~ 수업을 마치며) (for in문) (0) | 2021.12.24 |
생활코딩 WEB2-JavaScript (데이터타입 - 문자열과 숫자 ~ 조건문의 활용) (0) | 2021.12.20 |
생활코딩 WEB2-JavaScript ( 처음부터~HTML과 JavaScript의 만남 3 (콘솔) ) (0) | 2021.11.15 |