Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈 밀러 ( Robin Milner)
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.1 타입 오류 5.2 정적 및 동적 타입 결정 5.3 기본 타입 5.4 사용자 정의 타입 5.5 재귀적 데이터 타입 5.6 타입으로서의 함수 5.7 타입 동일 5.8 하위 타입 5.9 다형성과 통칭 5.10 프로그래머가 정의한 타입
Copyright © 2006 The McGraw-Hill Companies, Inc. 타입 (type) 은 값의 집합과 그 값들에 대한 연산의 집합이다. 예 : 정수 타입은 값..., -2, -1, 0, 1, 2,... 과 연산 +, -, *, /, <,... 로 구성 불 타입은 값 true, false 와 연산 , , 로 구성
Copyright © 2006 The McGraw-Hill Companies, Inc. 컴퓨터의 타입은 값을 저장하기 위한 메모리의 크기가 고정되어 있기 때문에 유한한 개수의 값을 가짐. 예외 : Smalltalk 는 기본적으로 무한한 분수들을 가진다 Haskell 의 Integer 타입은 무한한 정수들을 나타낼 수 있다. 부동소수점수 문제 ?
Copyright © 2006 The McGraw-Hill Companies, Inc. 수학의 실수를 근사하기 위하여 고정된 크기의 부동소수점 실수를 사용할 때 발생하는 문제는 더욱 심각하다. 0.2 이진수로 정확히 표현되지 않는다. 따라서 0.2 * 5 는 정확히 1.0 이 되지 않는다. 컴퓨터의 부동소수점 계산은 수학에서의 계산과 일치하지 않는다.
Copyright © 2006 The McGraw-Hill Companies, Inc. Fortran, Algol, Cobol 등의 초기의 고급 언어는 기본 타입만을 사용 색깔을 나타내기 위하여 정수의 사용이 가능 : 그러나, 두 색깔 사이의 곱셈을 어떻게 해석할 것인가 ? 프로그래밍 언어에 있어서 타입의 목적은 문제의 해답 ( 프로그램 ) 을 더욱 효과적으로 나타내기 위한 방법을 제공하기 위한 것이다.
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.1 타입 오류 컴퓨터에 저장된 데이터는 타입 정보를 가지고 있지 않다. 기본적으로 비트들의 열 (sequence) 일 뿐이다. 예 :
Copyright © 2006 The McGraw-Hill Companies, Inc 위 비트열의 가능한 해석 부동 소수점 수 비트 정수 1,079,508,992. 두 개의 16 비트 정수 와 0 네 개의 ASCII X NUL NUL
Copyright © 2006 The McGraw-Hill Companies, Inc. 어떤 연산을 해당하지 않는 타입의 값에 적용함으로써 발생하는 오류를 타입 오류 (type error) 라고 한다. 타입 오류는 어셈블리 언어 프로그램 작성 시에 자주 발생 고급 언어의 경우에는 컴파일러와 실행시간 시스템이 타입 오류를 찾아내도록 설계되므로 타입 오류를 줄일 수 있다. 타입 체계 (type system) 는 타입 오류를 검출하기 위한 기반을 제공한다.
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.2 정적 및 동적 타입 결정 타입 체계는 덧셈에 사용되는 값은 숫자여야 한다는 것과 같은 제약을 보장한다. EBNF 를 사용하여 문법적으로 표현할 수 없다. 어떤 언어는 컴파일 시간에 타입 검사를 수행한다. (eg, C). 다른 언어들은 실행 중에 타입 검사를 수행한다. (eg, Perl) 두 가지 방법을 다 사용하기도 한다. (eg, Java)
Copyright © 2006 The McGraw-Hill Companies, Inc. 모든 변수의 타입이 컴파일 시간에 선언에 의하여 고정되는 경우 그 언어를 정적으로 타입이 결정 (statically typed) 된다고 한다. 변수의 타입이 저장되는 값에 따라 실행 중에 바뀔 수 있을 경우 이 언어를 동적으로 타입이 결정 (dynamically typed ) 된다고 한다. 각각의 예는 ?
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어에서 타입 체계가 컴파일 중이나 실행 중에 모든 타입 오류를 찾아낼 수 있을 경우 이를 엄격한 타입의 (strongly typed ) 언어 라고 한다. 엄격한 타입의 언어는 동적 타입 결정 또는 정적 타입 결정일 수 있다. 유니온 (Union) 타입은 많은 언어들에서 타입 체계의 허점의 원인이 된다. 대부분의 동적으로 타입이 결정되는 언어는 각각의 값에 타입을 함께 저장한다.
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.3 기본 타입 현재 32-bit 컴퓨터에서 사용되는 용어 : Nibble: 4 bits Byte: 8 bits Half-word: 16 bits Word: 32 bits Double word: 64 bits Quad word: 128 bits
Copyright © 2006 The McGraw-Hill Companies, Inc. 대부분의 언어에서 숫자 타입은 유한한 크기를 갖는다. 따라서 a + b 는 범위를 넘칠 수 잇다. (overflow) 수학과의 차이점 존재 : a + (b + c) (a + b) + c 또한 C 와 같은 언어들에서 등가 연산자와 비교 연산자는 불값이 아닌 정수 값을 생성한다.
Copyright © 2006 The McGraw-Hill Companies, Inc. 중복 (overloaded) 이란 함수나 연산자가 인수의 타입에 따라 그 의미가 달라지는 것을 말한다. Java: a + b 정수 덧셈 부동소수점수 덧셈 문자열 접합 (concatenation) 혼합모드 : 하나는 정수이고 다른 인수는 부동소수점수인 경우
Copyright © 2006 The McGraw-Hill Companies, Inc. 원래 값보다 더 적은 수의 비트열을 결과로 생성하는 타입 변환을 좁히는 (narrowing) 변환이라고 한다. 이 경우 정보를 잃을 수 있다. 반대의 경우를 넓히는 변환 (widening) 이라고 한다. 암시적인 ( 자동으로 수행되는 ) 좁히는 변환이 허용되지 않는 이유는 ?
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.4 사용자 정의 타입 열거형 (Enumeration) : enum day {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}; enum day myDay = Wednesday; C/C++ 에서 위 타입들의 값은 0,..., 6 이 사용된다. 자바는 더 강력한 구조가 사용된다 : for (day d : day.values()) Sytem.out.println(d);
Copyright © 2006 The McGraw-Hill Companies, Inc. 포인터 C, C++, Ada, Pascal Java??? 메모리 주소가 값으로 사용된다. 간접적인 참조 C 의 포인터 연산 : *
Copyright © 2006 The McGraw-Hill Companies, Inc. 예 struct Node { int key; struct Node* next; }; struct Node* head;
Copyright © 2006 The McGraw-Hill Companies, Inc. 그림 5.4: C 의 간단한 연결 리스트
Copyright © 2006 The McGraw-Hill Companies, Inc. 신뢰성 있는 소프트웨어의 개발을 방해한다. 오류가 생기기 쉽다 버퍼넘침 (Buffer overflow), 메모리 누출 (memory leaks) 특히 C 에서 문제가 많이 발생함
Copyright © 2006 The McGraw-Hill Companies, Inc. float sum(float a[ ], int n) { int i; float s = 0.0; for (i = 0; i<n; i++) s += a[i]; return s; float sum(float *a, int n) { int i; float s = 0.0; for (i = 0; i<n; i++) s += *a++; return s;
Copyright © 2006 The McGraw-Hill Companies, Inc. void strcpy(char *p, char *q) { while (*p++ = *q++) ; } strcpy
Copyright © 2006 The McGraw-Hill Companies, Inc. 포인터 연산 T 가 타입이름이고 ref T 는 포인터 타입임 : & : T → ref T * : ref T → T For an arbitrary variable x: *(&x) = x
Copyright © 2006 The McGraw-Hill Companies, Inc. 배열과 리스트 int a[10]; float x[3][5]; /* odd syntax vs. math */ char s[40]; /* indices: 0... n-1 */
Copyright © 2006 The McGraw-Hill Companies, Inc. 첨자 접근 (Indexing) 많은 언어에서 기본연산으로 지원 타입 : [ ] : T[ ] x int → T 예 float x[3] [5]; type of x: float[ ][ ] type of x[1]: float[ ] type of x[1][2]: float
Copyright © 2006 The McGraw-Hill Companies, Inc. 배열과 포인터의 동등성 a = &a[0] e1 또는 e2 가 ref T 타입일 경우 : e1[e2] = *((e1) + (e2)) Example: a is float[ ] and i int a[i] = *(a + i)
Copyright © 2006 The McGraw-Hill Companies, Inc. 문자열 기본적인 타입으로 언어에서 바로 지원한다. C 는 이례적으로 일차원 배열을 사용하여 문자열을 표현한다. 스트링 값의 종료는 NUL 문자로 표시한다. ( 값 = 0). Java, Perl, Python 에서는 문자열 변수는 무한한 수의 문자를 포함할 수 있다. 문자열 연산자와 함수 라이브러리를 제공한다.
Copyright © 2006 The McGraw-Hill Companies, Inc. 구조체 수학에서의 순서쌍 (tuple) 에 대응한다. 다른 타입의 원소들의 모음 Cobol 과 PL/I 에서 처음 사용 Fortran 과 Algol 60 에서는 포함되지 않음 Pascal 형태와 C 형태의 언어들에서는 일반적으로 지원 Java 에서는 클래스와 중복되므로 포함되지 않는다.
Copyright © 2006 The McGraw-Hill Companies, Inc. struct employeeType { int id; char name[25]; int age; float salary; char dept; }; struct employeeType employee;... employee.age = 45;
Copyright © 2006 The McGraw-Hill Companies, Inc. 유니온 (Unions) C: union Pascal: 태그 구분 유니온 (case-variant record) 논리적으로 같은 기억장소에 대한 복수의 관점 ( 타입 ) 을 표현 시스템 소프트웨어 개발시 유용하다.
Copyright © 2006 The McGraw-Hill Companies, Inc. type union = record case b : boolean of true : (i : integer); false : (r : real); end; var tagged : union; begin tagged := (b => false, r => 3.375); put(tagged.i); -- error
Copyright © 2006 The McGraw-Hill Companies, Inc. // simulated union type class Value extends Expression { // Value = int intValue | boolean boolValue Type type; int intValue; boolean boolValue; Value(int i) { intValue = i; type = new Type(Type.INTEGER); } Value(boolean b) { boolValue = b; type = new Type(Type.BOOLEAN); }
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.5 재귀적인 자료 타입 data Value = IntValue Integer | FloatValue Float | BoolValue Bool | CharValue Char deriving (Eq, Ord, Show) data Expression = Var Variable | Lit Value | Binary Op Expression Expression | Unary Op Expression deriving (Eq, Ord, Show) type Variable = String type Op = String type State = [(Variable, Value)]
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.6 타입으로서의 함수 Pascal 예 : function newton(a, b: real; function f: real): real; f 가 실수를 반환하는 함수임은 명시되었지만, f 의 인수 타입은 명시되지 않았음을 주목
Copyright © 2006 The McGraw-Hill Companies, Inc. public interface RootSolvable { double valueAt(double x); } public double Newton(double a, double b, RootSolvable f);
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.7 타입 동등성 Pascal 보고서 : 저장문은 계산식이 나타내는 새로운 값으로 현재의 변수 값을 대치하는 역할을 한다.... 변수 ( 또는 함수 ) 와 계산식은 같은 타입이어야만 한다.... 그러나 같은 타입이 무엇인지는 정확하게 정의되어 있지 않음
Copyright © 2006 The McGraw-Hill Companies, Inc. struct complex { float re, im; }; struct polar { float x, y; }; struct { float re, im; } a, b; struct complex c, d; struct polar e; int f[5], g[10]; // which are equivalent types?
Copyright © 2006 The McGraw-Hill Companies, Inc. 5.8 부분타입 부분타입 (subtype) 은 한 타입의 값이나 연산에 어떤 제약이 추가된 타입을 말한다. Ada 에서는 부분타입이 직접 명시될 수 있다 subtypes can be directly specified.
Copyright © 2006 The McGraw-Hill Companies, Inc. subtype one_to_ten is Integer range ; type Day is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday); subtype Weekend is Day range Saturday.. Sunday; type Salary is delta 0.01 digits 9 range _999_999.99; subtype Author_Salary is Salary digits 5 range ;
Copyright © 2006 The McGraw-Hill Companies, Inc. Integer i = new Integer(3);... Number v = i;... Integer x = (Integer) v; //Integer 는 Number 의 하위 클래스이므로, // 부분타입으로 사용된다.
Copyright © 2006 The McGraw-Hill Companies, Inc. 다형성과 통칭 (Polymorphism and Generics) 함수 또는 연산이 관련된 몇몇 타입들에 적용되어 같은 수행 결과를 가져올 때 이를 다형적 (polymorphic ) 이라고 한다. 다형성은 코드의 재사용을 가능하게 하는 장점을 가진다.
Copyright © 2006 The McGraw-Hill Companies, Inc. 다형성 (Polymorphism) 그리스어에서 유래 의미 : 많은 형태를 가진다. 다른 타입의 인수에 비슷한 연산이 적용 Ada 83
Copyright © 2006 The McGraw-Hill Companies, Inc. Java: instance 변수, 메소드 –name, name( ) Ada 통칭 : 통칭 정렬 – 인수를 받는 다형성 (parametric polymorphism) – 메개변수가 실제 타입에 연결되는 것은 프로그램 작성 시간이 아닌 컴파일 시간으로 연기된다. – 함수 sort 는 generic_sort(integer) 로 표현된다.
Copyright © 2006 The McGraw-Hill Companies, Inc. generic type element is private; type list is array(natural range <>) of element; with function ">"(a, b : element) return boolean; package sort_pck is procedure sort (in out a : list); end sort_pck;
Copyright © 2006 The McGraw-Hill Companies, Inc. package sort_pck is procedure sort (in out a : list) is begin for i in a'first.. a'last - 1 loop for j in i+1.. a'last loop if a(i) > a(j) then declare t : element; begin t := a(i); a(i) := a(j); a(j) := t; end; end if;
Copyright © 2006 The McGraw-Hill Companies, Inc. 실제화 (Instantiation) package integer_sort is new generic_sort( Integer, ">" );
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래머가 정의하는 타입 타입의 정의 : 값들의 집합과 이러한 값들에 대한 연산들의 집합 구조체는 표현 방법을 정의할 수 있도록 한다 ; 문제점 : 구현을 위한 표현방법이 감추어지지 않는다. 새로운 타입에 대한 연산을 정의할 수 없다 12 장에서 OOP 의 문제를 다룬다.