whatisthis?

생활코딩 WEB3 - javascript편(5/6) 본문

WEB STUDY/JAVASCRIPT

생활코딩 WEB3 - javascript편(5/6)

thisisyjin 2021. 10. 1. 18:03

25. 함수

  

연속적이지 않은 반복문이거나, 중복이 1억번 발생한다고 치자.

이는 반복문으로만 작성할 수는 없고, '함수(function)'를 통해 작성할 수 있다.

 

예제.

function two(){
   document.write('<li>2-1</li>');
   document.write('<li>2-2</li>');          
   }
document.write('<li>1</li>');
two();
document.write('<li>3</li>');
two();

 

 

함수의 선언

function two(){
     내용
}

함수의 실행

two();

 


26. 함수 : 매개변수와 인자

 

자판기를 예시로 들어보자.

자판기에서 우리가 원하는 제품을 선택하면, 그 제품이 나오게 된다.

 

- 우리가 제품을 선택하는 것 = 입력 (input)

- 자판기에서 물건이 나오는것 = 출력 (output)

 

● Parameter (매개변수) = '입력'에 해당.

Argument (인자) 

Return = '출력'에 해당.

 

function onePlusOne(){
        document.write(1+1);
      }
      onePlusOne();

위와 같은 함수는 언제나 똑같이 실행되는 함수이다.

왜냐하면 단순 write 기능만 실행하기 때문이다.

늘, 변함없이, 언제나 결과는 2 라는 값을 반환한다.


궁금증 >> document.write에 1+1이라고 쓰니 '2'라는 값이 나왔다.

이는 자바스크립트가 동적인 프로그래밍 언어이기 때문에, '1+1'이 그대로 나오는 html과 달리
'2'라는 더한 값이 나온 것인데,
위 예제들에서는 <li>와 같은 코드들을 html태그처럼 document.write()를 통해 쓸 수 있었다.


깨달음 >> 아! document.write() 에 괄호안에 ' ' 없이 작성하면 - 자바스크립트.
' ' 안에 작성하면? '문자열' 이므로, html 형식으로 출력되는구나.

확인을 위해 document.write('<h1>안녕하세요</h1>'); 라고 적어본 결과
h1태그가 제대로 되었다.
즉, 자바스크립트 내에서 선언한 함수 or 변수를 쓰려면  ' ' 바깥에서 + + 로 이어서 써야한다. 


 

이제, 매개변수를 이용한 함수를 선언해보자.

 

 

  function sum(left, right){
        document.write(left + right);
      }

left, right라는 변수를 매개변수(Parameter)이라고 한다.

위와 같이 매개변수가 있는 함수를 사용할때에는

 

sum(2,3); // 5
sum(3,4); // 7

위와 같이 각 변수의 값을 지정해줘야한다.

 

위에서 left, right와 같은 값은 '입력'에 해당하는 변수, 즉 매개변수(Parameter)이라 하고,

함수로 전달하는 2,3 과 같은 값을 인자(=Argument)라고 한다.

 

최종 실행 결과

 

exam.html
0.00MB

 



27. 함수 (return)

 Return = '출력'에 해당.

 

 

  function sum2(left, right){
      return left+right;
    }
document.write(sum2(2,3));
document.write('<div style="color:red">'+sum2(2,3)+'</div>');
document.write('<div style="font-size:3rem;">'+sum2(2,3)+'</div>');

 

return을 해주지 않는다면, 다양한 용도에서 함수를 사용할 수 없다.

 

실행결과


<참고 -  CSS 단위 中 em과 rem>

em - 상위 요소 기준 몇 배
예> 2em = 상위 요소보다 2배 큰 크기


rem - html 요소 기준 몇 배
(여기서 html요소란, 최상위 요소인 <html>태그를 뜻함)

28. 함수의 활용

-> 동작하는 내용은 같지만, 코드를 효율적으로 하는 리팩토링 과정을 진행해보자!

<script>
    function nightDayHandler(self){
      var target = document.querySelector('body')
        if(self.value === 'night'){
          target.style.backgroundColor = 'black';
          target.style.color = 'white';
          self.value = 'day';

          var links = document.querySelectorAll('a');
          var i = 0;
          while(i<links.length){
            links[i].style.color = 'powderblue';
            i=i+1;
          }
        } else {
          target.style.backgroundColor = 'white';
          target.style.color = 'black';
          self.value = 'night';

          var links = document.querySelectorAll('a');
          var i = 0;
          while(i<links.length){
            links[i].style.color = 'blue';
            i=i+1;
          }
        }
      }
