[JS-DSAA] 02 자바스크립트의 독특한 특징

백은진·2021년 5월 1일
0

책과 함께하는 공부

목록 보기
10/22

자바스크립트 언어 특징

객체지향 프로그래밍은 클래스 기반과 프로토타입 기반으로 나눌 수 있다.

클래스 기반 언어(Java, C++, C#, Python, PHP, Ruby, Object-C)는 클래스로 객체의 자료구조와 기능을 정의하고 생성자를 통해 인스턴스를 생성한다.

자바스크립트는 (멀티 패러다임 언어로) 명령형, 함수형, 프로토타입 기반의 객체지향 언어다.

동시에 동적 인터프리터 프로그래밍 언어이기 때문에 전통적인 객체지향 프로그래밍 언어들과 구문이 다르다.

동적언어(동적타입) vs 정적언어(동적타입)

동적언어

동적언어는 프로그램 실행 시 자료형을 결정한다. 대표적인 언어로 JavaScript, Ruby, Python, PHP가 있다. 변수 선언 시 자료형 지정이 필요하지 않다. 실행 시 예상치 못한 자료형이 변수에 지정될 때, 타입 에러가 발생할 수 있다.

정적언어

정적언어는 컴파일 시에 자료형을 결정한다. 대표적인 언어로 C, C#, C++, Java가 있다. 변수 선언 시 자료형을 함께 지정해주어야 한다. 컴파일 시 자료형과 다른 값이 변수에 지정되어있으면, 컴파일 에러가 발생한다.

타입스크립트는?

자바스크립트에 필수로 타입을 지정해 작성하는 타입스크립트는 정적언어로 분류된다.

또한 자바스크립트가 스크립트 언어인 반면, 타입스크립트는 컴파일 언어이다. (단, 전통적인 컴파일 언어와 다르게 linking 과정이 생략된다.)

variable hoisting

변수 선언 시 변수가 가지는 범위는 다음과 같다.

선언 범위 연산자 없이 전역 var 가장 가까운 함수 내 let, const 가장 가까운 블록 내

등가와 자료형

자바스크립트에는 boolean, number, string, undefined, object, junction, symbol 등 총 7가지의 자료형이 있다. (undefined도 '자료형'이라는 게 신기하다.)

값이 할당되지 않은 채 선언된 변수에는 undefined가 할당된다.

자바같은 stringly typed(강 자료형) 언어는 java.lang.Object.equals(Object obj) 같은 메소드를 사용해 두 객체가 동일한지 확인한다. 반면 자바스크립트는 등가 연산자나 기본제공 메소드로 두 객체가 동일한지 확인하기 어렵기 때문에 보통 lodash나 underscore같은 유틸리티 라이브러리를 사용하여 판별한다.

(등가 연산자로 비교할 수 없는 이유는 동일한 속성과 값을 지닌 두 객체의 변수가 같은 메모리 주소를 바라보고 있지 않기 때문이다. 등가 연산자는 메모리주소가 같은지를 비교한다.)

위의 두 라이브러리는 isEqual(obj1, obj2) 함수를 제공한다. 이 함수는 속성 기반 등가 비교 방식으로, 객체의 각 속성을 비교한다. 해당 함수는 아래 함수와 비슷하게 작동한다.

function isEquivalent(a, b) {
  var aProps = Object.getOwnPropertyNames(a);
  var bProps = Object.getOwnPropertyNames(b);

  if (aProps.length != bProps.length) {
    return false;
  }
  
  for (let i=0; i < aProps.length; i++) {
    var propName = aProps[i];
    
    if (a[propName] !== b[propName]) {
      return false;
    }
  }
  return true;
}

isEquivalent({'hi': 'a'}, {'hi': 'a'}); // true

let obj1 = {'prop1': 'test', 'prop2': function(){}};
let obj2 = {'prop1': 'test', 'prop2': function(){}};

isEquivalent(obj1, obj2); // false

다만, 함수나 배열도 단순히 등가 연산자를 이용해 동일한지 확인할 수 없기 때문에 isEquivalent(obj1, obj2)은 false를 출력한다. (함수와 배열도 객체의 일종이기 때문이다.)

객체를 spread 연산자로 복사할 경우, 객체 내의 키밸류 값은 같은 메모리 주소를 바라보고 있다. (=얕은 복사) 만약 다른 메모리 주소를 바라보게 하고 싶다면, lodash 라이브러리 등의 클론 메서드 등을 사용하여 깊은 복사를 하면 된다.

profile
💡 Software Engineer - F.E

0개의 댓글