I code, therefore I exist.

웹 프론트 엔드 개발을 공부하고 있는 Ocean이라고 합니다. 만나서 반갑습니다.

ETC/개발 서적

(후기) 타입으로 견고하게, 다형성으로 유연하게

Ocean 2024. 9. 21. 22:34

 

이 책을 선택한 이유는?

 

본격적인 타입스크립트 학습에 앞서, 타입스크립트의 필요성이 대두된 보다 근본적인 이유가 궁금했습니다. 깊게 배운 언어가 Js뿐이기 때문에 정적 타입 언어가 낯설었고, 기존의 Js만으로도 크게 문제 없이 개발을 할 수 있으니 추가적으로 타입을 명시하는 행위가 크게 와닿지 않았어요. 그러한 궁금증에 답이 될까 싶어서 해당 저서를 선택하게 되었습니다.

이 책의 주요한 특징으로는 어떠한 정적 타입 언어의 국한된 기술서와 같은 것이 아닙니다. 정적 타입 언어의 필요성과 특징들을 알기 쉽게 전달하는 개념서에 가까워요. 그래서 정적 타입 언어의 기능(타입 추론, 제네릭 등)들을 다양한 언어로 예시를 들어서 설명합니다. 타입스크립트 만을 위한 저서는 아니지만 타입스크립트의 예시도 많이 등장하기 때문에 도움이 많이 될 것 같았어요.

동적 타입 언어와 정적 타입 언어의 차이?

 

먼저 동적 타입과 정적 타입의 차이를 알아볼게요.

동적 타입 언어와 정적 타입 언어의 차이는 식별자의 데이터 타입이 결정되는 시점에 따라서 구분됩니다.

동적 타입 언어 - 식별자의 데이터 타입이 런타임 시점에 결정, 변수 선언 시 타입 미지정 (Javascript, Python, Ruby)
정적 타입 언어 - 식별자의 데이터 타입이 컴파일 시점에 결정, 변수 선언 시 타입 명시 (C, C++, Java, Typescript)

 

 * 컴파일 시점 : 소스 코드가 컴파일러에 의해 기계어 코드로 변환되는 단계, 소스 코드를 읽고 분석하여 오류를 발견하고 최적화를 수행한 후 실행 가능한 바이너리 파일 또는 중간 코드로 변환합니다.

 * 런타임 시점 : 프로그램이 실행되는 단계로, 컴파일된 코드가 실제로 수행되는 시점을 말합니다. 이 단계에서는 프로그램이 메모리에 로드되고 CPU를 통해서 실행됩니다.

 

이 두 가지 차이로 인해서 두 타입의 언어의 특징이 나타납니다.

 

동적 타입 언어와 정적 타입 언어의 특징

 

동적 타입 언어 (유연성) - 변수를 선언할 때 타입을 미리 정의하지 않아도 되기 때문에, 개발 속도가 빠르며 초기 설정이 간단합니다.

정적 타입 언어 (안정성) - 변수나 함수에 타입을 명시하여 타입 관련 오류를 컴파일 시점에 미리 잡아낼 수 있어 프로그램이 예측 가능하고 안전하게 동작합니다.

 

정적 타입 언어의 필요성!

 

어떠한 프로그램을 개발할 때, 정적 타입 언어를 선택하는 골자는 바로 정적 타입 언어의 안정성 때문입니다. 가장 근본적인 목적은 버그를 찾아내고, 수정하기 위한 것이라고 심플하게 정의할 수 있습니다.

 

버그란 프로그램이 개발자의 의도와 다르게 동작하는 모든 경우를 말합니다. 처음부터 버그가 없는 프로그램을 만들기란 불가능에 가깝고, 개발자는 자신의 프로그램에서 끊임없이 버그를 찾고 고쳐야 하는데, 버그를 고치는 것도 문제이지만, 더 중요한 것은 버그를 찾아내는 것 입니다.

