Programming Languages

Download Report

Transcript Programming Languages

제7장
자료형
 자료형과 형 선언(Data Types & Type Declarations)
 자료형
 객체 집합 + 연산(생성, 작성, 소멸, 수정, 분해)
 예) Lisp  S-수식 + CAR, CDR, CONS
예) 명령형 언어  기본 자료형 : 정수, 실수, 문자, 논리 등
 자료형의 범주
 내장 자료형 - 표현법, 연산
 사용자 정의 자료형
 기본 자료형
Fortran 77
INTEGER
REAL
LOGICAL
CHARACTER
DOUBLE
COMPLEX
Algol 60
integer
real
boolean
Pascal
Ada
integer
real
boolean
char
integer
float
boolean
character
natural
duration
priority
자료형
 자료형 기법(typing mechanism)
 자료형을 정의하고, 변수를 특정 자료형으로 선언하는 설비
 기존 언어에서 제공  Fortran : 빈약한 제공, 최근 언어 : 다양한 제공
 변수 자료형 선언
 변수 자료형 선언
① 정적인 자료형 검사
② 명세부를 구현부와 분리  추상 자료형
③ 프로그램 신뢰성 증가
③ 프로그램 판독성
 자료형 쟁점 사항
 자료형 정보의 바인딩 시점(번역시간 또는 실행시간)
강 자료형(strongly type)  신뢰성, 유지보수성, 판독성 증가
 자료의 적법성(compatibility)과 동치 관계
 자료형의 매개변수화와 매개변수의 평가 시점
 자료형의 구성원(객체, 요소, 값)  영역(domain) 구성
 자료형의 영역이 상수 값들인 경우  스칼라 형
자료형
 열거 자료형(Enumerated Data Types)
 열거 자료형
 사용되는 자료집합을 리스트 형태(순서 정의) 로 정의
 열거형 연산  동등관계, 순서 관계, 배정연산 허용
(열거형 연산은 프로그래밍 언어의 능력을 향상)
 예) Pascal의 열거형 사용 예
type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
var x, y, z:months;
…
x :=Jan ;
<순서 관련 연산자>
y :=Jun ;
• pred(x) : x 이전에 정의된 값
if x = y then z := Nov else z := Dec ;
• succ(x) : x 다음에 정의된 값
• ord(x) : x가 정의된 위치
 순서 관련 연산
 pred(Jun)  May, pred(Jan)  undefined, succ(Jun)  Jul, succ(Dec)  undefined
자료형
 열거형 문제점
 다중 정의(Multiple definition)
 동일한 상수를 두 열거형의 리터럴 값으로 사용 : 형 대조시 문제
 Pascal : 不許容, Ada : 許容
 Ada의 예
type months is (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov , Dec);
type summermonths is (Jun, Jul, Aug);
X : months; Y : summermonths;
 month’ORD(Jul) 또는 summermonths’ORD(Jul) 로 구분
 부분 영역형
 이미 정의된 자료형에서 일부 구간을 정의해 사용
 범위 : (하한~상한) 정의
 원래 자료형의 연산을 부분 영역형에서 사용 가능
 원래 자료형과 부분 영역형의 적법성 여부 (Pascal은 구현 의존)
자료형
 예 : Pascal
type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
type summermonths = Jun..Aug;
 summermonths 형의 변수는 Jun, Jul, Aug 저장 가능
 months 형과 summermonths 형의 혼합 연산  구현 의존적
 type winters = Dec..Feb;  불가능
자료형
 기본 자료형(The Basic Data Types)
 수치형(Numeric)
 기본 자료형(실수, 정수)
 구현 의존적(기계 특성)  빠른 연산 속도, 호환성 문제 발생
 Ada : 수치값을 명시적 제한
 기 정의된 상수(MAX_INT, MIN_INT) 도입
 short integer, long integer : 사용자가 허용 범위와 사양을 선언 가능
 실수 : 유효숫자 자리수, 값의 범위, 실수 사이의 증분치 등을 선언 가능
 예) type COEF is digits 10 range -1.0..1.0;
