프로그래밍 언어론 7-1-4강. 타입의 분류(Classification of Types)

[프로그래밍 언어론]

2019. 12. 12. 21:59

 

[타입의 분류]

: 대부분의 언어들이 서로 비슷한 built-in type들을 제공한다 ( integers, characters, booleans. real number(소수))

  1) Booleans

    : single-type로 0으로 true를, 1로 false를 나타낸다.

    : C99에서 _Bool 타입

 

  2) Characters

   : one-byte로, 주로 ASCII 인코딩에 사용된다.

   : 오늘날 언어들은 two-byte를 사용해 유니코드 charaacter set을 지원한다.

   : C/C++는 "wide" characters를 지원한다.

   : Fortran 2003은 4-byte 유니코드 character를 지원

 

  3) Numeric Types (숫자형 타입)

   : C와 Fortran은 integer과 real number(float)의 차이를 구분하지만, 대부분의 언어는 사용자의 선택에 맡긴다.

   : 사용자에게 맡기게 되면 이식성(portability)에 문제가 생기곤 한다 ( ex. int a = 3.4    // a = 3 )

   : JAVA와 C#여러가지 길이의 numeric type들을 지원한다. ( ex. short, long 등)

   : C, C++, C#등은 signed와 unsigned interger들을 지원한다.

   : C, Fortran은 built-in complex 타입을 제공한다.

 

   # discrete(ordinal) types : integer, boolean, character과 같은 기본 타입들과 두개의 사용자 정의타입(enumerations and subranges)이 이에 해당

   # scalar(simple) types : discrete, rational, real 등 복잡한 타입들 전부 의미

 

 

 

[Enumeration Types(열거형 타입)]

: 이름붙여진 원소들의 집합으로 구성되어 있는 타입이다.

: 내부의 원소들이 순서대로(ordered) 되어 있다보니, 비교연산도 가능하다. ( ex. mon < tue )

 

# 단순 intergers들의 집합과의 차이점

  : enumeration은 intergers과 비교하자면, full-fledged type(필요한 자격을 다 갖춘 타입)이다.

  : 둘다 타입 섞어 쓰면 컴파일 시점에 type clash error 발생

 

# C, C++, C#에서의 열거형 타입 예시

enum weekday { sun, mon, tue, wed, thu, fri, sat };    // weekday이라는 타입 선언

enum weekday { sun=0, mon=1, .... };  // 이런 형태로도 작성 가능

// 위 코드와 동일한 의미

typedef int weeokday;

const weekday sun = 0, mon = 1, tue = 2, wed = 3, thu = 4, fri = 5, sat = 6;

 

# 최신 Java에서의 열거형 타입

  : value들에게 추가적인 영역을 부여해 비슷한 형태로 사용할 수 있다.

enum arm_special_regs { fp(7), sp(13), lr(14), pc(15);

  private final int reguster;

  arm_speical_regs(int r) {register = r;}

  public int reg() {return register;}

}

...

int n = arm_special_regs.fp.reg();

 

 

 

[Subrange Types(하위 범위 타입)]

: 열거형타입과 같이 pascal에서 탄생한 개념

: subrange는 값이 일부 불연속적인 기본(discrete) 유형의 값의 연속 하위 집합을 구성하는 타입이다.

: pascal계 언어들 대부분이, 정수형, Char형, 열거형, 다른 Subrange형에 대한 subrange를 선언할 수 잇다.

 

# Pascal에서의 subrange type

type

  test_score = 0...100;

  workday = mon..fri;

 

# Ada에서의 subrange type 

type test_score is new integer range 0..100;

subtype workday is weekday range mon..fri;

  1) type constraint : 형식 제약 조건 (range ... 역할)

  2) derived type : 파생형 타입 (test_score과 같이 정수형에서 파생된 타입)

  3) contrained subtype : 구속된 하위 타입 (workday 타입과 같은 타입)

 

# 하위 범위(subrange) 사용 장점

  : 프로그램 문서화에 도움이 된다

  : 컴파일러가 임의의 정수들을 사용하려하는 값들을 표현하고 싶을때 subrange를 사용하면 적은양의 bit만으로도 가능하다.

 

 

 

[합성형 타입(Composite Types)]

: 타입 생성자를 한개 이상의 단일 타입들을 적용해 생성한다.

: 일반적으로 알고있는 레코드(structures), 변형 레코드(unions), 배열, 세트, 포인터, 리스트, 파일들이 합성형 타입이다.

1) 레코드 (structs)

  : 각각 간단한 타입으로 구성된 영역(fields)의 collection으로 구성된다

2) 변형 레코드 (unions)

  : 변형 레코드의 영역(fields)들중 오직 한개만 유효하다. (내부에 선언 변수는 여러개지만 실제 사용은 한개만)

3) 배열(array)

  : 가장 일반적인 합성형 타입

  : index 타입이 내부의 요소 타입들에 매핑된다

4) 세트(sets)

5) 포인터 (pointers)

  : l-value, 참조

6) 리스트 (lists)

  : 배열과 달리 매핑이나 indexing의 개념이 없다.

7) 파일 (files)

  : 파일을 하나의 타입으로 보는 경우도 있다.