날아라쩡글이의 블로그입니다.

함수 형태 본문

중앙 HTA (2106기) story/javascript story

함수 형태

날아라쩡글이 2021. 12. 16. 18:58
반응형

함수 선언 
function fn1(){
console.log("fn1함수 입니다.");
}

  • 함수 선언식은 실행위치에 상관없다. 
  • 함수 선언을 위에 작성해도 함수는 실행된다. 
  • 글로벌 객체로 등록이 되어서 함수를 분석하고, window라는 글로벌 객체에 등록되고 실행된다. 

함수 표현식  : 이름 없는 익명함수를 함수표현식으로 정의하고 변수에 대입한 것
var fn2 = function(){
console.log("fn2함수 입니다.");
}

  • 함수표현식은 함수표현식 아래에 작성을 해야 실행이 가능하다. 
  • 위치에 따라서 실행이 될 수도 있고, 안될 수도 있기 때문이다. 
    • <script>{
      var a = 10;
      var b ="햄스터";
      var c = function(a, b) {
            return a + b;
      }
      </script>  으로 진행을 할 경우 
    • 변수 호이스팅, 변수 끌어올리기가 실행된다. 
      <script>
      var a, b, c;
      //선언 변수를 최상단에 올려버린다. undifiend의 값이 저장된다. 
      c();//함수를 선언하게 되면 함수가 아닌 undifiend의 값이 실행된다. 그래서 값이 없다고 나온다. 
      a = 10;
      b = "햄스터";
      c = function(a, b) {
            return a + b;
      }
      </script>
    • 그렇기 때문에 에러가 나는 부분을 확인하면 fn2 is not a function at이라는 함수가 아니라는 글이 뜬다. 
    • 변수끌어올리기가 실행되어서 메소드가 실행되지 않는다. 

함수를 매개변수로 사용하기 , 단일책임의 원칙을 지켜주자

  • 자바스크립트는 매개변수에 함수를 넣어 연산을 할 수 있다. 
    • 자바의 방식의 경우
      function 계산기(num1, num2, type) { //계산을 하는데 어떤 연산이 올지 몰라 type을 매개변수로 둠
      if(type === '더하기') {
      console.log("결과" ,num1 + num2)
      } else if(type === '곱하기') {
      console.log("결과" ,num1*num2)
      }
      } 이 계산기는 수정을 할 수 없고, 정해져 있기 때문에 값을 변경할 수 없다. 
    • 계산기(10,20,'더하기');
      계산기(10,20,'곱하기');
  • 좀더 나은 방식으로 계산기를 작성하고 싶다. 
    • 함수를 매개변수로 전달받는 함수 
      • 새로운 연산기능의 추가 되더라도 계산기2()의 코드가 변경되지 않도록 만들고 싶다. 
        • function 계산기2(num1, num2, fn) {//fn에 함수가 들어오게 함, 자바스크립트는 함수를 매개변수로 전달할 수 있다.
          fn(num1, num2); //함수안에 (숫자1, 숫자2)를 넣는다.
          }//계산기2는 이코드가 끝이다.
      • 계산기 2()는 두 수를 연산하는 기능을 직접 구현하지 않고, 연산기능이 구현된 함수를 전달 받아서 그 함수를 실행시키기만 한다. 
      • 실제로 실행할 부분은 개발자가 구현해놨으니까 함수를 매개변수로 전달받은 함수 너는 구현만해 
        • 확장성이 넓어졌다. 
      • 새로운 함수를 추가되더라도 계산시2의 메소드는 변경하지 않아도된다.
      • 실제 실행하는 코드는 다양한 기능을 수행하기 때문에 이런 형태의 메소드들이 많다. 
    • 계산하는 코드를 따로 둔다. 

      • function plus(a, b){
        console.log(a + b);
        }
        function minus(a, b){
        console.log(a - b);
        }
      • 사용한다.
      • 계산기2(100, 200, plus);     //plus의 기능을 전달해줌
        • 계산기2(100, 200, function plus(a, b) {console.log(a + b)})
      • 계산기2(100, 200, minus);
        • 계산기2(100, 200, function minus(a, b) {console.log(a - b)})
        • 아래 작성된 부분이 사실은 이런 형태로 전환되는 것을 의미한다. 
    • 그냥 계산기2()함수를 실행할 때 익명함수를 호출시점에 직접 작성해서 전달해도 상관없다. 
      • 계산기2(100,200,function(a, b) {
        console.log(a*b);
        })
    • 그냥 그자리에서 즉석으로 함수를 만들어서 전달해도 된다.
    • 내가 실행시키고싶은 함수를 직접 구현해서 전달하고 싶을 때 함수를 만들어서 메소드 호출시점에 전달해도된다. 
      • 계산기2(100,200,function(a, b){
        console.log(a/b);
        })

화살표 함수 (함수 표현식을 더 단순하고 간결한 문법으로 정의하는 것)
var 변수 = (매개변수, 매개변수, 매개변수) => 수행문 
//function이라는 기호를 사라지게 하는 것
var 변수 = (매개변수, 매개변수, 매개변수) =>{
                           수행문;
                           수행문;

//수행문이 2개이상이면 중괄호가 필요하다. 

  • 화살표 함수의 특징
    • 매개변수가 없는 화살표 함수는 다음과 같이 작성하고, 괄호를 생략할 수 없다. 
      • var 변수 = () => 수행문
    • 매개변수가 하나만 있는 화살표 함수는 매개변수를 감싸는 괄호를 생략할 수 있다. 
      • var 변수 = 매개변수 => 수행문
      • var 변수 = (매개변수) =>수행문
    • 수행문이 하나만 있는 화살표 함수는 중괄호가 필요없다. 
    • 수행문이 하나만 있는 화살표 함수에서는 return키워드를 생략해도 수행문의 실행결과가 반환값이 된다. 
    • 수행문이 2개 이상 있는 화살표 함수는 중괄호가 필요하다. 
    • 수행문이 2개 이상 있는 화살표 함수가 반환값이 있는 경우 return키워드를 사용해서 값을 반환해야한다. 
  • 함수는 어떤 작성 방식이 좋을까?
    • 첫번째 고려대상은 언제나 함수선언이다. 
      • 함수선언 방식으로 정의한 함수는 그 함수를 선언위치와 상관없이 사용할 수 있다. 
      • 함수의 이름을 통해서 어떤 기능이 정의된 함수인지 빠르게 파악할 수 있다. 
      • 함수의 몸체에 해당하는 부분에 복잡한 수행문을 작성할 수 있다. 
      • function 계산기(a, b, fn) {
        var x = fn(a, b);
        console.log("결과", x);
        }
    • 함수로 구현한 기능이 딱 한군데에서만 사용되거나 혹은 다른 함수의 매개변수로 전달하는 함수인 경우 함수표현식을 고려할 수 있다. 
      • 함수 표현식도 중괄호 안에 복잡한 수행문을 작성할 수 있다. 
      • 함수를 호출할 때 그 함수의 매개변수로 함수가 전달되는 경우, 전달되는 함수를 함수표현식으로 작성하는 것이 좋다. 
      • 함수를 호출할 때 그 함수의 매개변수로 함수가 전달되는 경우 전달되는 함수의 코드가 간단하다면 화살표 함수를 고려할 수 있다. 
      • 계산기(10,20, function(a, b){
        return a + b;
        })
    • 화살표 함수 계산기(10, 20, (a,b) =>a - b); 
      • 중괄호로 묶게되면 return문을 꼭 적어주어야한다.
  • 자바의 람다식 
    • (타입변수명, 타입변수명) => 수행문;
    • (변수명, 변수명) =>수행문
    • 특징
      • 반드시 부모는 거의 다 인터페이스나 부모클래싀 메소드를 재정의할 때 사용한다. 
        • 무조건 부모가 있어야한다.
      • 재정의할 메소드가 딱 하나만 존재해야한다. 
        • ex)interface A{void m1(); void m2();}  //불가하다
  • ex )
    • interface Pen() { void draw()}
    • public class Painter {public void (Pan pan) {  pen.draw(); }}   //선긋기 작업
      • Painter painter = new Painter()
      • painter.drawLine(Pen타입의 객체가 들어가야한다. );
    • 1번
      • Pen을 구현한 구현클래스로 객체를 만들어서 전달한다.
      • class Yellowpen implements Pen{public void draw(){노란색으로 그려요 }}
      • Pen p1 = new YelloPen();
      • painter.drawLine(p1);
    • 2번
      • 익명객체를 만들어서 전달하기 
      • Pen p2 = new Pen(){public void draw(){빨간색으로 그려요 }}
      • painter.drawLine(p2);
    • 3번
      • drawLine메소드의 매개변수자리에서 익명객체를 만들어서 전달하기 
      • painter.drawLine(new Pen(){ public void draw(){파란색으로 그려요}})
      • java 7에서는 타입추론기능이 가능해진다. 
        • List<Book> books = new ArrayList<Book>(); 
        • 이젠
        • List<Book> books = new ArrayList<>();
        • 타입을 추론해서 ArrayList자리에 객체가 뭐가 들어갈 지 아는 것이다. 
        • 그럼 3번을 다시 추론하면, 
      • painter.drawLine(?); 
      • 물음표에 Pen객체가 들어가는 사실을 추론한다.
      • painter.drawLine(() ->파란색으로 그려요);라고 작성하면 메소드와 객체의 추론하여 compile시 3번처럼 변경되어 입력이 된다. 
      • compile시 직접 익명객체로 만든다.
      • 수행문이 2개이상이면 중괄호로 묶어주고 return을 작성해주어야한다. 
      • 수행문이 1개면 수행문으로 인식하여 return을 작성하지 않아도 된다. 
  • 함수는 f(x) = 2x + 1 을 말한다. 값 = 수행문;
    • 예전에는 f(x) 자리에 그리스 언어인 람다를 작성했다. 
    • 자바스크립트에서는 함수로 function을 작성하고, 자바의 경우 이전의 언어인 람다식이라는 단어를 붙여서 사용한다.
    • 값 = 수행문 이렇게 생긴 형태를 딴다고 생각하면 된다. 
  • 사용하는 경우 (람다식)
    • interface추상메소드가 1개만 있는 경우 
    • 추상메소드가 2개이상있지 않은 경우 
    • java의 람다식은 독립적으로 만들어 지지 않는다 . 
    • JVM이 메소드와 어떤 객체인지, 매개변수가 뭔지 추론을 할 수 있게 되었다. 
    • 수학함수에서 제일 중요한것은 f(x, y) 몇 개 입력했는가 2x + y (표현식)이 중요하다. 
      • 이것을 자바스크립트의 코드와 자바로 변경해보자 
      • 방정식(x, y) => 2x + y;
      • public int 방정식(x, y) {return 2x + y } 껍데기는 중요하지 않다. 간단하게 적자! 

 

반응형

'중앙 HTA (2106기) story > javascript story' 카테고리의 다른 글

배열 메소드  (0) 2021.12.16
문자메소드  (0) 2021.12.16
DOM  (0) 2021.12.16
event  (0) 2021.12.16
자바스크립트의 연산자, 함수  (0) 2021.11.24
Comments