[태그:] 자바스크립트

  • ES6

    1. ES6 문법(ES2015)

    ⭐ES6문법

    ES(ECMAScript)란 자바스크립트의 표준을 말하며

    자바스크립트가 다양한 웹 브라우저에서 공통적으로 잘 작동되도록 표준이 필요해지면서 만들어진 것.

    ES6가 가장 큰 변화가 있는 표준.

    1) const & let (불변 변수와 가변 변수)

    (1) const

    불변 변수 선언을 위한 키워드로,

    객체와 함께 사용할 때 말고는 값을 다시 할당할 수 없는 변수. (배열이나 객체의 값을 변경하는 것은 가능하다)

    보통 const를 사용하며 var 사용보다는 const나 let을 사용.

    (2) let

    가변 변수 선언을 위한 키워드,

    즉, 변경 가능한 변수를 생성할 수 있다. const와 달리 재할당이 가능한 변수.


    2) 템플릿 문자열(Template String)

    문자열 안에 변수, 연산식을 혼합하여 사용한다.

    (1) 작은따옴표( ‘ ‘ ) 대신 백틱( ` )으로 문자열 표현.

    (2) 템플릿 문자열에 $를 사용하여 변수나 식 포함 가능.

    기존의 코드:

    var fruit = { name: '망고', price: 9900 };
    var getFruit = function(fruit) {
        return fruit.price + '원';
    };
    var mine = '선택한 과일은 ' + 'fruit.name + '입니다. 가격은 ' + getFruit(fruit) + '입니다.';

    템플릿 문자열:

    var fruit = { name: '망고', price: 9900 };
    var getFruit = function(fruit) {
        return ${fruit.price}원;
    };
    var mine = `선택한 과일은 ${fruit.name}입니다. 가격은 ${getFruit(fruit)}입니다.`;

    3) 전개 연산자(Spread Operator)

    나열형 자료를 추출, 연결할 때 사용.

    사용하려면 배열 또는 객체, 변수명 앞에 마침표 세개(…) 입력.

    기존의 코드:

    const arr1 = [1,2,3];
    const arr2 = [4,5,6];
    const combined = arr1.concat(arr2);

    전개 연산자:

    const arr1 = [1,2,3];
    const arr2 = [4,5,6];
    const combined = [...arr1, ...arr2];

    또다른 예시로 객체의 경우,

    기존의 코드:

    const obj1 = { one: 1, two: 2 };
    const obj2 = { three: 3, four: 4 };
    
    var combined = Object.assign({}, obj1, obj2);

    전개 연산자:

    const obj1 = { one: 1, two: 2 };
    const obj2 = { three: 3, four: 4 };
    
    var combined = {...obj1, ...obj2};

    4) 화살표 함수(Arrow function)

    화살표 기호 => 로 함수를 선언. function 키워드를 생략하고 인자 블록과 본문 블록 사이에

    화살표를 표기하여 사용한다.

    기존의 코드:

    function addNumber(a,b) {
        return a+b;
    }

    화살표 함수:

    const addNumber = (a,b) => {
        return a+b;
    }

    return 키워드를 생략하면

    const addNumber = (a,b) => a+b;

    5) 클래스(Class)

    기존 자바스크립트(ES5까지)에는 클래스가 없었으나 ES6에 추가됨.

    (1) 클래스 사용법

    ① class 키워드: 클래스 정의

    ② constructor() 생성자 함수

    ③ new 키워드: 클래스 생성

    자세히는 Java Script – Class 장에서 다룬다.

    클래스를 사용한 코드:

    class addUser {
        constructor(name, age) {
            this.name = name;
            this.age = age;
        }
    }
    
    const user = new addUser('AAA', 24);
    
    console.log(user.name);// AAA

    6) 객체 확장 표현식(Enhanced Object property) & 구조 분해 할당(Destructuring assignment)

    (1) 객체 확장 표현식(Enhanced Object property)

    key-value(키 이름과 값) 데이터 형식의 객체를 확장하여 표현 가능.

    객체 내부에서 표현식을 사용하거나 키와 키값을 편리하게 저장할 수 있음.

    ① 객체 변수를 선언 시 키값을 생략하면 자동으로 키의 이름으로 키값을 지정.

    ② 객체 생성 블록안에 대괄호로 묶어 그 안에 표현식을 작성 → 계산된 key 값 사용 가능.

    ③ function 키워드를 생략하여 함수 선언 가능.

    기존의 코드:

    const a = 0;
    const b = 0;
    
    const obj = { a: a, b: b };
    console.log(obj);// { a: 0, b: 0 }const ord = "first";
    const combined = {};
    combined[ord + "Key"] = "value";
    console.log(combined);// { firstKey: 'value' }

    객체 확장 표현식:

    const a = 0;
    const b = 0;
    
    const obj = { a, b };
    console.log(obj);// { a: 0, b: 0 }const ord = "first";
    const combined = { [ord + "Key"]: "value" };
    console.log(combined);// { firstKey: 'value' };

    (2) 구조 분해 할당(Destructuring assignment)

    배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있도록 함.

    구조 분해 할당은 함수 인자값을 다루거나 JSON 데이터 변환할 때 유용하며 전개 연산자와 함께 사용됨.

    ① 배열에서 값을 추출할 때: 인덱스 순서에 맞게 변수 작성

    ② 변수에 =(선언 부호, 할당 연산자)를 함계 사용하여 기본값 할당 가능

    ③ 객체에서 값을 추출할 때 키의 이름과 동일반 변수 이름 사용

    ④ 객체에서 값을 추출할 때 변수에 :(콜론) 부호를 사용하여 새 변수명으로 키값을 할당 가능.

    ⑤ sqap을 간편하게 구현 가능.

    기존의 코드:

    const list = [1, 4];
    const item1 = list[0];
    const item2 = list[1];
    
    const obj = {
        key1: "one",
        key2: "four",
    };
    const key1 = obj.key1;
    const key2 = obj.key2;

    ES6 구조 분해 할당:

    const list = [1, 4];
    const [item1, item2] = list;
    
    const obj = {
        key1: "one",
        key2: "four",
    };
    const { key1, key2, key3 = "eight" } = obj;

    7) 비동기 함수

    (1) 비동기 처리

    작업 시간을 많이 요하는 작업을 처리하는 동안 다른 작업들이 대기 상태인 경우,

    다른 작업들을 먼저 진행하고 오래 걸리는 작업과 그 작업에 관련된 작업을 이후에 처리하는 방식.

    (2) 프로미스(Promise)

    ✍🏻 프로미스의 상태 세 가지

    • 대기중: 결과를 기다리는 중
    • 처리됨 – 이행됨: 수행이 정상적으로 끝남. 결과값을 갖고 있음
    • 처리됨 – 거부됨: 수행이 비정상적으로 끝남.

    ① 프로미스 생성: new 키워드로 생성.

    ② Promise.resolve 생성: 이행됨 상태인 프로미스 생성

    ③ Promise.reject 생성: 거부됨 상태인 프로미스 생성.

    ④ then : 처리됨 상태가 된 프로미스를 처리할 때 사용하는 메소드.

    기존의 비동기 함수:

    function work1(onDone) {
        setTimeout ( () => onDone('작업1 완료.'), 100);
    }
    function work2(onDone) {
        setTimeout ( () => onDone('작업2 완료.'), 200);
    }
    function urgentWork() {
        console.log('긴급 작업');
    }
    
    work1(function(msg1) {
        console.log('done after 100ms: ' +msg1);
        work2(function(msg2) {
            console.log('done after 300ms: ' +msg2);
        });
    });
    urgentWork();

    우선 순위: (setTimeout이 걸려있지 않으므로) urgentWork() > work1 > work2

    지연 작업(work1, work2, …)의 수가 늘어날수록 콜백이 계단으로 형성: 콜백 지옥(callback hell) 발생.

    ✍🏻콜백 지옥(callback hell)

    • 가독성이 떨어짐(코드가 길어진다)
    • 코드 수정이 어려움
    • 비즈니스 로직을 한눈에 알아보기 어려움

    ES6의 비동기 처리:

    const work1 = () =>
        new Promise((resolve) => {
            setTimeout(() => resolve('작업1 완료.'), 100);
        });
    const work2 = () =>
        new Promise((resolve) => {
            setTimeout(() => resolve('작업2 완료.'), 200);
        });
    const urgentWork = () => {
        console.log('긴급 작업');
    }
    
    const nextWorkOnDone = (msg1) => {
        console.log('done after 100ms: ' + msg1);
        return work2();
    }
    work1()
        .then(nextWorkOnDone)
    
        .then((msg2) => {
            console.log('done after 300ms: ' + msg2);
        });
    urgentWork();

    8) 배열 함수

    (1) forEach()

    반복문의 순번(i++)과 배열의 크기를 따로 선언하는 과정을 생략할 수 있음.

    forEach()가 내장함수이므로 속도 부분으로는 for()보다 더 빠르다.

    • 반환값이 없어도 됨
    • 문법
    arr.forEach(callback(currentValue[, index[, array]])[, thisArg])

    • callback: 각 요소를 실행할 함수, currentValue와 index, array 세 가지 매개변수를 받음.



    • currentVaule: 처리할 현재요소



    • index: 처리할 현재 요소의 index.



    • array: forEach()를 호출한 배열.



    • thisArg: callback을 실행할 때 this로 사용하는 값


    forEach()를 사용한 코드(1):

    const arr = [1, 2, 3, 4, 5];
    const odd = [];
    
    arr.forEach(function(num){
        if(num%2 == 1) {
            odd.push(num);
        }
    });
    
    console.log(odd);// [1, 3, 5]

    forEach()를 사용한 코드(2):

    const useQuery = "a=1,b=2,c=3"
    
    function parser(qs) {
    
        const queryString = qs.substr(0);
        const splitedStr = queryString.split(',');//splitedStr=['a=1','b=2','c=3']let result = {};
    
        splitedStr.forEach((str) => {
            const [key, value] = str.split('=');
            result[key]=value;
        });
        return result;
    }
    console.log(parser(useQuery));
    
    // {a: '1', b: '2', c: '3'}

    (2) map()

    배열 요소를 정의된 함수를 통해 새 배열을 만드는 함수.

    ※ 반환값 필요.

    • 문법
    arr.map(callback(currentValue[, index[, array]])[, thisArg])

    • callback: 배열의 모든 요소에 적용되어 새 배열 요소를 생성.



    • currentVaue: callback이 적용될 현재 요소



    • index: 처리할 현재 요소의 index



    • array: map()를 호출한 배열



    • thisArg: callback을 실행할 때 this로 사용하는 값


    map()을 사용한 코드(1):

    const arr1 = [1, 2, 4, 8];
    const doubleArr = numbers.map((arr1) => {
        return arr1 * 2;
    });
    console.log(doubleArr);// [2, 4, 8, 16]

    map()을 사용한 코드(2):

    const useQuery = "a=10,b=20,c=30"
    function parser(qs) {
        const queryString = qs.substr(0);// queryString = a=10,b=20,c=30"const splitedStr = queryString.split(',');// splitedStr = ['a=10', 'b=20', 'c=30']
    
        const result = splitedStr.map((str) => {
            const [key, value] = str.split('=');
            return {key: key, value: value};// {key: 'a', value: '10'}
        });
        return result;
    }
    
    console.log(parser(useQuery));
    
    /* result = [
        {key: 'a', value: '10'},
            {key: 'b', value: '20'},
            {key: 'c', value: '30'}
       ];
    */

    (3) reduce()

    배열의 요소를 순차적으로 순회하며 reducer 함수를 실행하고 하나의 결과값을 반환,

    그 결과값은 객체나 배열, 스트링 등이 될 수 있음

    • 문법
    arr.reduce(callback[, initialValue])

    • callback: 배열의 각 요소에 대해 실행, 네 가지 인수를 받음.



    • accumlator(누적값): 누산기. callback의 반환값을 누적.



    • currentValue(현재값): 처리할 현재 요소



    • currentIndex(현재 인덱스): 처리할 현재 요소의 index(initialValue를 제공한 경우: 0, 아니면 1부터 시작)



    • array(현재 배열): reduce()를 호출한 배열.



    • initialValue(초깃값): callback의 최초 호출에서 첫 번째 인수에 제공하는 값


    🌟 reduce의 accumulator와 currentValue

    ① accumulator(누적값)

    accumulator는 callback의 반환값을 누적하는데, 이 누적값이 없거나 초깃값을 제공한 경우

    initialValue(초깃값)로 시작함.

    ② initialValue(초깃값)

    initialValue를 설정하지 않았을 경우: accumulator가 배열의 0번째 index, currentVaule가 첫 번째 index

    initialValue를 설정한 경우: accumulator가 initialValue, currentVaule가 0번째 index

    즉, reduce가 순회하면서 accumulator에 반환값을 누적시키며 하나의 값을 리턴.

    • 배열이 비어있는데 초깃값을 제공하지 않을 경우: 에러 발생

    reduce()를 사용한 코드(1):

    const arr = [1, 2, 3, 4, 5];
    const initialValue = 0;
    
    const reduceArr = arr.reduce((accumulator, currentValue) =>
        accumulator + currentValue, initialValue
    );
    
    console.log(reduceArr);// 15

    reduce()를 사용한 코드(2):

    const useQuery = "a=1&b=3&c=5"
    function parser(qs) {
        const queryString = qs.substr(0);// queryString = a=1&b=3&c=5"const splitedStr = queryString.split('&');// splitedStr = ['a=1', 'b=3', 'c=5']
    
        return splitedStr
            .map((str) => {
                const [key, value] = str.split('=');
                return {key, value};
            })
            .reduce((result, arr) => {
                result[arr.key] = arr.value;
                return result;
            }, {});
    
    }
    
    console.log(parser(useQuery));
    
    // {a: '1', b: '3', c: '5'}
  • [Java][JavaScript]기본_개념

    프로그래밍 언어의 기초: Java와 JavaScript 개념

    프로그래밍의 가장 기본적인 빌딩 블록인 Java와 JavaScript의 핵심 개념
    변수, 데이터 타입, 그리고 함수가 어떻게 동작하는지 적어봄


    1. Java: 숫자, 문자, 그리고 이스케이프 시퀀스

    Java는 강력하고 안정적인 언어로, 숫자를 다루는 방식과 문자를 표현하는 방식이 명확하게 정의

    숫자와 문자열의 이해

    • 숫자: 따옴표가 없는 숫자는 숫자로 인식
      예를 들어, 123은 숫자로 처리. 나눗셈 연산은 / 기호를 사용
    • 문자(Character): 단일 문자는 작은따옴표로 묶어 표현
      예: ‘한’
    • 문자열(String): 여러 개의 문자가 결합된 것은 큰따옴표로 묶어 표현
      예: "자바 공부"

    이스케이프 시퀀스 활용 💡

    이스케이프 문자(또는 제어 문자)는 인쇄할 수 없거나 키보드로 직접 표현하기 어려운 특별한 문자를 나타낼 때 사용됨.역슬래시()와 하나의 문자가 결합하여 사용된다

    • n: 줄 바꿈 (개행)
    • t: 수평 탭
    • : 역슬래시 자체를 출력
    • ": 큰따옴표를 출력
    • ‘: 작은따옴표를 출력

    예시 코드:

    java
    public class DataType_e {
    public static void main(String[] args) {
    System.out.print("여기는 첫째줄"); // ‘입니다.’와 이어서 출력
    System.out.println("입니다."); // 다음 줄로 넘어감
    System.out.println("여기는 둘째줄n세째줄"); // ‘n’으로 줄 바꿈
    System.out.println("탭t간격"); // ‘t’으로 탭 간격
    System.out.println("역슬래시를 출력: "); // ”으로 역슬래시 출력
    System.out.println("큰따옴표를 출력: "Hello""); // ‘"’으로 큰따옴표 출력
    System.out.println("작은따옴표를 출력: ‘A’"); // ”’으로 작은따옴표 출력
    }
    }


    2. JavaScript: 데이터 추출 및 함수 활용

    JavaScript는 웹 개발의 핵심 언어로, 데이터를 다루는 유연한 방식과 다양한 함수 활용법이 특징

    List와 Object에서 데이터 똑똑하게 꺼내오기

    JavaScript에서 배열(List)과 객체(Object)는 데이터를 구조화하는 데 매우 중요.
    중첩된 데이터에서 원하는 값을 효율적으로 추출하는 방법

    복잡한 List와 Object 데이터 구조는 다음 예시:

    json
    [
    {
    "1번 카테고리 ": [
    { "id": 1, "question": "질문1", "ansewr": "답1" },
    { "id": 2, "question": "질문2", "ansewr": "답2" }
    ]
    },
    {
    "2번카테고리": [
    { "id": 3, "question": "질문3", "ansewr": "답3" },
    { "id": 4, "question": "질문4", "ansewr": "답4" }
    ]
    }
    ]

    이러한 데이터에서 카테고리별 질문과 답을 추출하기 위해 Object.keys()와 map() 같은 메서드를 활용할 수 있음.

    JavaScript 함수 호출의 모든 것

    JavaScript 함수는 특정 작업을 수행하는 코드 블록. 함수의 정의, 호출, 그리고 중요한 개념인 지역 변수

    함수 구문: 함수는 function 키워드, 이름, 그리고 괄호 () 순으로 정의됩니다. 괄호 안에는 매개변수를 포함할 수 있음.

    javascript
    function name(parameter1, parameter2…) {
    // 코드
    }

    함수 호출 및 값 반환: 함수가 return 문에 도달하면 실행이 중지되고, 반환 값이 함수를 호출한 곳으로 전달

    javascript
    let x = myFunction(4, 3); // 함수 호출, 반환 값은 x에 저장

    function myFunction(a, b) {
    return a * b; // 12를 반환
    }
    // 결과값 => 12

    지역 변수: 함수 내에서 선언된 변수는 해당 함수 내에서만 접근 가능함. 이러한 지역 변수는 함수가 시작될 때 생성되고 함수가 완료되면 삭제됨됨

    메서드로 함수 호출: 객체의 속성으로 정의된 함수를 메서드라고 함.

    javascript
    var myObject = {
    firstName: "John",
    lastName: "Doe",
    fullName: function() {
    return this.firstName + " " + this.lastName;
    }
    };
    document.getElementById("demo").innerHTML = myObject.fullName(); // "John Doe" 출력

    함수 생성자로 함수 호출: new 키워드를 사용하여 함수를 호출하는 경우, 이는 생성자로 호출

    javascript
    function myFunction(arg1, arg2) {
    this.firstName = arg1;
    this.lastName = arg2;
    }
    var x = new myFunction("Jane", "Doe"); // 새로운 객체 생성
    // x.firstName은 "Jane", x.lastName은 "Doe"


  • [JavaScript]List와Object_데이터_추출

    JavaScript로 복잡한 데이터 구조 다루기: List와 Object 데이터 추출 전략 💡

    데이터 리스트를 활용하는 방법은 다양하며, 그만큼 잊어버리기 쉬움.
    이 글에서는 List 안에 List 안에 Object 형태의 복잡한 데이터를 추출하는 전략을 다룸


    📚 데이터 구조 이해

    다음과 같은 JSON 형태의 데이터 구조를 예시로 들겠음.
    이는 여러 카테고리를 포함하고, 각 카테고리 안에 질문과 답변 객체 리스트를 가지고 있음

    [
      "1번 카테고리 ": [
        {
          "id": 1,
          "question": "질문1",
          "answer": "답1"
        },
        {
          "id": 2,
          "question": "질문2",
          "answer": "답2"
        }
      ],
      "2번카테고리": [
        {
          "id": 3,
          "question": "질문3",
          "answer": "답3"
        },
        {
          "id": 4,
          "question": "질문4",
          "answer": "답4"
        }
      ],
      "7번카테고리": [
        {
          "id": 25,
          "question": "질문26",
          "answer": "답26"
        },
        {
          "id": 26,
          "question": "질문27",
          "answer": "답27"
        }
      ]
    ]

    위 데이터에서 각 카테고리별 질문과 답변을 추출하는 것이 목표임.

    🔑 카테고리 키 추출하기

    먼저 데이터를 dataList 변수에 담음.
    카테고리 이름을 키로 사용하고 있으므로, Object.keys()map()을 활용하여 키를 추출할 수 있음

    const nameList = Object.keys(dataList[0]).map((data) => (
      <span
        key={data}
        style={{
          display: "inline-block",
          fontSize: "1.5rem",
          fontWeight: "bold",
          padding: "0.25rem 0",
        }}
      >
        {data}
      </span>
    ));

    하지만 위 코드를 바로 실행하면 오류가 발생할 수 있다
    React 환경에서 첫 렌더링 시 dataListundefined로 나올 때가 있어 map() 함수를 실행할 수 없다는 오류가 발생함
    이를 해결하기 위해 if 문을 사용하여 dataList가 정의되었는지 확인하는 조건문을 추가했음

    const nameList = dataList !== undefined ? Object.keys(dataList).map((key, index) => <div key={index}></div>) : null; // 예시 코드, 실제 구현은 위 span 태그를 활용

    결과값: ["1번카테고리", "2번카테고리", ..., "7번카테고리"] 형태로 카테고리 키들이 추출됨


    📝 질문과 답변 데이터 추출하기

    카테고리 키를 추출한 후, 이제 해당 키의 값을 찾아 질문과 답변 데이터를 추출해야 함
    Object.values()와 중첩된 map()을 사용하면 가능함

    const dataDetail = Object.values(dataList[0]).map((data) =>
      data.map((data2) => (
        <div key={data2.id}>
          <p>
            {data2.question} / {data2.answer}
          </p>
        </div>
      ))
    );

    이 코드는 dataList의 값(즉, 각 카테고리의 리스트)을 순회하고,
    각 리스트 내부의 객체(data2)에서 questionanswer 속성을 추출함.

    결과값:
    ["질문1", "답1","질문2","답2"]
    ["질문3", "답3","질문4","답4"]
    ["질문26", "답26","질문27","답27"]
    와 같이 각 카테고리별 질문과 답변 데이터가 추출됨.