type MONEY is delta 0.01 range 0.0 .. 100.0;
 COEF : 유효숫자 10자리 값, 범위는 -1.0~1.0
 MONEY : 10001개의 숫자(0.0, 0.01, 0.02, ..., 100.0)
 수치 자료형 T의 속성 사용 허용 : 개수(T’DIGIT), 최소값(T’SMALL),
최대값(T’LARGE)
자료형
 다형성(polymorphism) 제공 (Ada, C++ 등)
 동일 속성의 연산자가 피연산자 형에 따라 다른 것으로 간주되는 개념
 예) + : 정수형 덧셈, 실수형 덧셈, 행렬 덧셈 등
 혼합형 연산 해결
  피연산자와 연산 결과에 대한 자료형을 표로 제공
 예) Algol 68 (widening이 기본)
+
integer
real
double
integer
integer
real**
double***
real
real**
real
double*
double
double***
double*
double
* : (실수형  배정도형)후 연산
** : (정수형  실수형) 후 연산
*** : ** , * 변환 후 연산
  연산 결과의 자료형을 미리 결정하여 해당 연산을 수행
 피연산자가 연산 결과의 자료형과 다르면 결과형으로 변환하여 연산
 예) (Fortran문장)
 P = Q + REAL(I / J)
P= Q+I / J
 P = Q + REAL(I) / REAL(J)
해석
자료형
 cast(Algol 68)
 자료형의 명시적인 변환 구문
 예) real val 수식 : 수식 값이 실수형으로 변환
 확장(widening)과 축소(narrowing)
 확장 : 수식 형 변환시 메모리가 증가하는 방향으로 변환
 예) 정수  실수, 실수  배정도형 실수
 축소 : 수식 형 변환시 메모리가 감소하는 방향으로 변환 (정보 손실)
 예) 실수  정수, 정수  문자
자료형
 논리형 (Boolean)
 값의 영역이 두 개의 객체(참과 거짓)로 구성
 논리형 연산(and, or, not, imp, equiv)
 x and y = if x then y else false
 x or y
= if x then true else y
 not x
= if x then false else true
 x imp y = if x then y else true
 x equiv y = if x then y else not y
 논리형 상수 표현
 Algol60 - true, false (수 값과 혼합 연산 금지)
 Pascal, Ada - 미리 정의된 열거형 (false, true), false < true
 PL/I - 비트열 모두 “0“ 이면 FALSE, 아니면 TRUE(수 값과 혼합 연산 가능)
 예) 187 + TRUE
A < B < C  (A < B) < C 의미
9 < 8 < 7  결과는 TRUE
자료형
 문자형(Character, String)
 60년대 중반 요구
 문자열 자료형, 문자열 관계 연산 요구
 Hollerith 문자열 (초창기 수치중심 언어인 Fortran, Algol 60에서 사용)
 주로 출력용으로 쓰임
 문자열을 정수 변수에 배정하여 사용
 예) 14H HONG KIL DONG
 PL/I : 매우 다양한 문자 처리 기능 제공
DCL A CHAR(10);
• A - 길이 10인 문자열
DCL B CHAR(80) VARYING;
• B - 최대 길이 80인 문자열
• C - 영문자(2)+임의 문자(2)+숫자(2)인 문자열
DCL C PIC 'AAXX99’;
 PL/I에서 제공하는 문자열 연산들
 , INDEX, LENGTH, SUBSTR, TRANSLATE, VERIFY
infix 연산자
prefix 연산자
자료형
 PL/I에서의 문자열 처리 예
 가정 : DCL A CHAR(15) , (B , C , D) CHAR (20) VARYING;
 연결 연산 (| )
A='WHAT,’ | '?' | 'ME' | '?' | 'WORRY?';  A에 ‘WHAT,?ME?WORRY?' 저장
 길이 연산
