최종 수정 : 2024-05-27
타입 검사 훑어보기
사실 타입 검사는 불편한 게 맞다. 하지만 그 불편을 감수하면서도 사용할 만큼 큰 가치가 있다.
버그의 가장 흔한 원인은 '타입 오류(type error)'이다. 그러나 모든 버그의 원인은 아니다. 이들은 타입 검사기로 찾을 수 없다.
그렇다면 다른 원인들에는 무엇이 있는가?
1) 타입이 맞아도 실패할 수 있는 계산
ex) 나눗셈
2) 널 접근(null dereference)
타입 검사의 역할은 무엇인가?
프로그램이 실행되기 전에 타입 검사를 통해, 버그 가능성을 줄이는 것
런타임 오류를 최소화하는 것
정적 타입 언어와 동적 타입 언어의 구분점은 무엇인가?
타입 검사를 실행하는가
정적 타입 언어의 장점은 무엇인가? == 타입 검사의 장점
타입 오류를 빠트리지 않고 모두 찾을 수 있다
타입 검사기의 오류 메시지 덕분에 코드를 올바르게 고치기 쉽다.
+
코드 편집기의 기능을 보조하여 개발자의 생산성을 높인다(자동 완성 기능 + 이름 바꾸기 기능)
프로그램 성능이 향상된다. 동적 타입 언어는 값에 대한 타입을 부여하고 프로그램을 실행한다.
정적 타입 언어의 단점은 무엇인가?
1) 타입 표시 - 타이핑이 많아지고 코드가 길어진다.
--> 그러나 마냥 나쁘기만 한 것은 아니다. 코드에 더 많은 정보를 담음으로써 코드 가독성을 높인다. 주석이라는 다른 대안도 있지만, 주석은 그때그때 바꿔줘야 한다는 불편함과 주석을 바꾸지 않을 경우, 주석이 틀렸다는 사실을 발견할 때까지 틀린 채로 남아 있어야 한다. 그러나 타입 표시는 바로 반영되므로, '절대 낡지 않는 주석'인 셈이다.
이에 대해, '타입 추론'이라는 좋은 방법도 있다. 그러나 사용 중인 언어가 어디까지 타입을 추론해 주는지는 알아야 한다. 언어마다 제공하는 타입 추론의 범위가 다르기 때문이다.
Q. 타입스크립트의 타입 추론 범위는 어디까지인가?
1) 변수 선언
2) 구조 분해 할당
3) 함수의 반환값
4) 기본값이 설정된 매개변수
2) 타입 검사기가 '거부'라고 틀리게 말하는 경우
--> 꽤 치명적인 단점이다. 게다가 이 단점은 절대로 완벽하게 해결할 수 없다. 그렇다고 아무런 방법이 없는 것은 아니다. 단점을 최대한 작게 만드는 방법들이 존재한다.
Q. 이때는 어떻게 해야 하는가?
1. 안전한 기능 : ex) 다형성
2. 위험한 기능 : ex) 타입스크립트의 타입 단언
- 타입 검사를 무력화시키며, 타입 검사의 원칙을 아예 파괴해 버린다.
- "네게는 타입 오류가 일어날 수 있겠다고 보일지 몰라도, 내가 보기에는 타입 오류가 절대 일어날 수 없어. 나를 믿고 그냥 '통과'라고 출력해"라고 말하는 것과 같다.
- 사용하지 않는 것이 바람직 하다. 이는 타입 검사가 제공하는 가장 큰 이점을 스스로 포기하는 행위이기 때문이다.
다형성(polymorphism)
타입 검사기의 오판을 줄이는 안전한 기능의 대부분을 차지하는 개념이다. 프로그램의 한 '개체'가 여러 타입에 속하게 만든다. 또한 거의 모든 정적 타입 언어에서 발견할 수 있는 개념이다. 타입 안정성을 해치지 않으면서도 타입 검사기의 오판을 획기적으로 줄이며, 개발자가 쉽게 이해할 수 있는 오류 메시지를 제공한다.
따라서, 다형성이 널리 사용되는 만큼 제대로 이해한다면 타입 관련 기능을 대부분 이해한 것과 다름 없다. 이는 정적 타입 언어 전문가라 말할 수 있게 된다.
개체?
1) 값, 함수, 클래스, 메서드 등 여러 가지가 될 수 있다.
2) 하나의 값이 여러 타입에 속할 수도 있고, 한 함수를 여러 타입의 함수로 사용할 수도 있는 것을 의미한다.
종류
어떤 개체에 다형성을 부여하는지, 어떻게 다형성을 부여하는지에 따라 나눈 것이다.
A. 서브타입에 의한 다형성
B. 매개변수에 의한 다형성
C. 오버로딩에 의한 다형성
'코드잇 스프린트 6기 > TS_Study Together' 카테고리의 다른 글
매개변수에 의한 다형성 - 제네릭 함수 / 제네릭 타입 (1) | 2024.06.08 |
---|---|
질문 모음 (0) | 2024.05.30 |
[타입으로 견고하게 다형성으로 유연하게] 서브타입에 의한 다형성 (0) | 2024.05.28 |
[타입으로 견고하게 다형성으로 유연하게] 시작하며 (0) | 2024.05.27 |
TypeScript 스터디 모집 글 (0) | 2024.05.19 |
댓글