모던 자바스크립트 Deep Dive 스터디 7일차

김동환·2023년 7월 20일

Learn_JavaScript

목록 보기
9/10
post-thumbnail

7일차 주요 내용 정리


💡 6장 데이터 타입

동적 타이핑

  • 정적 타입 언어에는 C, C++, Java, Kotlin, Go, Haskell, Rust, Scala 등이 있다.
  • 동적 타입 언어에는 Java Script, Python, PHP, Ruby, Lisp, Perl 등이 있다.
  • typeof 연산자는 연산자 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환한다.
    var kim;
    console.log(typeof kim); // undefined
    
    kim = 3;
    console.log(typeof kim); // number
    
    kim = 'Hello';
    console.log(typeof kim); // string
    
    kim = true;
    console.log(typeof kim); // boolean
    
    kim = null;
    console.log(typeof kim); // object
    
    kim = Symbol(); // 심벌
    console.log(typeof kim); // symbol
    
    kim = {}; // 객체
    console.log(typeof kim); // object
    
    kim = []; // 배열
    console.log(typeof kim); // object
    
    kim = function () {}; // 함수
    console.log(typeof kim); // function
  • 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다.(타입 추론 type inference) 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑(dynamic typing)이라 한다.
  • 자바스크립트는 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환되기도 한다. 즉, 숫자 타입의 변수일 것이라고 예측했지만 사실은 문자열 타입의 변수일 수도 있다는 말이다.
  • 결국 동적 타입 언어는 유연성(flexibility) 신뢰성(reliability)은 떨어진다.

컴퓨터가 이해하는 코드는 어떤 바보도 쓸 수 있다. 하지만 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 쓴다. - 마틴 파울러 ”리팩토링”의 저자


💡 7장 연산자

연산자

  • 연산자는 하나 이상의 표현식을 대상으로 산술, 할당, 비교, 논리, 타입, 지수 연산(operation) 등을 수행해 하나의 값을 만든다.
    // 산술 연산자
    5 * 4 // -> 20
    
    // 문자열 연결 연산자
    'My name is ' + 'Kim' // -> 'My name is Kim'
    
    // 할당 연산자
    color = 'red' // -> 'red'
    
    // 비교 연산자
    3 > 5 // -> false
    
    // 논리 연산자
    true && false // -> false
    
    // 타입 연산자
    typeof 'Hi' // -> string

산술 연산자

  • 산술 연산자(arithmetic operator)는 피연산자를 대상으로 수학적 계산을 수행해 새로운 숫자 값을 만든다. 산술 연산이 불가능한 경우, NaN을 반환한다.
  • 산술 연산자는 피연산자의 개수에 따라 이항 산술 연산자와 단항 상술 연산자로 구분할 수 있다.

이항 산술 연산자

  • 모든 이항 산술 연산자는 피연산자의 값이 바뀌는 경우는 없고 언제나 새로운 값을 만들 뿐이다.
    이항 산술 연산자의미부수 효과
    +덧셈X
    -뺄셈X
    *곱셈X
    /나눗셈X
    %나머지X
    5 + 2; // -> 7
    5 - 2; // -> 3
    5 * 2; // -> 10
    5 / 2; // -> 2.5
    5 % 2; // -> 1

