본문 바로가기
front/기타

[The Basics] Static type-checking

by juniKang 2022. 5. 11.

자바스크립트의 모든 값들은 각각 다른 작업을 수행할 수 있는 기능의 집합을 가지고 있다. 추상적이게 들리지만, 간단안 예제로, message 라고 이름 붙인 변수를 실행해서 일어나는 일을 살펴보자.

// 'message'에 있는'toLowerCase' 프로퍼티에 접근해서
// 호출한다.
message.toLowerCase();

// 'message'를 호출한다.
message();

이걸 한줄씩 실행하면, 코드의 첫번째 줄을 toLowerCase라는 프로퍼티에 접근해서 호출한다. 두번째는 message를 직접 호출하는걸 시도한다.

 

하지만 우리는 meesage의 값을 추론할 수 없다. -이런일이 흔하다- 우리는 이 코드가 실행해서 나오게 될 결과를 확실하게 단정지을 수 없다. 각 작업의 동작은 전적으로 처음부터 가진 값에 달려있다.

- message가  호출가능한지

- toLowerCase라고 불리는 프로퍼티가 있는지

- 있다면, toLowerCase가 호출가능한지

- 이 값들이 호출가능하다면, 무엇을 리턴하는지

이런 질문의 답은 우리가 자바스크립트를 작성할때 염두해 둬야 할 것들이다. 그리고, 모든 세부사항들이 맞기를 바라야 한다.

 

다음과 같은 방법으로 message지 정의되었다고 가정해보자.

const message = "Hello World!";

아마 추측대로, message.toLowerCase()를 실행하면, 소문자로 출력된 문자열을 얻을 것이다.

두번쨰 줄은 어떨까? 자바스크립트에 친숙하다면, 아래 예외를 담은 실패를 알것이다:

TypeError: message is now a function

이런 실수를 피할 수 있다면 얼마나 좋을까.

 

우리 코드를 실행할 때, 자바스크립트 런타임이 어떤 일을 수행할지 선택하는 방식은 값의 타입에 의해 정해진다 - 어떤 종류의 동작이나 능력을 가지고 있는지. 그것이 TupeError가 암시하는 것의 일부분이다 - 이건 말한다. string "Hello World"는 함수로 호출될 수 없다고.

 

기초 요소인 string이나 number 같은 몇몇 값들을 우리는 typeof 식별자를 사용해서 런타임에 타입을 식별할 수 있다. 함수와 같은 다른 것들을 위해, 타입을 식별하는 런타임 메카니즘에 상응하는게 없다. 예를들면, 이 함수를 보라:

function fn(x) {
  return x.flip();
}

 

코드를 읽음으로써, 호출가능한 flip 프로퍼티가 있는 객체가 주어진 경우에만 이 함수가 동작한다는 것을 관찰할 수 있지만, 자바스크립트는 코드가 동작하는 동안 우리가 확인할 수 있는 방식으로 이 정보를 노출시키지 않는다(doesn't surface). fn이 어떤 특정 값을 가지고 있는지 순수 자바스크립트가 알려줄 수 있는 유일한 방법은 호출하고 무슨일이 일어나는지 지켜보는 것이다. 이런 방식은 실행하기 전에 코드가 무엇을 할지 예측하기 어렵게 하고, 그건 즉, 코드를 작성하는 동알 코드가 무엇을 할 것인지 알기 더 어렵다는 것이다.

 

이렇게 보면, 타입은 어떤 값이 fn으로 넘겨지고 무엇이 안되는지 묘사의 개념이다. 자바스크립트는 오직 다이나믹 타이핑을 제공한다. - 무슨일이 일어나는지 보기위해 코드를 실행해야 하는.

 

대안책은 코드가 실행하기 전에 무엇이 기대되는지 예측하도록 만드는 정적인 타입 시스템을 사용하는 것이다.

 

정적인 타입 체킹 (Static type-checking)

string을 함수로 호출을 시도했을 때 받았던 TypeError로 돌아가서 생각해보자. 대부분의 사람들은 코드를 실행중일 때 모든 종류의 에러를 받는걸 싫어한다.  - 벌레들처럼 여겨진다! 새로운 코드를 쓸 때, 새로운 버그가 나타나는걸 피하기 위해 최선을 다한다.

 

우리가 약간의 코드를 추가할 때, 우리 파일을 저장하고, 코드를 다시 실행하고, 즉시 에러를 본다. 우리는 아마도 문제를 빠르게 격리시킬 수 있다; 하지만 항상 이런 건 아니다. 기능을 철저하게 테스트하지 않았을 수도 있고, 던져질 잠재적인 에러가 실제 실행시에 발생하지 않을 수도 있다. 또는 만약 우리가 운좋게 그 그 에러를 목격한다면(to witness the error), 결국(might have ended up) 큰 리팩토링을 하고, 어쩔수 없이 파헤쳐야만 하는 많은 다른 코드를 추가해야 할지도 모른다.

 

이상적으로, 우리 코드가 실행되기 전에 이런 버그들을 찾아서 우리를 도와줄 도구를 사용할 수 있다. 타입스크립트와 같은 정적인 타입 체커가 그것이다. 정적 타입 시스템은 프로그램을 실행할때 우리값들이 될 수 있는 모양과 동작을 설명한다. 타입 스크립트와 같은 타입 체커는 정보를 사용해서 문제가 발생할 시키를 우리에게 알려준다. 

 

const message = "hello!";

message();
//This expression is not callable.
//  Type 'String' has no call signatures.

타입스크립트로 작성된 마지막 예제 실행은 우리에게 코드를 처음 실행하기 전에 에러메시지를 준다.

 

'front > 기타' 카테고리의 다른 글

[rollup.js]Introduction  (0) 2022.07.27
인터페이스 개발  (0) 2022.07.22
비폭력대화 NVC  (0) 2022.05.16
[The Basics] Types for Tooling  (0) 2022.05.13
[자바스크립트] 계층형 객체 깊이 구하기  (0) 2022.05.12

댓글