* Type Compatibility = Type Equivalence = 타입 호환성
- 같은 선언문에 있거나, 같은 타입이름을 갖는 것
ex) int a, b, c; // 같은 선언문에 있다.
int a; int b; // 같은 타입이름을 갖는다.
- Compatibility 방식에는 이름을 가지고 하는 것과 구조를 가지고 하는 것 두 가지로 나뉜다.
* Name Type Compatibility
- 반드시 정규 파라메터와 실제 파라메터의 타입 이름이 같아야 한다.
(formal parameters = actual parameters)
- 구현하기가 쉽다.
- 매우 제한적이다.
ex) type indextype = 1...100; //indextype을 새로 정의, 이것은 integer 1~100만을 가지는 부분타입이다.
...
count:integer; index:indextype;
...
count := index; // error!! 서로 담고 있는 타입은 integer이지만, 서로 타입 이름이 다르므로 호환X
// 제한적 요소가 많다.
* Struct Type Compatibility
- 두 개의 변수의 타입이 같은 구조일때 호환이 가능하다.
- Name Type보다 더 유연하지만 구현하기가 힘들다.
※ 구현시 고려 사항에 대한 예제
ex) struct t1{ int a; int b; }; struct t2{int c; int d;};
// 구조적으로 보면 t1과 t2는 호환이 되어야 한다.
// 그러나 t1과 t2가 사용용도가 확연히 다를경우 호환이 되면 원치 않는 결과 값이 나올 수 있다.
ex) integer A[1...10], B[-5...4];
// 구조적으로 보면 A와 B는 10개자리 int형 배열이다. 하지만 subscript의 숫자의 모양이 다르다.
// 이럴 경우 호환이 가능해야하는 것인가?
// A[1], B[1]의 subscript는 같지만, A[1]은 A의 첫번째 요소이고,B[1]은 B의 6번째 요소이다.
ex) ENUM E1 = {A,B,C,D}; ENUM E2 = {E,F,G,H};
// E1과 E2는 서로 취할 수 있는 값이 다르다. 하지만 컴퓨터는 원소의 값을 숫자로 변형하여 저장하여,
// E1의 A와 E2의 E는 같은 1의 값을 갖는다. 구조적으로도 E1과 E2는 동일한데, 이 경우는 어떻게하는가?
* 각 언어별 Type Compatibility 방법
- Pascal : 거의 구조를 보고 사용하지만, Formal parameter일때는 이름을 본다.
- C / C++ : record에 대해서만 name을 비교하고, 나머지는 구조를 비교하여 호환한다.
- Ada : 구조를 살펴보지만, 신뢰성을 보장하기 위해서 제한된 형태로 name을 살펴본다.
: Derived 예약어를 사용하여 구분을 해준다.
ex) Derived types : type celsius is new float;
type faren is new float;
celsius t1;
faren t2;
t1 = t2; // Error! Derived 예약어를 사용하면 타입의 이름을 비교한다.
ex) subtype SMALLINT is INTEGER range 0 ... 99
INTEGER a1; SMALLINT a2;
a1 = a2; // 가능하다! Derived이외에는 구조를 살펴본다.
// 위에서 SMALLINT의 타입을 부모인 INTEGER를 취한다.
// Ada에서는 평소 부모의 타입이름을 가져다 쓴다.
>> 여러가지 유형을 놓고 에러가 발생하는 경우를 찾는 문제에 대한 발견 및 해결 기술이 필요하다.
예제 ) A, B = array(1...10);
A = B;
// 이 경우에는 type이름이 없으므로 비교가 불가능하다. 호환성 제공을 해주지 않는다.
// 해결법으로는 Type를 제공해주는 방법이 있다.
Type LIST_10 is array(1,,,10) of INTEGER
LIST_10 A, B, C;
- 같은 선언문에 있거나, 같은 타입이름을 갖는 것
ex) int a, b, c; // 같은 선언문에 있다.
int a; int b; // 같은 타입이름을 갖는다.
- Compatibility 방식에는 이름을 가지고 하는 것과 구조를 가지고 하는 것 두 가지로 나뉜다.
* Name Type Compatibility
- 반드시 정규 파라메터와 실제 파라메터의 타입 이름이 같아야 한다.
(formal parameters = actual parameters)
- 구현하기가 쉽다.
- 매우 제한적이다.
ex) type indextype = 1...100; //indextype을 새로 정의, 이것은 integer 1~100만을 가지는 부분타입이다.
...
count:integer; index:indextype;
...
count := index; // error!! 서로 담고 있는 타입은 integer이지만, 서로 타입 이름이 다르므로 호환X
// 제한적 요소가 많다.
* Struct Type Compatibility
- 두 개의 변수의 타입이 같은 구조일때 호환이 가능하다.
- Name Type보다 더 유연하지만 구현하기가 힘들다.
※ 구현시 고려 사항에 대한 예제
ex) struct t1{ int a; int b; }; struct t2{int c; int d;};
// 구조적으로 보면 t1과 t2는 호환이 되어야 한다.
// 그러나 t1과 t2가 사용용도가 확연히 다를경우 호환이 되면 원치 않는 결과 값이 나올 수 있다.
ex) integer A[1...10], B[-5...4];
// 구조적으로 보면 A와 B는 10개자리 int형 배열이다. 하지만 subscript의 숫자의 모양이 다르다.
// 이럴 경우 호환이 가능해야하는 것인가?
// A[1], B[1]의 subscript는 같지만, A[1]은 A의 첫번째 요소이고,B[1]은 B의 6번째 요소이다.
ex) ENUM E1 = {A,B,C,D}; ENUM E2 = {E,F,G,H};
// E1과 E2는 서로 취할 수 있는 값이 다르다. 하지만 컴퓨터는 원소의 값을 숫자로 변형하여 저장하여,
// E1의 A와 E2의 E는 같은 1의 값을 갖는다. 구조적으로도 E1과 E2는 동일한데, 이 경우는 어떻게하는가?
* 각 언어별 Type Compatibility 방법
- Pascal : 거의 구조를 보고 사용하지만, Formal parameter일때는 이름을 본다.
- C / C++ : record에 대해서만 name을 비교하고, 나머지는 구조를 비교하여 호환한다.
- Ada : 구조를 살펴보지만, 신뢰성을 보장하기 위해서 제한된 형태로 name을 살펴본다.
: Derived 예약어를 사용하여 구분을 해준다.
ex) Derived types : type celsius is new float;
type faren is new float;
celsius t1;
faren t2;
t1 = t2; // Error! Derived 예약어를 사용하면 타입의 이름을 비교한다.
ex) subtype SMALLINT is INTEGER range 0 ... 99
INTEGER a1; SMALLINT a2;
a1 = a2; // 가능하다! Derived이외에는 구조를 살펴본다.
// 위에서 SMALLINT의 타입을 부모인 INTEGER를 취한다.
// Ada에서는 평소 부모의 타입이름을 가져다 쓴다.
>> 여러가지 유형을 놓고 에러가 발생하는 경우를 찾는 문제에 대한 발견 및 해결 기술이 필요하다.
예제 ) A, B = array(1...10);
A = B;
// 이 경우에는 type이름이 없으므로 비교가 불가능하다. 호환성 제공을 해주지 않는다.
// 해결법으로는 Type를 제공해주는 방법이 있다.
Type LIST_10 is array(1,,,10) of INTEGER
LIST_10 A, B, C;