ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JavaScript의 자료형과 JavaScript만의 특성은 무엇일까 ?
    Frontend/JavaScript 2022. 7. 20. 03:24

    느슨한 타입(loosely typed)의 동적(dynamic) 언어

    • 정적타입
      - C나 자바 같은 정적 타입 언어는 변수를 선언할 떄 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다. 이를       명시적 타입 선언이라 한다. 

      - 정적 타입 언어는 변수의 타입을 변경 할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당 할 수 있다.

      - 정적 타입 언어는 컴파일 시점에 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.

      - 만약 타입 체크를 통과하지 못했다면 에러를 발생시키고 프로그램의 실행 자체를 막는다. 이를 통해 타입의 일관성을 강제함으로써       더욱 안정적인 코드의 구현을 통해 런타임에 발생하는 에러를 줄인다.
         대표적인 정적 타입 언어로 C, C++, Java, Kotlin, Go, Haskell, Rust, Scala 등이 있다.


    • 동적타입
      javascript는 느슨한 타입(loosely typed)의 동적(dynamic) 언어이다.
      javascript의 변수는 어떤 특정 타입과 연결되지 않으며, 모든 타입의 값으로 할당 및 재할당이 가능하다.
    let foo = 42  // foo가 숫자
    foo = 'bar'   // foo가 이제 문자열
    foo = true    // foo가 이제 Boolean

    예제와 같이 변수의 타입은 언제든지 변경이 가능하다.

    자바스크립트는 정적 타입 언어와 다르게 변수를 선언할 떄 타입을 선언하지 않는다. 자바스크립트의 변수는 정적 타입 언어와 같이 미리 선언한 데이터 타입의 값만 할당할 수 있는 것이 아니다. 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.


    즉, 자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑이라 하며, 자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입언어라 한다. 대표적인 동적 타입 언어로는 javascript, python, PHP, Ruby, Lisp, Perl 등이 있다.

     

    JavaScript 형변환

    자바스크립트의 모든 값은 타입이 있다.

    개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환 or 타입 캐스팅 이라고 한다.

     

    또는 개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동변환되기도 한다.
    이를 암묵적 타입변환 or 타입 강제 변환이라 한다. 

     

     

    - 문자형을 숫자형으로 변환하기

     

    let 변수 = parseInt(문자);    //문자를 정수형 숫자로 변환해줌

    let 변수 = parseFloat(문자);     //문자를 실수형 숫자로 변환해줌

    let 변수 = Nember(문자);    //문자를 정수&실수형 숫자로 변환해줌

     

    - 숫자형을 문자형으로 변환하기

     

    let 변수 = String(숫자);    //숫자를 문자로 변환해줌

    let 변수 = 숫자.toString(진법);    //숫자를 문자로 변환해줌 - 변환하면서 진법을 바꿀 수 있음

    let 변수 = 숫자.toFixed(소수자리수);    //숫자를 문자로 변환해줌 - 실수형의 소수점 자리를 지정할 수 있음

    let 변수 = 숫자 + "문자열";    //숫자와 문자열을 한 문자열로 더해줌

     

     

    ==, ===

    •  == (동등 비교)
        0과 "0"을 같은 값으로 취급한다. (얕은비교)

    •  === (일치 비교)
       0과 "0"을 다른 값으로 취급한다. 데이터가 숫자형과 문자형이기 떄문에.   (깊은비교)

    동등 비교(==) 연산자는 좌항과 우항의 피연산자를 비교할 때 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후 같은 값인지 비교한다. 따라서 동등 비교 연산자는 좌항과 우항의 피연산자가 타입은 다르더라도 암묵적 타입 변환 후에 같은 값일 수 있다면 true를 반환한다.

     

    일치비교(===) 연산자는 좌항과 우항의 피연산자가 타입도 같고 값도 같은 경우에 한하여 true를 반환한다. 즉, 암묵적 타입 변환을 하지 않고 값을 비교한다. 따라서 일치 비교 연산자는 예측하기 쉽다.

     

     

    자바스크립트의 암묵적 타입 변환(implicit coercion)

    자바스크립트의 암묵적인 타입 변환(implicit coercion)은 예상치 못한 타입을 받았을 때 예상 가능한 타입으로 바꿔준다고 생각하면 된다. 그로 인해 사용자는 숫자 값을 넘겨야 하는 곳에 문자열을 넣을 수도 있고, 문자열을 넣어야 하는 곳에 객체를 넘길 수도 있다. 이러한 일이 발생했을 때 자바스크립트 엔진은 사용자가 잘못 넣은 타입을 올바른 타입으로 변환하려고 시도한다. 이는 자바스크립트의 주요한 기능 중하나이며 가장 피해야 할 기능이다.



    느슨한 타입(loosely typed)의 동적(dynamic) 언어의 문제점은 무엇이고 보완할 수 있는 방법에는 무엇이 있을지 생각해보세요.

    동적언어의 특징과 문제점

    동적 타입 언어는 변수에 어떤 데이터 타입의 값이라도 자유롭게 할당할 수 있다. 이러한 동적 타입 언어의 특징은 데이터 타입에 대해 무감각해질 정도로 편리하다는 것이다. 하지만 마냥 편리한 것만은 아니다. 동적 타입 언어 또한 구조적인 단점이 있다. 

    변수 값은 언제든지 변경될 수 있기 떄문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있다. 그뿐만 아니라 변수의 타입이 고정되어 있지 않고 동적으로 변하는 동적타입 언어의 변수는 값의 변경에 의해 타입도 언제든지 변경될 수 있다. 따라서 동적 타입 언어의 변수는 값을 확인하기 전에는 타입을 확신할 수 없다. 

    더욱이 자바스크립트는 개발자의 의도와 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환 되기도 한다. 즉 숫자타입의 변수일 것이라고 예측했지만 사실은 문자열 타입의 변수일 수도 있다는 말이다. 결국 동적 타입 언어는 유연성은 높지만 신뢰성은 떨어진다. 

    이는 잘못된 예측으로 코드를 작성하여 수많은 오류의 늪에서 헤어나오기 힘들 수가 있다.

    이러한 이유로 안정적인 프로그램을 만들기 위해 변수를 사용하기 이전에 데이터 타입을 체크해야 하는 경우가 있는데 이는 매우 번거로울뿐더러 코드의 양도 증가한다. 따라서 변수를 사용할 때에는 항상 주의가 필요하다.

    보완방법 및 주의할 점

    • 변수는 꼭 필요한 경우에 한해 제한적으로 사용한다.
      변수 값은 언제든지 재할당을 통해 변경될 수 있으므로 이로인해 변수의 개수가 많으면 많을수록 오류가 발생할 확률이 높아진다. 그러므로 변수는 최소한으로 유지해주도록 한다.

    • 변수의 유효범위를 최대한 좁게 만들어 변수의 부작용을 억제해야 한다.
      역시나 변수의 범위가 넓을수록 변수로 인해 오류 발생확률만 높아질 뿐이다.

    •  전역변수는 최대한 사용하지 않도록 한다.
      어디서든지 참조/변경이 가능한 전역변수는 의도치 않게 값이 변경될 가능성이 높고 다른 코드에 영향을 줄 가능성도 높다.
    • 변수보다는 상수를 사용하여 값의 변경을 억제한다.

    • 변수 이름은 변수의 목적이나 의미를 잘 파악할 수 있도록 짓는다.
      변수 뿐만 아니라 모든 식별자는 의미파악에 쉽도록 잘 지어야한다. 이는 협업과 생상성 향상에도 많은 도움을 준다.

    또한 코드는 오해가 없도록 작성해야한다. 오해는 협업과 커뮤니케이션을 방해하며 생산성을 떨어뜨리는 대표적인 원인이다. 코드는 개발자를 위한 문서이기도하므로 따라서 사람이 이해할 수 있는 코드, 즉 가독성이 좋은 코드가 좋은코드를 의미한다.

     

     

    undefined와 null의 미세한 차이들을 비교해보세요.
    - null값은 값이 아예 존재하지 않는 값을 말한다. 값이 텅텅 비어 아무 것도 있지않다.
    - undefined값은 변수를 선언하고 값이 할당되지않은 상태를 말한다.

Designed by Tistory.