맨틀 이야기

자바스크립트와 타이핑(typing) 본문

JavaScript

자바스크립트와 타이핑(typing)

jbilee 2023. 7. 21. 14:14

동적 언어

자바스크립트는 동적 언어라고 한다. 데이터의 타입이 제대로 정의되었는지를 코드가 실행중일 때 확인한다는 것이다. 정적 언어인 C언어나 자바(Java)는 코드를 실행하기 전에 컴파일 단계에서 타입을 확인하기 때문에, 잘못 정의된 타입이 있으면 코드를 컴파일하기 전에 에러가 발생한다. 사전에 타이핑 실수로 인한 코드 오류를 발견할 수 있다.

 

하지만 자바스크립트는 타입 정의를 미리 확인하지 않는다. 따라서 코드 로직에 데이터 타입을 잘못 사용하는 허점이 있으면 자바스크립트 코드가 한창 실행되고 있을 때 에러가 발생하기 십상이다.

 

타입스크립트(TypeScript)

타입스크립트는 자바스크립트도 정적 언어처럼 컴파일할 때 타입 체킹을 할 수 있도록 자바스크립트에 타입을 추가한 언어다. 타입스크립트로 코드를 작성하면 자바스크립트만으로 작성했을 때 발생하는 타입 에러를 최소화할 수 있다. 명확한 타이핑으로 인해 휴먼 에러를 줄이고 디버깅하는 시간을 줄이기 때문에 순수한 자바스크립트보다는 타입스크립트로 작성하는 것이 대중적이다.

 

덕 타이핑(duck typing)

또한 자바스크립트는 덕 타이핑이라는 개념을 통해 객체(object)의 정체성을 결정한다. "오리처럼 생기고, 오리처럼 수영하고, 오리처럼 꽥꽥거리면 그것은 오리일 것이다"라는 문장을 기반으로 해서 덕 타이핑이라고 부른다. 자바스크립트의 객체가 어떤 타입에 속하는지는 그 객체가 갖고 있는 요소(메소드 등)로 인해 판단한다는 뜻이다.

 

각자 다른 요소들을 저장하고 있는 객체일지라도, 그중 동일한 이름의 요소를 갖고 있으면 같은 타입에 속하는 객체인 것으로 간주될 수 있다. 예를 들어서 string과 array는 전혀 다른 데이터 타입이지만, 둘 다 indexOf라는 메소드를 가지고 있기 때문에 아래처럼 코드를 작성해도 에러가 발생하지 않는다.

["abc", ["a", "b", "c"]].forEach((obj) => console.log(obj.indexOf("b"))); // 출력: 1, 1

 

사실 string이 사용하는 indexOf 메소드는 String.prototype에 해당하고, array가 사용하는 indexOf 메소드는 Array.prototype에 정의된 함수지만, 컴퓨터는 그 차이를 문제삼지 않는다. 단순히 해당 객체에게 있는 indexOf라는 메소드를 실행시킬 뿐이다.