[타입의 분류]
: 대부분의 언어들이 서로 비슷한 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)
: 파일을 하나의 타입으로 보는 경우도 있다.
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 7-2-1강. 타입 동등성(Type Equivalence) (0) | 2019.12.13 |
---|---|
프로그래밍 언어론 7-2강. 타입 검사(Type Checking) (0) | 2019.12.13 |
프로그래밍 언어론 7-1-3강. 직교성(Orthogonality) (0) | 2019.12.12 |
프로그래밍 언어론 7-1-2강. 다형성(Polymorphism) (0) | 2019.12.10 |
프로그래밍 언어론 7-1-1강. "타입"의 의미 (0) | 2019.12.10 |