LENGTH(A)  길이 15 반환
 부분 문자열 연산 (SUBSTR은 l-value, r-value 존재)
SUBSTR(A, 7, 2)  'ME' 반환 (r-value 로 사용)
SUBSTR(A, 7, 2) = 'US'  A에 'WHAT,?US?WORRY?' 저장 (l-value 로 사용)
 INDEX(A, B)  A에서 문자열 B의 시작위치 반환(없으면 0을 반환)
감소하는 방향으로 변환
 VERIFY(A, B) : A에 있으나 B에는 없는 첫 문자 위치 반환
VERIFY(GSTRING , 'ABCDEFGHIJKLMNOPQRSTYVWXYZ')
 영문자가 아닌 위치 반환
 TRANSLATE(A , B , C) : A에서 C의 모든 문자를 찾아 B의 문자로 변환
TRANSLATE(A , '-' , '?')  A를 'WHAT,-ME-WORRY-’ 로 변환
자료형
 Pascal (PL/I의 문자열 처리 기능 제거  고비용)
 char 자료형 만 존재
 문자열 : 문자형 1차원 배열  문자열 처리에 대한 함수 없음
 ord(c), chr(x) 함수 제공
 Snobol 문자열
 64년 Farber, Griswold, Polonsky :기계 독립적(Machine independent) 구현
 문자열 연산 사용 예
 연결 연산 - 공백
Y = 'UP’
X = 'HURRY’
Z=X Y
 문자 연결 연산('HURRYUP')
 널 문자 배정
X=
 패턴 매칭(Pattern matching)
 [label] subject pattern [:goto ]
/* 레이블은 첫 열에서 시작 */
예) AXIOM = 'SNOBOL IS A NIFTY LANGUAGE'
AXIOM 'NIFTY'
:S(FOUND) F(NOTFOUND)
 ‘NIFTY’를 발견하면 레이블 FOUND로 제어 이동
자료형
 패턴 매칭(Pattern matching) <계속>
 [label] subject pattern = object [ :goto]
/* 삽입, 소거, 변경 가능 */
예) LOOP AXIOM 'SNOBOL' = 'APL' : S(LOOP)
 모든 ‘SNOBOL’을 ‘APL’로 변환하는 문장
LOOP AXIOM ' ' = : S(LOOP)  AXIOM에서 모든 공백을 제거
 택일 패턴
 PAT= 'RED' | 'GREEN'  변수 PAT에 ‘RED’와 ‘GREEN’ 배정
예) SAMPLE = 'ONE SHOULD NOT EAT GREEN APPLES'
SAMPLE PAT : S(LABEL)  ‘GREEN’이 매칭되어 LABEL로 분기
 택일과 연결 연산
 FANCY = ('R' | 'B') ('EDS' | 'ED')
 패턴으로 사용되는 경우 (REDS, RED, BEDS, BED) 순서로 검사
 조건 배정문(conditional assignment)
 SAMPLE FANCY.ITEM : S(FOUND) F(NOTFOUND)
 성공시 찾은 문자열이 변수 ITEM에 배정
(이 경우, REDS, RED, BEDS, BED 중 하나)
자료형
 포인터 자료형(Pointer Data Types)
 포인터와 포인터 변수
 포인터 : 객체에 대한 참조
 포인터 변수 : 객체를 참조하기 위한 주소를 값으로 취하는 식별자
 필요성
① 실행시간까지 크기(개수)를 알 수 없는 자료 (동적 기억 장소 할당)
② 다중 관계(multiple relationship)
 문제점
① 다수의 포인터가 동일 객체 지시  이명
② 포인팅 되지 않은 객체 존재  현수참조(dangling reference)
③ 포인터 변수 : r-value(객체를 가리킴), l-value
* dangling reference  Pascal, PL/I 발생 가능, Algol 68 발생 불가
자료형
 예) Pascal (예외 - forward reference)
