포스트

프로그래밍 언어 - 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)에서 소개된 후 여러 언어에 추가

💫 타입 검사


  • 연산자에 포함된 피연산자들이 호환 가능한 타입인지를 확인하는 행위
  • 호환 가능 타입 (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
  • 정적 타입 검사
    • 변수들에 대한 타입 바인딩이 정적이면 타입 검사는 항상 정적으로 가능
    • 장점
      • 컴파일 시점에 타입 오류를 발견하므로 비용이 적게든다.
    • 단점
      • 유연성이 부족
  • 동적 타입 검사(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 라이센스를 따릅니다.