</script>

 

자바스크립트 코드 전체를 html 내 head 요소 안의 <script>로 붙여넣고,

함수로 선언하여 아래에서 함수를 사용함.

 

 

 

**주의

 

함수 선언시에는 nightDayHandler(self)로 한다.

즉, 우리가 input 에서 onclick에 코드를 작성할때에는, 자기 자신을 'this'라고 입력했었다.

 

그러나, 우리는 리팩토링을 위해서 input에서 벗어나

하나의 함수 nightDayHandler()를 선언했기 때문에, 

더이상 this는 <input>태그를 가리키지 않게 된다.

(** 전역 객체를 가리키게 된다. 즉, 웹브라우저에서는 윈도우)

 

즉, 선언시에는 nightDayHandler(self)로 하지만

함수를 사용할때에는 매개변수 self에 this라는 값을 주어야 한다.

 

nightDayHandler(this);

 

 

<input type="button" value="night" onclick="
    nightDayHandler(this);
    ">

 


29. 객체 ex.


함수 기반 위에 객체가 존재함.

객체(object)란

 

프로그램이 복잡해지면, 잘 정리정돈하기 위해 함수를 사용.

그러한 함수가 많아진다면? 역시나 다른 해결책이 필요.

 

서로 연관된 함수와 변수를 같은 이름으로 그룹핑하여 정리정돈하기 위한 도구 = 객체.

 

 

● 객체지향프로그래밍(Object Oriented Programming, OOP)

객체 (Object)

메소드 (Method)

인스턴스 (Instance)

 

모든 링크태그(a 태그)를 지정하여 색깔을 바꿔주는 역할을 하는 부분이 중복된다.

 

이를 함수로 선언하여 중복을 제거해보자.

function setColor(color){
      var links = document.querySelectorAll('a');
      var i = 0;
      while(i<links.length){
        links[i].style.color = color;
        i = i + 1;
        }
      }

해당 함수의 매개변수는 color으로,

links[i].style.color = color;로 바꿔준다.

 

함수를 사용할때에는

setColor('powderblue');

다음과 같이 사용한다.

 

**주의 > ' ' 를 붙여야 한다.

왜냐면 원래 코드가

links[i].style.color = 'powderblue'; 와 같이 색상에는 ' ' 를 꼭 붙여주기 때문이다.

 

 

function setColor(color){
       target.style.color = 'white';
          }
        }

그러나, 만약 위와 같이 함수 이름이 중복된다면,

(위에서 <a>태그 글자색을 바꿔주는 함수 이름도 setColor이였다.)

 

이는 함수가 덮어쓰기 되면서, 이전에 선언했던 것이 삭제가 된다.

 

 

따라서, 해당 코드들을 함수 이름이 구분되도록 각각 작성해서 리팩토링 해보자.

 

function BodySetColor(color){
       var target = document.querySelector('body');
       target.style.color = color;
          }

function BodySetBackgroundColor(color){
        var target = document.querySelector('body');
        target.style.backgroundColor = color;
      }

function LinkSetColor(color){
        var links = document.querySelectorAll('a');
        var i = 0;
        while(i<links.length){
          links[i].style.color = color;
          i = i + 1;
          }
        }

 

아래 nightDayHandler(self)함수 또한 바꿔줘야한다.

 

  function nightDayHandler(self){
      var target = document.querySelector('body');
        if(self.value === 'night'){
          BodySetBackgroundColor('black');
          BodySetColor('white');
          self.value = 'day';

          LinkSetColor('powderblue');

        } else {
          BodySetBackgroundColor('white');
          BodySetColor('black');
          self.value = 'night';

          LinkSetColor('blue');
          }
        }

 

위에 선언한 함수들은 전부 연관된 함수들이다.

이러한 함수들이 많아질수록 복잡해지므로, 객체를 이용하여 연관된 함수끼리 묶어 정리해보자.

 

 

함수명은 소문자 시작 / 객체명은 대문자 시작으로 구분하자.

 

예> Links.setColor

Body.setBackgroundColor('black');
Body.setColor('white');

Link.setColor('powderblue');

이것은 마치 객체가 디렉터리와 같은 기능을 하는 것과 같다.

예> /etc/image/img001 과 같은 디렉터리.

 

 

** 우리가 여태 써왔던

document.querySelector

document라는 객체에 속해있는 querySelect 함수였던 것이다!

 

우리는 객체에 속해있는 함수는 함수라 하지 않고, 메소드(method)라고 부른다.