type nodeptr =↑node;
node = record
number:real;
next:nodeptr
end
var x, y : nodeptr;
 x, y : nodeptr 형의 포인터 변수
…
new(x);
 new(x) : node 형의 객체 생성 (x의 배정)
…
dispose(x)
 dispose(x) : x에 배정된 객체 소멸
 x : node형 객체를 가리키는 포인터 변수
x↑: node 형 객체
x↑.number : x가 가리키는 객체의 실수부분
x↑.next : x가 가리키는 객체의 포인터 부분
 연산 - 배정연산, 동등연산, 역참조(dereference)
 포인터 상수 - nil
 수명(life time) - 생성(new( ))부터 소멸(dispose( ))까지
자료형
 예) Ada
type NODE
type NODEPTR is access NODE
type NODE is record
NUMBER : REAL;
NEXT : NODEPTR;
end
 객체 생성 및 값 배정 (Pascal과 Ada 비교)
var P, Q:NODEPTR;
...
new(P);
P↑. NUMBER := 3 . 54;
P↑. NEXT := nil;
var P, Q:NODEPTR := new NODE(3.54, nil);
 필드 접근과 복사 (Ada에서의 field 지정)
P.NEXT := Q.NEXT;
P.NUMBER := Q.NUMBER;
P.all := Q.all;
자료형
 Pascal과 Ada의 포인터 변수 비교
언어
포인터 배정
값 배정
필드 지정
생성
Pascal
p := q
p := q
p.필드명
new(p)
Ada
p := q
p.all := q.all
p.필드명
p:=new(자료형)[:=초기값]
 구조 자료형(Structured Data Types)
 구조 자료형
 여러 자료를 묶어 하나의 단위로 처리하는 자료형
 array - homogeneous data 모임
 record - heterogeneous data 모임
자료형
 배열(Array)
 이름, 차원, 원소형, 첨자 집합의 형과 범위로 구성
 첨자
 일반적으로 연속적인 정수형 집합
 참고) Pascal : 스칼라 형 사용(실수형 불가)
 각 차원 : 하한(lb) ≤ 상한(ub)  크기(ub - lb + 1)
 예)
Fortran, PL/I, Ada : A(5, 3, 7)
Algol60, Algol68, Pascal : A[5, 3, 7]
/*함수 호출과 구별 */
 배열 첨자의 경계값
 배열에서 상한/하한값 표현
 예) • Fortran : 상수
• Algol : 정수 수식
• Pascal : 상수(크기가 다른 형이면 다른 자료형)
type asize10 = array[1..10] of integer;
asize20 = array[1..20] of integer;
 asize10, asize20은 서로 다른 형으로 인식
 Pascal에서 크기가 다른 배열들을 매개 변수로 전달시, 최대 크기 배열 사용 (비효율적)
자료형
 FORTRAN
 DIMENSION A(100), B(10, 10)
A(100)  1차원(100개), A(1), A(2), ..., A(100)
B(10,10)  2차원(100개), B(1,1), B(2,1),… B(10, 10)
 배열 첨자에 비 상수 사용 경우 (형식 매개변수 사용시)
SUBROUTINE SORT(A , N)
DIMENSION A(N)
 Pascal (배열의 첨자에 상수명 사용)
const numberofdays = 30;
var day : array[1.. numberofdays] of real;
 고정 크기의 배열 , 판독성, 유지보수 편리성 제공
 Ada (동적 배열 허용)
type SEQUENCE is array(INTEGER range <>) of FLOAT;
type SEQREF is access SEQUENCE;
P:SEQREF;
...
P := new SEQUENCE(M .. N);
자료형
 동적 배열(dynamic array) 허용 언어
 Ada, PL/I, Algol60, Simula 등  Heap에 할당 후 포인터에 배정
 배열 저장 순서( A(1:2, 1:3)에 대해)
 행 우선(row major) : 대부분 언어  A(1,1), A(1,2), A(1,3), A(2,1), A(2,2), A(2,3)
 열 우선(column major) : Fortran  A(1,1), A(2,1), A(1,2), A(2,2), A(1,3), A(2,3)
 배열 명세표(descriptor)
 배열의 정보 저장 테이블
