...args / 스프레드 변수 / 확산 매개변수 / 나머지 매개변수에 대하여

SHORTCUT

    반응형

    인트로

    다른 사람의 Javascript 코드를 보다보면 매개변수로 들어오는 ...args를 자주 볼 것이다.
    과연, ... 이 무엇일까?

    용어의 다른 이름은?

    function sum(...args){
        ...
    }

    먼저 위 코드처럼 매개변수의 위치에 존재하고 있다. 따라서, 아래처럼 여러가지 이름으로 불리고 있다.
    우선 여기선 확산 매개변수 라고 부르겠다.

    • 확산 매개변수
    • 나머지 매개변수
    • 스프레드 변수
    • (외국) ...
    • (외국) three dots

    정의

    확산 매개변수는 자바스크립트의 함수 선언의 매개변수에서 활용되는 개념이다. ES6에서 추가된 문법으로 ... 을 사용하여 매개변수로 들어오는 변수의 나머지 값들을 받아오게 하는 기능이다.

    ... 은 확산 연산자 / 스프레드 연산자 이다.
    이는 배열의 나머지 값들을 손쉽게 받아오는 기능으로 ES6에서 추가되었다.
    이를 함수의 매개변수 부분에 선언하면 손쉽게 함수를 확장 할 수 있는 확산 매개변수의 기능을 할 수 있게 된다.

    사용법

    함수의 매개변수 부분에서 ... 을 선언하여 나머지로 인입되는 매개변수를 받으면 된다.

    function getGrade(a,b,c ...args){
        ...
    }
    
    getGrade(10,20,30,40,50);
    // 위 처럼 실행할 경우, 10, 20, 30은 정상적으로 a,b,c라는 변수명으로 맵핑된다.
    // 나머지 추가적으로 들어오는 40, 50은 나머지로 취급되어 args 객체 안으로 들어간다.
    • args 는 배열처럼 사용 가능한 객체 이다.
    • ...args 는 매개변수의 맨 마지막에 쓴다.
    • 매개변수에서 ...args 는 하나만 존재해야 한다.
      • function getGrade(a, b, c, d, e, ...agrs){}; // [O]
        function getGrade(...args1, ...args2, ...args3){}; // [X]

    넌 왜 사용했는데?

    이번에 외부 스크립트를 삽입하는 개발건을 진행중에 있다. 이 과정에서 코드의 직관성을 높이고 함수의 재사용성을 높이기 위해 다양한 방법을 고민했다.

     

    그리고 자바스크립트에서 함수를 여러가지 방면으로 활용하는 방식을 고민했다. 자바에서는 메소드 오버로딩 을 통해 하나의 함수명을 다방면으로 쓸 수 있는데, 자바스크립트에선 이를 지원하지 않는다.

     

    자바스크립트 함수는 매개변수에 따라 다르게 활용될까?

     

    자바스크립트 함수는 매개변수에 따라 다르게 활용될까?

    인트로 자바 Java의 OOP 개념 중에 메소드 오버로딩 Method Overloading 이 있다. 이는 메소드가 동일 이름을 가지고 있어도, 들어가는 매개변수가 다르면 다르게 인식된다는 의미이다. pulbic int getGrade(){

    23log.tistory.com

     

    위 글 처럼, 자바스크립트는 매개변수에 따라 다르게 활용되지 않는다 그렇담 함수를 다양하게 사용하려면 어떻게 해야할까?


    바로 이 궁금증에서 시작해서 확산 매개변수를 찾아보게 되었고, 관련된 함수를 작성하게 되었다.

    확산 매개변수의 사용법

    function printAll(arr){
      for(let i = 0; i < arr.length; i++){
          console.log(arr[i]);
      }
    }
    
    function getText(a,b, ...args){
        console.log('첫번째 매개변수 : ' + a);
        console.log('두번째 매개변수 : ' + b);
          printAll(...args);
    }
    
    getText(10, 20, [1,2,3,4,5]);
    
    // 첫번째 매개변수 : 10
    // 두번째 매개변수 : 20
    // 1
    // 2
    // 3
    // 4
    // 5
    • 만약 args로 들어왔다고 해서 args 만 쓴다면 이는 객체로 인식한다.
      • 따라서, 위 상황에서 printAll(args)를 했다면, 그냥 객체 1개, 매개변수 1개를 입력한 상황이 된다.
      • typeOf(args) = Object 이다.
    • 따라서, 나머지 매개변수(배열)로 입력된 값을 고~대로 배열로 보내주기 위해선 printAll(...args) 를 입력하여 그대로 보내주면 된다.

    확산 매개변수의 존재 유무 파악하기

    args 는 배열처럼 사용 가능한 객체이기 때문에, args.length로 판단이 가능하다.

    • args.length == 0 : 넘어온 매개변수 없음
    • args.length > 0 : 넘어온 매개변수 있음
    반응형

    댓글

    Designed by JB FACTORY