ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 2주차 - es6 , 일급객체로서의 함수, Map, Set
    이노베이션캠프/Js 문법 종합반 2023. 5. 23. 10:47

    * ES6 문법소개 및 실습

     

    1. ES6

    Js의 버전 중 하나로 2015에 발표. 대규모 문법적 향상이 및 변경이 있었음

     

    2. let, const

    es6 이전에는 var만 사용됐었음

    let(변수) / const(상수) : 재할당 가능 / 불가능

     

    3. 화살표함수

    let functionName = () => {
    	//main logic
    }

    한 줄일 때, ()와 {} 모두 삭제 가능

     

    4. 삼항연산자

    condition ? ture인경우 : false인 경우

    5. 구조분해속성

    배열이나, 객체의 속성을 분해해서 그 값을 변수에 담을 수 있게 해주는 문법

     

    1) 배열인 경우(순서가 중요)

    let [value1, value2] = [1, "new"]

    이렇게 각각할당이 가능!

    let arr = ["value1", "value2", "value3"]; // 값
    let [a,b,c] = arr; // 변수
    // let [a,b,c] = ["value1", "value2", "value3"]; 와 똑같은 두 줄

    이것도 가능

    let arr = ["value1", "value2", "value3"]; // 값
    let [a,b,c,d] = arr; // 변수
    //위에 변수를 하나 더 추가함. 그러면 Js는 '어, 들어와야하는 변수의 값이 하나 없네'라고 판단
    // d는 undefined 가 됨

    이런 경우 undefined가 되는 걸 막기 위해 기본값을 셋팅해주면 됨

    let arr = ["value1", "value2", "value3"]; // 값
    let [a,b,c,d=4] = arr; // 변수
    //d=4 기본값 셋팅, 값이 들어올 경우 그걸로 바뀜

     

    2) 객체인 경우

    let user = {
    	name: "abc",
        age: 30,
    };
    
    let {name, age} = user;
    //name과 age 라는 키가 구조분해할당이 되어 "abc"와 30이라는 값을 가지게 됨
    //오른쪽에 있는 이 객체의 각각의 요소를 분해해서 왼쪽에 있는 name과age라는 각각의 변수에 할당해준다
    
    console.log(name); // abe string임
    console.log(age); //30 number임
    //name과 age는 더이상 객체형태가 아니라 string와 number로 나오게 되는 걸 볼 수 있음
    let user = {
    	name: "abc",
        age: 30,
    };
    
    let {
    	name: newName,
        age: newAge,
     } = user;
     // name의 값을 newName이라는 변수에 넣어달라, age의 값을 newAge라는 변수에 넣어달라 는 거임!
     // 그래서 여기서는 console.log할 때 아래와 같이 해야 위와 같은 결과가 나옴
     
     console.log(newName) // abc
     console.log(newAge) // 30
    let user = {
    	name: "abc",
        age: 30,
    };
    
    let {name, age, birthday} = user;
    // 객체에 없는 키값을 넣어봄 그러면 배열과 똑같이 됨
    
    console.log(name); // abe
    console.log(age); // 30
    console.log(birthday); // undefined

    배열과 똑같이 없는 값을 받으려고 하면 undefined가 나옴

    let user = {
    	name: "abc",
        age: 30,
    };
    
    let {name, age, birthday="today"} = user;
    // 배열과 같이 초기값 넣기 가능
    
    console.log(name); // abe
    console.log(age); // 30
    console.log(birthday); // today

    구조분해를 통해 받는 값에 birthday: "yesterday"와 같이 값이 들어가면 초기값 대신 들어간 값이 당연히 들어오게 됨. 말그대로 초기값은 초기값!

     

    6. 단축 속성명 : property shorthand

    1) 배열

    const name = "abc";
    const age = "30";
    
    const obj = {
    	name, // name:name
        age, // age:age
    }
    // 이와같이 이름이 겹치는 경우 과감하게 생략이 가능하다는 거임. 키 밸류가 똑같으면 생략이 가능하다!

    7. 전개 구문 : spread operator

    destructuring과 함께 가장 많이 사용되는 es6 문법 중 하나

    let arr = [1,2,3];
    console.log(arr) // [1, 2, 3]
    console.log(...arr) // 1 2 3

    ...arr이 전개 구문 사용한 것! 어떨때 쓰이나? 아래참고

    let Arr = [1,2,3] //여기에 4를 추가하고 싶을 때 push를 사용할 수도 있겠지만
    
    let newArr = [...arr];
    console.log(arr); //[1,2,3]
    console.log(newArr); //[1,2,3]
    //현재 둘이 같음 그러므로 아래와 같이 해주면
    
    newArr = [...arr, 4]
    console.log(newArr); // [1,2,3,4] 가 되는 거임! 풀렀다가 다시 묶어주니께

    2) 객체

    let user = {
    	name: 'abc';
        age: 30,
    };
    
    lset user2 = {...user};
    
    console.log(user); // {name:'abc', age:30}
    console.log(user2); // {name:'abc', age:30}

    8. 나머지 매개변수(rest parameter)

    function expleFunc(a,b,c,...args) {
    	console.log(a,b,c);
        console.log(...args);
    };
    //매개변수의 갯수를 정확히 모를 때 ,...args 라고 명시해줄 수 있음
    
    expleFunc(1,2,3,4,5,6,7);
    
    // 1 2 3
    // 4 5 6 7
    
    //스프레드 문법(...)을 빼주면
    function expleFunc(a,b,c,...args) {
    	console.log(a,b,c);
        console.log(args);
    };
    //매개변수의 갯수를 정확히 모를 때 ,...args 라고 명시해줄 수 있음
    
    expleFunc(1,2,3,4,5,6,7);
    
    // 1 2 3
    // [4, 5, 6, 7]

    꼭 ...args로 명시해줘야함

     

    9. 템플릿 리터럴(Template Literal)

    백틱 사용, js 변수 멀티라인 지원

    console.log(`Hello world ${3+3}`); // Hello world 6
    
    let testVlaue = "안녕하세요"
    console.log(`Hello world ${testValue}`); // Hello world 안녕하세요
    console.log(`
    	Hello
        	My name is Javascipt!!!
            
            Nice to meet you!!
     `);
     
     /*-
     	Hello
        	My name is Javascipt!!!
            
            Nice to meet you!!
     *-/
     //모양 그대로 나옴!!!!!! 개쩐다

    * 일급 객체로서의 함수

    일급객체(First-class Object) : 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체

    즉, 그냥 객체와 같다는 거임

    함수를 매우 유연하게 사용할 수 있음!!

     

    1. 변수에 함수를 할당할 수 있다.

    다른 프로그래밍 언어에서는 말도 안됨

    함수를 마치 값처럼 취급할 수 있음.

    함수가 나중에 사용될 수 있도록 조치가 됨. 

    const sayHello = function() {
    	console.log("Hello");
    };

    sayHello라는 변수에 함수를 할당함. 

     

    2. 함수를 인자로 다른 함수에 전달할 수 있다

    1) 콜백함수 : 매개변수로써 쓰이는 함수

    2) 고차함수 : 함수를 인자로 받거나 return 하는 함수

    콜백함수는 고차함수의 한 종류라고 볼 수 있음

    function callFunction (func) {
    	//매개변수로 받은 변수가, 함수라는 것
    	func();
     };
     
     const sayHello = function() {
     	console.log("Hello");
    };
    
    callFunction(sayHello);

    3. 함수를 반환할 수 있다. 

    function createAdder(num) {
    	return function(x) {
        	return x + num;
        };
    };
    
    const addFive = createAdder(5);
    console.log(addFive(10)); // 15

    4. 일급객체로써의 함수(2)

    const person = {
    	name:'John',
        age: 31,
        isMarried: true,
        sayHello: function() {
        	console.log(`Hello, My name is ${this.name}`);
        },
        //여기서 화살표 함수는 사용이 어려움. 화살표 함수는 this를 바인딩하지 않음. 화살표 함수로 다시 작성할시
        // this.name부분에 undefined가 뜸
     );
     
     person.sayHello(); // Hello, May name is John

    5. 배열의 요소로 함수를 할당

    const myArr = [
    	function(a,b){
        	return a+b; 
        }, 
    	function(a,b){
        	return a-b;
        },
    ];
    
    console.log(myArr[0](1,3)); //4
    console.log(myArr[1](10,7)); //3

    함수조합도 가능

    function multiplyBy(num) {
    	return function (x) {
        	return x * num;
        };
    }
    
    function add(x,y){
    	return x+y;
     };
     
     const multiplyByTwo = multiplyBy(2);
     const multiplyByThree = multiplyBy(3);
     
     const result = add(multiplyByTwo(5), multiplyByThree(10));
     console.log(result); // 40

    *Map

    Js의 객체, 배열을 통하여 많고, 다양하고, 복잡한 프로그램들을 만들어옴

    그럼에도 현실세계를 반영하기는 좀 어려움

    그래서 Map, Set과 같은 추가적인 자료구조가 등장함

     

    Map, Set의 목적 : 데이터의 구성, 검색, 사용을 효율적으로 처리 > 기존의 객체 또는 배열보다

     

    1. Map

    - Key / Value

    - Key에 어떤 데이터타입(유형)도 들어올 수 있다

    - Map은 키가 정렬된 순서로 저장되기 때문이다.

     

    - 기능: 검색, 삭제, 제거, 여부 확인

    - 기본적인 모양

    const myMap = new Map();
    myMap.set('key', 'value');
    
    //...
    //...
    
    myMap.get('key') //key로 검색가능 그래서 set과 get은 항상 pair다

    - 대량데이터를 처리하기 위해 만들어진 자료구조이므로 반복이 중요함

     

    - 반복을 위해 사용되는 method : keys, values, entries

    1) iterator

    - 위의 method를 사용할 수 있는 이유는, 이들이 다 iterator를 가지고 있는 덕분임

    - iterator이란? 반복자라는 말임. 

    - iterator 를 가지고 있으면 Js에서는 for... of 라는 걸 쓸 수 있음. 하나하나 돌면서 사용이 가능하다는 거임. 

     

    2) 예시와함께 method 알아보기

    const myMap = new Map();
    myMap.set('one', 1);
    myMap.set('two', 2);
    myMap.set('three', 3);
    
    console.log(myMap.keys()); // [Map Iterator] {'one', 'two', 'three'}
    
    for(const key of myMap.key()){
    	console.log(key);
    }
    
    /*-
    one
    two
    three
    -*/
    
    console.log(myMap.values()); // [Map Iterator] {1, 2, 3}
    
    for(const value of myMap.values()){
    	console.log(value);
    }
    
    /*-
    1
    2
    3
    -*/
    
    
    console.log(myMap.entries()); // [Map Iterator] {['one',1], ['two',2], ['three',3]}
    
    for(const entrie of myMap.entries()){
    	console.log(entrie);
    }
    
    /*-
    ['one',1]
    ['two',2]
    ['three',3]
    -*/

     

    3) Map의 크기 확인

    console.log(myMap.size); //3
    //Map의 사이즈(길이)

     

    4) Map의 특정 key 확인

    console.log(myMap.has("two")); //true
    //key 기반 검색

    *Set

    고유한 값을 저장하는 자료구조

    값만 저장함. 키를 저장하지는 않음

    값이 중복되지 않는 유일한 요소로만 구성된다

     

    1. Set

    1) 생성

    const mySet = new Set();
    mySet.add('value1');
    mySet.add('value2');

    2) 사이즈 확인

    console.log(mySet.size); // 2

    3) 값의 여부

    console.log(mySet.has('value2')); //true

    4) 반복

    const mySet = new Set();
    mySet.add('value1');
    mySet.add('value2');
    mySet.add('value3');
    mySet.add('value5');
    mySet.add('value8');
    
    for(const value of mySet.values()) {
    	console.log(value);
     }
     
     /*-
     value1
     value2 
     value3
     value5
     value8
     *-/
     
     // value만 있으므로 values()만 있음

     

    - 관련 MDN

    https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set

     

     

Designed by Tistory.