배열 이름, 원소형, 길이, 시작 주소, 차원수, 각 차원 상/하한값
자료형
 배열 명세표 사용 예
배열명
원소형
원소 길이
시작주소
차원수
첨자 하한
첨자 상한
real A(-2:2)
A
real
one location
α
1
-2
2
1차원 배열의 명세표
α
α+1
α+2
α+3
α+4
13.
21.
3.4
5.5
14.3
A(-2)
A(-1)
A(0)
A(1)
A(2)
배열명
원소형
원소 길이
시작주소
차원수
첨자 하한
첨자 상한
첨자 하한
첨자 상한
2차원 배열의 명세표
integer B(0:2,1:2)
B
integer
one location
β
2
0
2
1
2
β
β+1
β+2
β+3
β+4
β+5
13
21
3
5
14
25
B(0,1)
B(0,2)
B(1,1)
B(1,2)
B(2,1)
B(2,2)
자료형
 배열 저장 위치
 base : 배열 시작 주소, s : 원소 크기, lbi, ubi : 상수
 1차원 A(lb1:ub1)에 대해
 loc(A(i)) = base + (i - lb1) * s = base - lb1 * s + i *s
 2차원 A(lb1:ub1, lb2:ub2)에 대해
 loc(B(i, j)) = base + (i - lb1) * (ub2 - lb2 + 1) * s + (j - lb2) * s
= base - s * lb1 * (ub2 - lb2 + 1) - s * lb2 + j * s + i * s * (ub2 - lb2 +1)
 Pascal
 배열 첨자 : 실수형 제외한 스칼라형 (정수형, 열거형)
var temperature:array[months] of real;
i : months;
...
temperature :=(15.5, 12, 10.4, 29, 45, 65.5, 78, 84, 82, 61, 42, 22.5);
temperature[May] := 25.5;
for i :=Jan to Dec do x := x + temperature[i];
자료형
 Algol68
 [1:3] ref [ ] real w  실수형 배열을 가리키는 3원소 배열
<선언문>
<배정문>
[1:a] real x
[1:b] real y
[1:c] real z
w[1] :=x
w[2] :=y
w[3] :=z
<결과>
w
x
y
1
a
b
z
c
 이 경우, W[2][3]  y[3] 임
자료형
 배열 부분 선택 (w(1:3, 1:5)에 대해)
 slice : 배열의 연속된 일부분
 slice 표기 예
 PL/I
: w(3,*), w(*,5)
 Algol68 : w[3, ], w[ ,5], w[3,5] = w[ ,5][3], w[3,2:4] = w[3,2], w[3,3], w[3,4]
 APL
: w[3; ], w[ ;5]
 배열 연산
 Fortran, Algol60  배열 원소에 대한 연산만 가능
 APL, PL/I, Algol68  배열 배정 연산(A←B, A=B, A:=B)
 PL/I
: DCL A(10,10), B(10)  배열 복사 (B = A(i , *))
 배열 초기화(Ada)
type MAT is array(INTEGER range 1..2, INTEGER range 1..2) of INTEGER;
A : MAT :=((10, 20), (30, 40));
A : MAT := (1 => (1 => 1, others => 0), 2 => (2 => 1, others => 0));
자료형
 배열 자료형의 고려사항들
 배열 이름과 배열 원소에 대한 구문
 원소 값에 대하여 어떤 자료형이 사용되는가?
 첨자로 어떤 자료형을 사용할 수 있는가?
 배열 크기의 바인딩 시간 ?
 배열 이름에 대한 주소 결정이 얼마나 복잡하게 되어 있는가?
 어떤 형태의 slicing을 제공하는가?
 배열을 초기화 시키기 위한 어떤 종류의 문장이 허용되는가?
 배열에 대한 내장된 연산은 어떤 종류가 허용되는가?