규모가 큰 프로그램에서 발생 가능한 모든 버그를 시뮬레이션 해보기란 어려운 일이고, 수천 혹은 수만줄의 코드 속에서 버그를 추적하는 일 또한 굉장히 어려운 일입니다. 정적 타입 언어는 식별자의 타입을 명확히 명시하기 때문에 동적 타입 언어 보다 이러한 버그 트랙킹을 편리하게 도와줍니다.

자바스크립트로 비유 했을 때, 타입이 문자열인 경우 해당 문자열의 문자들을 모두 대문자로 바꾸는 toUpperCase란 메소드를 사용할 수 있습니다. 만약 Boolean 값 true 문자열 값 'true'를 개발자가 헷갈려서 true.toUpperCase()를 호출 한다면, Boolean 타입의 값인 true는 해당 메소드를 포함하고 있지 않기 때문에 타입 에러를 발생 시킵니다. 하지만 Js로 작성된 프로그램에서 해당 코드를 사용자가 실행하기 전 까지는 해당 버그를 발견할 수가 없습니다. 개발자들이 QA 기간에 해당 버그를 발견하지 못하고 배포 됐을 때 어떤 사용자가 해당 부분을 실행하여 프로그램이 마비된다면 큰 문제가 발생하겠죠? 

정적 타입 언어는 이러한 타입 에러를 컴파일러가 실행 전에 체크하여 다분히 발생할 수 있는 버그들의 숫자를 현저히 줄일 수 있게 해줍니다.

 

정적 타입 언어(Typescript)의 추가적인 이점!

 

위의 가장 중요한 안정성에서 연장되어 추가적인 이점들이 더 있습니다.

 

1. 자동 완성 : VSC와 같은 IDE, 코드 에디터에게 타입 정보를 알려주기 때문에 자동 완성 기능을 제공합니다. 

2. 즉각적인 오류 검출 : 코드 작성 중에 타입 오류가 있으면 IDE에서 즉시 피드백을 받을 수 있어, 문제를 빠르게 파악하고 수정 할 수 있습니다.

3. 명확한 코드 문서화 : 타입 명시가 들어가기 때문에 코드 자체가 문서 역할을 할 수 있습니다. 협업 시나 미래의 자신이 코드를 읽을 때 조금 더 가독성이 늘어날 수 있고, 결과적으로 유지보수 비용이 절감될 수 있습니다.

 

안정성과 위의 장점들이 더해져서 대규모 프로젝트나 장기적인 유지보수가 필요한 프로그램에서 널리 사용되는 것 같습니다.

 

 아 이래서 타입스크립트를..

 

정적 타입 언어의 장점은 정말 다양한 것 같습니다. 처음에는 자바스크립트에 타입을 명시하는 것이 불필요한 리소스 낭비처럼 느껴졌지만, 조금 번거롭더라도 타입을 명시함으로써 이후 유지보수 시 많은 리소스를 절약할 수 있다는 점을 깨달았어요.

앞으로 타입스크립트를 사용할 때, 이런 이점을 염두에 두고 개발하면 더 좋은 결과를 낼 수 있을 것 같습니다 :)

이 책은 정적 타입 언어와 동적 타입 언어의 차이, 정적 타입 언어의 필요성과 장점을 시작으로, 정적 타입 언어가 제공하는 다양한 기능과 그 활용법을 코드와 그림을 통해 설명합니다. 타입 추론을 시작으로, 타입의 집합으로 만들어지는 다형성, 제네릭, 타입 클래스, 카인드 등 타입스크립트에서 제공하는 여러 기능을 다루고 있어, 웹 개발자이면서 타입스크립트를 깊이 있게 공부하고 싶은 분들께 추천드리고 싶은 책입니다.

 

 

PS. 어려운 개념이 많아서 완독하는 게 힘들었습니다.. 특히 함수 타입의 공변성과 반공변성.. 그리고 제네릭 파트.. 이런 부분은 다독하면서 개념을 익혀가는 게 좋을 것 같네요..주니어 개발자 여러분 모두 파이팅입니다..ㅎㅎ :)