프로그래밍 언어 - Data Type
프로그래밍 언어 - Data Type
💫 데이터 타입 - Data Type
데이터 값의 모임
과 그 값에 대한사전 정의 연산
들의 집합i.e.
int
- 데이터 값의 모임: -2,147,483,648 ~ 2,147,483,647
- 정의된 연산: +, -, * , /, …
🫧 프로그래밍 언어가 어떤 타입을 제공하는가?
- 프로그래밍 작업을 용이하게 수행할 수 있는 정도를 결정하는 중요한 요소
- 실세계에 속한 객체들과 잘 매칭되는 데이터 타입들을 많이 제공하는 것이 중요
- 초기 아주 적은 수의 데이터 타입만 제공
- i.e. 초기 Fortran, 연결 리스트와 트리를 포인터 없이 배열을 이용하여 구축
시간이 흐름에 따라 데이터 타입에 대한 개념은 계속 발전
- i.e. ALGOL 60
- 사용자 정의 타입 제공
- 프로그래머가 필요에 따라서 데이터 구조를 설계하는 것을 허용
- 기본 타입과 유연한 구조 정의 연산자 제공
- 타입에 대해 의미 있는 이름 사용은 가독성을 향상
- 타입 검사 허용 및 프로그램의 수정에 도움
- 향후 추상 데이터 타입에 영향
- 사용자 정의 타입 제공
🫧 프로그래밍 언어의 타입 시스템
- 타입이 언어의 각 식에 어떻게 연관되는지를 정의, 타입 동등성과 타입 호환성의 규칙을 포함
- 역할
- 오류 탐지
- 프로그램 모듈화를 위한 지원
- 문서화
- 프로그램에서 타입의 선언은 그 데이터에 관한 정보를 문서화 하는 것
🫧 구조화된 데이터 타입
- 명령형 언어에서 제공되는 구조화 데이터 타입 -> 배열과 레코드
- 타입 연산자 혹은 구성자(Constructor)와 함께 사용
- C의 경우 배열은 {}과 포인터 *, 구조체는 struct 를 사용
- 연상 배열(Map, Dictionary)의 경우 함수형 프로그래밍 언어(LISP)에서 소개된 후 여러 언어에 추가
- 타입 연산자 혹은 구성자(Constructor)와 함께 사용
💫 타입 검사
- 연산자에 포함된 피연산자들이 호환 가능한 타입인지를 확인하는 행위
- 호환 가능 타입 (Compatible type)
- 연산자에 의해서 적법하거나, 컴파일러-생성 코드(또는 해석기)에 의해서 적법한 타입으로 묵시적으로 변환되는 것이 언어 규칙에 허용되는 타입
- 강제 형변환(Coercion, 묵시적 형변환)
- 연산에 참여할 때 컴파일러나 인터프리터가 적법한 타입으로 형을 강제로(암묵적으로) 변화시키는 행위
- 예) int + float 에서 int 형을 float 형으로 변환 혹은 배정문에서 int 형을 float형으로 변환
- 예) coercion.c, CoercionExam.java
- 강제 형변환은 때때로 신뢰성을 약화시킴
- Fortran, C, C++은 상당히 많은 강제 형변환을 허용
- 예) strong_type_coercion.c
- Ada, ML, F#은 강제 형변환이 거의 없거나 없음
- Java, C#은 강제 형변환을 반정도 허용
- 예) CoercionExam.java
- Fortran, C, C++은 상당히 많은 강제 형변환을 허용
- 연산에 참여할 때 컴파일러나 인터프리터가 적법한 타입으로 형을 강제로(암묵적으로) 변화시키는 행위
- 정적 타입 검사
- 변수들에 대한 타입 바인딩이 정적이면 타입 검사는 항상 정적으로 가능
- 장점
- 컴파일 시점에 타입 오류를 발견하므로 비용이 적게든다.
- 단점
- 유연성이 부족
- 동적 타입 검사(Dynamic Type Checking)
- 실행시간에 타입 검사가 가능한 언어
- 예) JavaScript, Python, Ruby 등은 동적 타입 바인딩이 되므로 동적 바인딩만 허용
- 장점
- 유연성이 증가
- 단점
- 오류를 실시간에 파악 가능하므로 타입 검사 비용이 많이 든다.
- 오류를 초래하기 쉽고 가독성을 약화시킴
- 강 타입
- 강 타입 언어(Strong type language)
- 프로그래밍 언어의 타입 오류가 항상 감지되는 언어
- 모든 피연산자의 타입이 컴파일 시점 혹은 실행 시점에 타입이 결정되어야 함
- 변수들의 잘못된 사용을 감지해 냄으로 안전성을 증대
- 예) StrongType.java
- Ada, ML, F#, Java, C# 등은 강 타입 언어에 속함
- Java, C#은 명시적 타입 캐스팅을 허용하며 이는 오류를 낼 수 있음
- C/C++는 강타입 언어가 아님(Weak type language)
- 공용체의 경우 타입 검사를 하지 않음
- 프로그래밍 언어의 타입 오류가 항상 감지되는 언어
- 강제 형변환(Coercion) vs 강 타입 언어
- 강제 형변환은 강 타입 언어의 특성을 약화 시킬 수 있음
- 가급적 명시적 형변환을 수행 할 것 - 예) StrongTypeCoercion.java
- 타입 검사 프로그램(lint)를 사용할 것 - Ubuntu splint
- 강제 형변환은 강 타입 언어의 특성을 약화 시킬 수 있음
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.