자료형
 레코드(Record)
 이질형 요소(heterogeneous element)들의 모임인 자료형 구성
 예) Pascal
type stock = record
name:array[1..30] of char;
 stock : 5개 필드로 구성된 레코드형
price:array[1..365] of real;
 필드
dividend:real;
① price, volumn : 숫자형 배열
volume:array[1..365] of integer;
② name : 문자형 배열
exchange:(nyse, amex, nasdaq)
③ dividend : 실수형
end;
④ exchange :
열거형(nyse, amex, nasdaq)
var newstock, ibm:stock;
 newstock, ibm : 레코드형(stock) 변수
 레코드 내의 필드 참조 방식
 필드(변수명)
 name(ibm), price(ibm)[25], dividend(ibm), volumn(ibm)[25], exchange(ibm)
 변수명.필드 (Pascal, Ada)
 ibm.name, ibm.price[25], ibm.dividend, ibm.volumn[25], ibm.exchange
 필드 of 변수명 (Algol68)  name of ibm, price[25] of ibm
자료형
 구조 자료형의 역사
 COBOL에서 시작(structure)
 PL/I, Pascal(record)  가변부(variant part) 추가
var newstock, ibm:stock;
 레코드 내의 필드 참조 방식
 레코드 초기화 (Algo-w, Algol 68, Ada)
var ibm, csc:stock;
ibm :=make-stock('IBM', 0..0, 5.25, 0..0, nyse );
csc :=make-stock('Computer Science Corp.', 0..0, 0, 0..0, nyse);
 With문 (Pascal)
 변수명을 생략하는 필드 지정 구문
newstock.name :="dec";
newstock.dividend :=36;
newstock.exchange :=amex;
with newstock do
begin
name :="dec";
dividend :=36;
exchange :=amex;
end;
자료형
 Ada 레코드 사용 예
type stock = record
name:array[1..30] of char;
type FLIGHT;
type LISTOFFLIGHTS is access FLIGHT;
type FLIGHT is record
FLIGHTNO : INTEGER range 0..100;
SOURCE : STRING;
DESTINATION : STRING;
RETURNFLIGHT : LISTOFFLIGHTS;
end record;
X, Y : LISTOFFLIGHTS;
...
X.RETURNFLIGHTS := Y;
 X.RETURNFLIGHTS :
FLIGHT형을 가리키는 포인터
(여기서는 Y를 가리킴)
 사용
X.RETURNFLIGHTS.FLIGHTNO
X.RETURNFLIGHTS.SOURCE
자료형
 가변부 (Variant Part)
 판별자를 이용한 필드들의 택일 변환 기술
 Ada, Pascal  가변부를 위해 case문 사용
 예) Pascal
type listptr =↑listnode ;
type listnode = record
link:listptr ;
case tag:boolean of
false : (data : char) ;
true : (downlink : listptr)
end
var p, q : listptr ;
 판별자 tag 값에 따라 필드 결정
1) tag = false이면 data 필드 생성
2) tag = true이면 downlink 필드 생성
 다음의 문장 사용 가능
p↑.tag := true;
p↑.downlink := q;
p↑.tag := false;
writeln(p↑.data)
 Pascal과 같은 가변부의 사용은 심각한 오류 발생 유도
 판별자 값만 바뀌고 내용이 변화되지 않은 상태에서 접근하는 경우
자료형
 가변부 (Variant Part) <계속>
 판별자를 이용한 필드들의 택일 변환 기술
 Ada, Pascal  가변부를 위해 case문 사용
 예) EUCLID
 매개변수화 선언 : 실행중 판별자 값이 변하므로써 발생되는 오류 제거
var x:listnode(true)
var y:listnode(false)
var z:listnode(any)
 위의 예제에서 z := y는 가능, y := z 불가
 해결법
 x는 tag 값이 true
 case discreminating w = z on tag of
