타입을 이용하여 안전한 코딩을 위한 Type-Driven Development
(kciter.so)- 타입은 함수와 데이터가 준수해야 하는 엄격한 계약
- 타입은 어떠한 값이 속할 수 있는 집합
- 타입은 함수를 통해 변환될 수 있고 이를 통해 범위가 변경 될 수 있다
- 단사 함수 - 범위가 작은 타입에서 큰 타입으로 변환하는 것
- 전사 함수 - 범위가 큰 타입에서 작은 타입으로 변환하는 것
- 전단사 함수 - 일대일로 대응
- 로직의 입력과 출력을 타입으로 나타낼 수 있음
- 이말은 타입을 통해 로직을 추상화 하는 것이 가능하다는 것
- 입력과 출력을 타입으로 나타내고 이를 통해 로직을 설계할 수 있다
- 기본 데이터 타입에 이름을 붙여 다른 타입으로 구분할 수 있음
- 타입 시스템을 활용하면 여러 문제를 해결할 수 있음
- 제네릭을 이용한 일반화
- 팬텀 타입을 이용한 범위 제한
- 유니온 타입(혹은 합타입)을 이용한 행동 제한
- 최소 타입을 이용한 TODO 처리
- 타입을 이용한 유한 상태 머신 구현
- 의존 타입을 이용한 검증
- 타입 주도 개발은 타입을 먼저 정의하고 이를 통해 코드를 작성하는 방법론
- 타입 주도 개발은 원한다면 어디에도 적용할 수 있으며 각 절차에 대한 결과를 타입으로 정의하는 것으로 시작
- 요구사항을 분석할 때 타입으로 추상화 해볼 것
- 같은 기본 데이터 타입이더라도 의미가 다르다면 이를 구분하기 위해 다른 타입으로 정의하는 것이 좋음
- 요구사항을 분석하고 타입을 생각했다면 로직을 타입으로 추상화해볼 것
-
(String) -> List<Token>
과 같은 느낌으로 추상화 가능
-
- 타입 주도 개발은 테스트 주도 개발과 어울림
- 입력과 출력 결과를 미리 정의하고 코드를 작성한다는 점에서 타입 주도 개발과 테스트 주도 개발은 유사
- 타입 주도 개발이 타입 시스템을 이용하여 컴파일 시간에 미리 안정성을 체크할 수 있다면 테스트 주도 개발은 타입만으로는 잡아낼 수 없는 오류나 예외 상황을 테스트 코드를 통해 잡아낼 수 있음
- 설계자의 입장에 타입 시스템을 활용한다는 것은 다른 개발자를 위한 코드 규칙을 만드는 것과 같음
- 다만 일일히 타입의 정의하여 타입이 너무 많아지거나 타입의 정의가 복잡해지면 오히려 코드를 작성하기 힘들어지거나 가독성을 떨어뜨릴 수 있기에 항상 적절한 상태를 유지하는 것이 중요
단사 함수는 변환된 값의 집합이 공역과 치역이 일치하지 않는 경우를 말한다. 이를 조금 더 단순하게 표현하면 범위가 작은 타입에서 큰 타입으로 변환하는 것을 말한다.
단사 함수란 임의의 서로 다른 두 변수의 상이 서로 다른 함수를 가리킵니다. 즉, 단사 함수 f
의 정의역 X
에 속하는 모든 원소 a
와 b
에 대해, a ≠ b
이면 f(a) ≠ f(b)
입니다. 한국 고교 수학에서 '일대일 함수'라고 부르는 것이 단사 함수입니다.