단항 산술 연산자

  • 단항 산술 연산자는 1개의 피연산자를 산술 연산하여 숫자 값을 만든다.
    단항 산술 연산자의미부수 효과
    ++증가O
    감소O
    +어떠한 효과도 없다. 음수를 양수로 반전하지도 않는다.X
    -양수를 음수로, 음수를 양수로 반전한 값을 반환한다.X
  • 주의할 점은 이항 산술 연산자와는 달리 증가/감소(++/—) 연산자는 피연산자의 값을 변경하는 부수 효과가 있다는 것이다.
    var x = 1;
    
    // ++ 연산자는 피연산자의 값을 변경하는 암묵적 할당이 이뤄진다.
    x++; // x = x + 1;
    console.log(x); // 2
    
    // --연산자는 피연산자의 값을 변경하는 암묵적 할당이 이뤄진다.
    x--; // x = x - 1;
    console.log(x); // 1
  • 증가/감소(++/—) 연산자는 위치에 의미가 있다.
    • 피연산자 앞에 위치한 전위 증가/감소 연산자(prefix increment/decrement operator)는 먼저 피연산자의 값을 증가/감소시킨 후, 다른 연산을 수행한다

    • 피연산자 뒤에 위치한 후의 증가/감소 연산자(postfix increment/decrement operator)는 먼저 다른 연산을 수행한 후, 피연산자의 값을 증가감소시킨다.

      var x = 5, result;
      
      // 선할당 후증가(postfix increment operator)
      result = x++;
      console.log(result, x); // 5 6
      
      // 선증가 후할당(prefix increment operator)
      result = ++x;
      console.log(result, x); // 7 7
      
      // 선할당 후감소(postfix decrement operator)
      result = x--;
      console.log(result, x); // 7 6
      
      // 선감소 후할당(prefix decrement operator)
      result = --x;
      console.log(result, x); // 5 5
  • 숫자 타입이 아닌 피연산자에 + 단항 연산자를 사용하면 피연산자를 숫자 타입으로 변환하여 반환한다. 이 때 피연산자를 변경하는 것은 아니고 숫자 타입으로 변환한 값을 생성해서 반환한다. 따라서 부수 효과는 없음
    var x = '1';
    
    // 문자열을 숫자로 타입 변환한다.
    console.log(+x); // 1
    // 부수 효과는 없다.
    console.log(x); // "1"
    
    // 불리언 값을 숫자로 타입 변환한다.
    x = true;
    console.log(+x); // 1
    // 부수 효과는 없다.
    console.log(x); // true
    
    // 불리언 값을 숫자로 타입 변환한다.
    x = false;
    console.log(+x); // 0
    // 부수 효과는 없다.
    console.log(x); // false
    
    // 문자열을 숫자로 타입 변환할 수 없으므로 NaN을 반환한다.
    x = 'Hello';
    console.log(+x); // NaN
    // 부수 효과는 없다.
    console.log(x); // "Hello"
  • 단항 연산자는 피연산자의 부호를 반전한 값을 반환한다. + 단항 연산자와 마찬가지로 숫자 타입이 아닌 피연산자에 사용하면 피연산자를 숫자 타입으로 변환하여 반환한다. 이때 피연산자를 변경하는 것은 아니고 부호를 반전한 값을 생성해 반환한다. 따라서 부수 효과는 없다.
    // 부호를 반전한다.
    -(-10); // -> 10
    
    // 문자열을 숫자로 타입 변환한다.
    -'10'; // -> -10
    
    // 불리언 값을 숫자로 타입 변환한다.
    -true; // -> -1
    
    // 문자열은 숫자로 타입 변환할 수 없으므로 NaN을 반환한다.
    -'Hello'; // -> NaN

문자열 연결 연산자

  • +연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작한다. 그 외의 경우는 산술 연산자로 동작한다.
    // 문자열 연결 연산자
    '1' + 2; // -> '12'
    1 + '2'; // -> '12'
    
    // 산술 연산자
    1 + 2; // -> 3
    
    //true는 1로 타입 변환된다.
    1 + true; // -> 2
    
    // false는 0으로 타입 변환된다.
    1 + false; // -> 1
    
    // null은 0으로 타입 변환된다.
    1 + null; // -> 1
    
    // undefined는 숫자로 타입 변환되지 않는다.
    +undefined; // -> NaN
    1 + undefined; // -> NaN
    • 여기서 주목할 것은 자바스크립트 엔진은 암묵적으로 불리언 타입의 값인 true를 숫자 타입인 1로 타입을 강제로 변환한 후 연산을 수행한다. 이를 암묵적 타입 변환(implicit coercion) 또는 타입 강제 변환(type coercion)이라고 한다.
profile
프론트엔드 개발자

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

정말 잘 읽었습니다, 고맙습니다!

답글 달기