y는 tag 값이 false
true => x := w; end
z은 tag 값이 true와 false
z := y; 가능
false => y := w; end
 tag 초기화 후 배정 불가능
end case
 Ada : 매개변수화 선언에 any 허용 않됨
자료형
 자료형 변환(Type Coercion)
 자료형 변환
 묵시적 변환(수식 평가나 배정시 발생)
 Fortran 등 초기 언어에서 시작(혼합형 연산)
 PL/1 : 내장된 모든 자료형에 대한 묵시적 변환 제공
 명시적 변환(cast)
 종류
 축소변환(narrowing)
 축소되는 크기로 변환(절단, 반올림 발생)
예) 정수형  문자형, 실수형  정수형 등
 확대변환(widening)
 확대되는 크기로 변환
예) 문자형  정수형, 정수형  실수형 등
자료형
 스칼라형 : 형 변환이 容易
 구조형, 사용자 정의형 : 거의 불가능
 Pascal
var r:real;
i:integer;
...
i := r;  불가능
 배정 연산에서 narrowing 불허
 단, 부분 영역형에서만 narrowing 허용
 i = r 문장에 대해
i := round(r); 또는
i := trunc(r); 로 표현
 정수에서 실수로 확대 배정 허용 ?
 정수형의 범위가 실수형의 가수 범위보다 클 때 허용
자료형
 자료형 동치(Type Equivalence)
 일반적인 규칙
 이름 동치(name equivalence)
 함께 선언되거나 또는 동일 식별자 이름으로 선언되면 동일형으로 간주
 구조 동치(structural equivalence)
 구성요소가 모든 측면에서 같으면 동일형으로 간주
 선언 동치(declaration equivalence)
 이름 동치에서 함께 선언된 것만을 분리하고자 할 때 사용
 Algol68, Algol-W, Pascal : 주요 공헌(자료형)
 사용자 정의 자료형
 강력한 자료형 요구
 문제점(동치, 적법성)들을 내포
 자료형 적법성(type compatibility)
 객체 형이 특정 문맥에서 정당한지 결정하는 의미적인 규칙
자료형
 자료형 동치의 예
 예 1)
type T = array [1 .. 100] of integer;
var x, y : array [1 .. 100] of integer;
z : array [1 .. 100] of integer;
w : T;
 규칙 ① x, y 동치. w는 x나 z와 다른 형
 규칙 ② x, y, z, w 모두 동치
 예 2)
type T2 = ...;
type T1 = T2
 규칙 ① T1, T2는 다른 형
 규칙 ② T1, T2는 동치
 예 3)
type T1 = array[1 . . 100] of real;
T2 = array[1 . . 10, 1 . . 10] of real;
 규칙 ② T1, T2는 다른 형
 서로 다른 구조임
자료형
 동치 규칙에 대한 장단점 존재
 이름 동치 : 단순 명료, 자료형 이름 정의 강요
 구조적 동치 : 순서만 다르고 모든 것이 같은 열거형은 동치형(?)
 구조적으로는 같으나 개념이 다른 경우
 예)
type month = 1 .. 12;
dozen = 1 .. 12;  서로 다른 개념
....
var A:record x , y:real end;
B:record u , v:real end;  같은 구조이지만 다른 필드 이름
1) Pascal 6000 compiler release 1 : 이름 동치
2) Pascal 6000 compiler release 2 : 구조적 동치
3) Pascal 6000 compiler release 3 : 선언 동치
자료형
 선언 동치(declaration equivalence)
 함께 선언된 자료형끼리만 동치
 예)
type stock = record
name : array[1 .. 30] of char;
dividend : real;
price : array[1 .. 365] of real;
end;
var industrial, utility : stock;
transportation : stock;
1) industrial과 utility : 선언 동치
2) industrial, utility와 transportation : 다른 자료형
3) 구조 동치나 이름 동치 : 세 변수 모두 동치
Programming Languages
- The end of Chapter 7 -
To Be Continue ...
Copyright, 1999 © H. Y. Kwak, Cheju National University.