Presentation is loading. Please wait.

Presentation is loading. Please wait.

제 5 장 자 료 형 기본 데이터 형 포인터 형 배열 데이터 형 스트링 집합 형 레코드 공용체 형 형 시스템.

Similar presentations


Presentation on theme: "제 5 장 자 료 형 기본 데이터 형 포인터 형 배열 데이터 형 스트링 집합 형 레코드 공용체 형 형 시스템."— Presentation transcript:

1 제 5 장 자 료 형 기본 데이터 형 포인터 형 배열 데이터 형 스트링 집합 형 레코드 공용체 형 형 시스템

2 데이터 형과 형 선언 데이터 형 - 객체 집합 + 연산 예) Lisp - S-식 + CAR, CDR, CONS
예) 명령형 언어 - 기본 데이터 형 : 정수, 실수, 문자, 불리안 등 데이터 형의 범주 ① 내장 데이터 형 - 표현법, 연산 ② 사용자 정의 데이터 형 기본 데이터 형 (기초형) Fortran 77 Algol 60 Java Ada INTEGER REAL LOGICAL CHARACTER DOUBLE COMPLEX integer real Boolean Int Short Byte Long Float Double Char boolean float character natural duration priority

3 데이터 형과 형 선언(2) 형 시스템(typing system)
데이터 형을 정의하고, 변수를 특정 데이터 형으로 선언하는 시스템 Fortran : 빈약한 기능, 최근언어 : 다양한 기능 변수 데이터 형 선언 ① 정적인 데이터 형 검사 ② 명세부를 구현부와 분리 추상 데이터 형 ③ 프로그램 신뢰성 증가 ③ 프로그램 가독성 증가 데이터 형 논의 사항 데이터 형 정보의 바인딩 시점(번역시간 또는 실행시간) strongly typing 신뢰성, 유지보수성, 판독성 증가 (형에 관한 모든 특성들이 컴파일 시간에 확정) 형의 일치성(compatibility)과 동등 관계

4 5.1 기본 데이터 형 (1) 수치형(Number) 기본 데이터 형(정수, 실수)
- 기계 의존적 빠른 연산 속도, 호환성 문제 발생 Ada : 기계 의존적인 특성을 명시적으로 규정 미리 정의된 상수(MAX_INT, MIN_INT) 도입 short integer, long integer : 사용자가 허용범위와 스펙 선언 가능 실수 : 유효자리수, 범위, 실수 사이 증분치 등 선언 가능 예) type COEF is digits 10 range ; type MONEY is delta 0.01 range ; COEF : 유효숫자 10자리 값, 범위는 -1.0~1.0 MONEY : 10001개의 숫자(0.0, 0.01, 0.02, ..., ) 수치 데이터 형 T의 속성 사용 허용 : 자리수(T’DIGIT), 최소값(T’SMALL), 최대값(T’LARGE)

5 기본 데이터 형 (2) (2) 불리안(Boolean)형 - 값의 영역이 두개의 객체(참과 거짓)로 구성
불리안형 연산(and, or, not, imp,equiv) 1) x and y = if x then y else false 2) x or y = if x then true else y 3) not x = if x then false else true 4) x imp y = if x then y else true 5) x equiv y = if x then y else not y 불리안형 상수 표현 1) Algol60 - true, false (수와 혼합 연산 금지) 2) Pascal, Ada - 미리 정의된 열거형 (false, true), false < true 3) PL/I - 비트열 모두 “0“ 이면 FALSE, 나머지는 TRUE (수치 값과 혼합 연산 가능) 예) TRUE A < B < C => (A < B) < C 의미 9 < 8 < 7 => 결과는 TRUE 4) C – 불리안형을 가지지 않음

6 기본 데이터 형 (3) (3) 열거형 사용되는 객체들의 영역을 리스트 형태(순서 정의)로 정의
모든 값이 프로그래머에 의해 나열됨 열거형 연산 - 동등 관계, 순서 관계, 지정(assign) 연산 허용 (열거형 연산은 프로그래밍 언어의 능력을 향상, 열거형이 허용되지 않으면 리터럴값에 정수값을 대응시켜 표현 -> 프로그램을 읽고 이해하기 어려움) 예) Pascal의 열거형 사용 예 type months = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); var x, y, z:months; ... x :=Jan ; y :=Jun ; if x = y then z := Nov else z := Dec ;

7 기본 데이터형(4) 순서 관련 연산 pred(Jun) => May <순서 관련 연산자>
pred(Jan) => 미정의 succ(Jun) => Jul succ(Dec) => 미정의 열거형 문제점 다중 정의(Multiple definition) - 동일한 상수를 두 열거형의 리터럴 값으로 사용 - Pascal, C, C++ : 불허용, 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) 로 구분한 서수값 <순서 관련 연산자> pred(x) - x 이전에 정의된 값 succ(x) - x 다음에 정의된 값 ord(x) - x가 정의된 위치(서수)

8 기본 데이터 형 (5) (4) 부분 범위(subrange)형 이미 정의된 데이터 형에서 일부 구간을 정의해 사용
범위 : (하한 ~ 상한) 정의 원래형의 연산을 부분 범위형에서 사용 가능 원래 데이터 형과 부분 범위형의 적법성 여부 (Pascal은 구현 의존) C는 부분 범위형을 지원하지 않지만, Pascal과 Ada는 지원함 예) 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; 불가능

9 5.2 포인터형 포인터와 포인터 변수 포인터 - 객체에 대한 참조
포인터 변수 - 객체를 참조하기 위한 주소를 값으로 취하는 식별자 필요성 ① 실행시간까지 크기(개수)를 알 수 없는 자료 (동적 기억 장소 할당) ② 데이터 항목간의 여러 관계 (multiple relationship) 선언 필요 문제점 ① 여러 포인터 변수가 동일 객체 지시 => aliasing ② 포인터 변수가 가리키지 않는 객체 존재 => dangling reference ③ 포인터 변수가 가리키는 객체의 값을 나타낼 수 있는 표기법 필요

10 포인터형 (2) 예) Pascal 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 형 객체 (anonymous variable) x↑.number : x가 가리키는 객체의 실수부분(X->number) x↑.next : x가 가리키는 객체의 포인터 부분((*X).next) 연산 - 지정연산, 동등연산, 역참조(dereference) 포인터 상수 – nil (널 포인터) 수명(life time) - 생성(new())부터 소멸(dispose())까지

11 포인터형 (3) 예) Ada type NODE type NODEPTR is access NODE
type NODE is record NUMBER : REAL; NEXT : NODEPTR; end record; 객체 생성 및 값 배정 (Pascal과 Ada 비교) 필드 접근과 복사 (Ada에서 필드 지정(assign) 가능) var P, Q:NODEPTR; ... new(P); P↑. NUMBER := ; P↑. NEXT := nil; var P, Q:NODEPTR := new NODE(3.54, nil); P.NEXT := Q.NEXT; P.NUMBER := Q.NUMBER; P.all := Q.all;

12 포인터형 (4) Pascal과 Ada의 포인터 변수 언 어 포인터 지정 값 지정 필드 참조 생성 Pascal p := q
언 어 포인터 지정 값 지정 필드 참조 생성 Pascal p := q p↑:= q↑ p↑.필드명 new(p); Ada p.all := q.all p := new(자료형) [ := 초기값]; C와 C++의 포인터 주소가 어셈블리 언어에서 사용되는 것 처럼 사용 유연성 Dangling reference나 분실된 동적-변수 문제 해결책 제공 X 포인터 산술 연산이 가능: ptr+index의 의미는? 메모리에 있는 거의 모든 변수를 가리킬 수 있음 ‘*’ : 내용(역참조:dereference) 연산자, ‘&’ : 주소 연산자 int *ptr ; int a, b ; . . . ptr = &b ; a = *ptr ; “a = b ; “와 동일

13 포인터형 (5) 배열 색인 범위의 하한 값 : 0 색인을 갖지 않는 배열 이름은 첫 번째 원소의 주소를 참조
포인터는 함수를 가리킬 수 있음: 함수를 다른 함수에 대한 매개변수로 사용 가능 포인터는 매개변수 전달을 위해 사용 가능 void *형의 포인터를 제공: generic pointer(어떠한 형의 값도 가리킬 수 있음) -> 기억장소를 다루는 함수의 매개변수로 주로 사용 int array [10] ; int *ptr ; . . . ptr = array ; array[0]의 주소를 ptr에 지정한다. *(ptr + 1)은 array[1]와 동일하다. *(ptr + index)은 array[index]와 동일하다. ptr[index]은 array[index[와 동일하다..

14 result와 ref_result는 서로 alias
포인터형 (6) 참조형 C++은 참조형이라 불리는 포인터형 제공 주로 함수 정의에서 형식 매개 변수를 위해서 사용 묵시적으로 항상 역참조 되는 상수 포인터 참조형 변수는 상수 정의시 주소값으로 초기화 다른 변수를 참조하도록 변경될 수 없음 묵시적 역참조는 참조 변수의 주소값에 지정(assignment)을 허용하지 않음 int result = 0 ; int &ref_result = result ; . . . ref_result = 100; result와 ref_result는 서로 alias

15 포인터형 (7) 미결합 포인터(dangling pointer)
포인터 변수가 더 이상 의미 없는 것을 가리키고있을 때, 이 포인터를 말함 PL/I, Pascal, C에서는 발생 가능하지만, Algol 68에서는 불가능 dangling pointer가 가리키는 장소, 혹은 그 현상을 미결합 참조(dangling reference)라고 함 한 객체의 수명을 넘어 참조할 수 있을 때, 즉 객체의 수명이 다한 후에도 액세스 경로가 존재하는 경우 (객체가 차지했던 공간을 다시 쓸 수 없어도 액세스 경로가 존재) dangling reference가 발생 기억 장소 관리에 문제 유발: 존재하지 않는 객체에 dangling reference를 통해 지정문을 수행하면?? type ptr =^integer; var a, b: ptr; ... new(a); a^ := 10; b := a; (* a^와 b^는 서로 별명 *) dispose(a); (* b^는 미결합 참조 *) writeln(b^); (* 허용되지 않음 *)

16 포인터형 (8) 미결합 포인터(dangling pointer) (2) { int *a; int b; b = 10;
a = &b; } /* *a는 미결합 참조 */ } 앞에서 b가 선언된 블록을 빠져 나오면, b는 해제 int *dang_ref( ) int a; return &a; dang_ref 함수가 호출될 때마다 자동 지역 변수인 a의 위치가 리턴되나, 이 위치는 해제되어 b = dang_ref( ); 지정문 이후의 *b는 미결합 참조

17 포인터형 (9) Garbage collection Garbage는 할당되었으나 프로그램에서 접근할 수 없는 기억 장소를 말함
{… { int *a; a = (int *) malloc(sizeof(int)); ... } /* *a는 접근 불가능 */ } Garbage는 기억 장소가 낭비되지만, dangling reference를 가지는 프로그램보다는 문제가 작음: 내부적으로 바르게 동작하므로 기억 장소가 부족하지 않다면 바른 결과를 생성할 수 있음, 그러나 기억 장소가 부족하면 실행이 중단됨 Dangling reference를 가지는 프로그램은 실행은 되지만, 내용이 바뀌거나 위치를 알기 어려워 실행 시간 에러를 야기하여 틀린 결과를 낼 수 있음 Garbage를 자동적으로 재활용하는 시스템을 garbage collection이라고 함: LISP, Smalltalk, Simula 67, Eiffel, Java

18 포인터형 (10) Java C++ 포인터와 Java 참조 변수 의 차이 포인터는 goto 문과 비교
안전성 향상을 위해 포인터 제거 C++ 포인터와 Java 참조 변수 의 차이 C 메모리 주소 참조 Java - 클래스 인스턴스 참조(참조 변수가 다른 클래스 인스턴스를 참조하도록 지정문이 수행될 수 있음) String str1; str1 = “This is a Java literal string”; 클래스 인스턴스들은 명시적인 기억장소 해제 연산자 없이 회수되므로 dangling reference가 발생될 수 없음 포인터는 goto 문과 비교 goto는 다음에 실행될 문장의 범위를 확대 포인터 변수는 변수에 의해 참조될 수 있는 메모리 셀의 범위를 확대 Java의 참조 변수는 위험성 없이 어느 정도의 융통성과 포인터의 기능 제공

19 5.3 배열 데이터 형 구조화된 자료형(structured data types)
[집합체(aggregate), 복합형(composite type)] 여러 자료를 묶어 하나의 단위로 처리하는 자료형 배열(array) - homogeneous data 모임 레코드(record) - heterogeneous data 모임

20 배열 데이터 형(2) 배열(Array) 이름, 차원, 요소의 형, 색인(인덱스)의 형과 범위로 구성 배열 참조 구문
배열 이름[인덱스_리스트] 원소 소괄호 사용(Fortran, PL/I) : A(4, 5) 컴파일러가 판별, 함수 및 서브루틴과 혼동 대괄호 사용(Pascal, C, C++, Modula-2, Java) : A[4, 5] or A[4][5] 함수 호출과 구별 색인(인덱스) 일반적으로 연속적인 정수형 집합 참고) Pascal : 스칼라 형(정수, 문자, 부분 범위, 열거형) 사용(실수형 불가) 각 차원 : 하한(lb) ≤ 상한(ub) 크기( ub - lb + 1)

21 배열 데이터 형(3) 배열 색인의 범위 색인 범위의 하한값 Java : 0 Fortran : 1
Fortran 77, Fortran 90 : 1 색인 범위 바인딩 기억 장소 할당 장점 정적 배열 정적 효율성 고정 스택-동적 배열 실행시간중 기억 장소 공간의 효율성 스택-동적 배열 동적 고정 후 변경 불가 유연성 힙-동적 배열 변경 가능

22 배열 데이터 형(4) 배열에서 상한/ 하한값 표현 예) Fortran : 상수 Algol : 정수 수식
Pascal : 상수(크기가 다른 형이면 다른 데이터 형) asize10, asize20은 다른 형으로 인식 type asize10 = array[1..10] of integer; asize20 = array[1..20] of integer;

23 적응 배열 : 배열의 형 정의를 포함하는 형식 매개변수이다.
배열 데이터 형(5) Pascal에서 크기가 다른 배열들을 매개 변수로 전달시, 최대 크기의 배열을 사용 (비효율적) ISO 표준 Pascal은 적응 배열 (conformant array)를 제공. 적응 배열 : 배열의 형 정의를 포함하는 형식 매개변수이다. Procedure SORT(var list : array [lower . . upper : integer] of person); . . . var student : array[ ] of person; SORT (student);

24 배열 데이터 형(6) C 5개의 원소를 가진 배열인 mat 생성. Ada (동적 배열 허용)
한 개의 색인 배열의 원소로 배열을 가질 수 있다. 다차원 배열 지원 (직교성) 예) Int mat [5] [4] ; Ada (동적 배열 허용) 동적 배열(dynamic array) 허용 언어 C, C++, Ada등 Heap에 할당 후 포인터에 지정(assignment) 5개의 원소를 가진 배열인 mat 생성. 이 배열은 각각4개의 원소를 가진 배열 type SEQUENCE is array(INTEGER range <>) of FLOAT; type SEQREF is access SEQUENCE; P:SEQREF; . . . P := new SEQUENCE(M .. N);

25 배열 데이터 형(7) 배열 명세표(descriptor) 배열의 정보 저장 테이블
(배열 이름, 원소형, 길이, 시작 주소, 차원수, 각 차원 상/하한값 ) 배열 저장 순서( 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)

26 base – s * lb1 * ( ub2 - lb2 + 1 ) – s * lb2
배열 데이터 형(8) 배열 저장 위치 (행 우선시) base : 배열 시작 주소, s : 원소 크기, : 상수 1) 1차원 A(lb1:ub1)에 대해 loc(A(i)) = base + (i - lb1) * s = i * 2) 2차원 A(lb1:ub1, lb2:ub2)에 대해 loc(B(i, j)) = base + ( i - lb1 ) * ( ub2 - lb2 + 1 ) * s + ( j - lb2 ) * s = base - lb1 * s s base – s * lb1 * ( ub2 - lb2 + 1 ) – s * lb2 s * ( ub2 - lb2 + 1 ) + j * + i *

27 배열 데이터 형(9) Pascal 배열 색인 : 실수형 제외한 스칼라형 (정수형, 열거형)
var temperature:array [months] of real; rainfall :array [months] of real; i : months; temperature :=(15.5, 12, 10.4, 29, 45, 65.5, 78, 84, 82, 61, 42, 22.5); rainfall := (10.6, 15.5, 22.5, 30, 15, 5.4, 0.5, 0.1, 0.6, 1.8, 6.6, 10.5) ; temperature[May] := 25.5; for i :=Jan to Dec do x := x + temperature[i];

28 배열 데이터 형(10) 명세표 사용 예 Integer B(0:2, 1:2) 배열명 B 원소의 형 integer 원소의 길이
one location 시작 주소 β 차원 수 2 색인 하한 색인 상한 1 Real A (-2 : 2) 배열명 A 원소의 형 real 원소의 길이 one location 시작 주소 α 차원 수 1 색인 하한 -2 색인 상한 2 β 13.5 B(0,1) β + 1 21.7 B(0,2) β + 2 3.42 B(1,1) β + 3 5.51 B(1,2) β + 4 14.3 B(2,1) β + 5 25.7 α 13. A(-2) α + 1 21. A(-1) α + 2 3.4 A(0) α + 3 5.5 A(1) α + 4 14.3 A(2)

29 배열 데이터 형 (11) x W y z Algol68 [1:3] ref [ ] real w
=> 실수형 배열을 가리키는 세 개의 원소를 가지는 배열 이 경우, W[2][3] <=> y[3] [1 : a ] real x [1 : b ] real y [1 : c ] real z W [1] := x W [2] := y W [3] := z W 1 a b c x y z

30 배열 데이터 형(12) 배열 조각화(slicing): 부분 선택 (w(1:3, 1:5)에 대해)
slice - 배열의 연속된 일부분 slice 표기 예 PL/I : w(3,*), w(*,5) Algol68 : w[3, ], w[ ,5], w[3,5] = w[ ,5][3] APL : w[3; ], w[ ;5] Algol68 : w[3,2:4] = w[3,2], w[3,3], w[3,4]

31 배열 데이터 형(13) 배열 연산 Fortran, Algol60 배열 원소에 대한 연산만 가능
APL, PL/I, Algol 배열 지정(assign) 연산(A←B, A = B, A:=B ) 예) PL/I DCL A(10,10), B(10) 배열 복사(B = A(i , *)) 배열 초기화 FORTRAN INTEGER X(3) DATA X /0, 2, 7/ C int x[] = {4, 5, 7, 83}; Pascal과 Modula-2는 선언부에서 배열 초기화를 허용하지 않음 Ada type MAT is array(INTEGER range , INTEGER range ) of INTEGER; A:MAT :=((10, 20), (30, 40)); A:MAT := (1 => (1 => 1, others => 0), 2 => (2 => 1, others => 0));

32 배열 데이터 형(14) 배열 자료형 고려사항 배열 이름과 배열 원소에 대한 구문 원소값에 대하여 어떤 자료형이 사용되는가?
색인으로 어떤 자료형을 사용할 수 있는가? 배열 크기의 바인딩 시간 ? 배열 이름에 대한 주소 결정이 얼마나 복잡하게 되어 있는가? 어떤 형태의 slicing을 제공하는가? 배열을 초기화시키기 위한 어떤 종류의 문장이 허용되는가? 배열에 대한 내장된 연산은 어떤 종류가 허용되는가?

33 배열 데이터 형(15) 연상 배열(associative array) 설계시 고려사항
키 값들에 의해서 접근되는 순서를 갖지 않은 데이터 집합체 사용자-정의 키들이 배열에 함께 저장(각 원소는 키와 값의 쌍으로 구성) 설계시 고려사항 원소의 참조형 식과 연상 배열 크기의 바인딩 시간(확장에 따르는 비용) %salaries = ( “Hong”=> , “Won”=> , “Kim” => , “Lee” => ) ; $salaries = { “Won” } => ; delete $salaries { “Lee”} ; @salaries = ( ) ;

34 5.4 스트링 60년대 중반 요구 문자열 자료형, 문자열 관계 연산 요구
Hollerith 문자열 (초창기 수치중심 언어인 Fortran, Algol 60에서 사용) - 주로 출력용 - 문자열을 정수 변수에 배정 예) 14H HONG KIL DONG PL/I : 매우 다양한 문자 처리 기능 제공 DCL A CHAR(10); DCL B CHAR(80) VARYING; DCL C PIC 'AAXX99'; A - 길이 10인 문자열 B - 최대 길이 80인 문자열 C - 영문자(2) +임의 문자(2) + 숫자(2)의 문자열

35 스트링(2) PL/I 에서의 문자열 연산 ( |, INDEX, LENGTH, SUBSTR, TRANSLATE, VERIFY)
infix 연산자 prefix 연산자 PL/I 에서 문자열 처리 예 DCL A CHAR(15) , (B , C , D) CHAR (20) VARYING; 1) 연결 연산 ( | ) A = 'WHAT,' | '?' | 'ME' | '?' | 'WORRY?'; A에 ‘WHAT,?ME?WORRY?' 저장 2) 길이 연산 LENGTH(A) 길이 15 반환 3) 부분 문자열 연산 (SUBSTR은 l-value, r-value 존재) SUBSTR(A, 7, 2) 'ME' 반환 SUBSTR(A, 7, 2) = 'US' A에 'WHAT,?US?WORRY?' 저장 4) INDEX(A, B) : A에서 문자열 B의 시작위치 반환(없으면 0)

36 스트링(3) PL/I 에서 문자열 처리 예 (계속)
5) VERIFY(A, B) : A에 있으나 B에는 없는 첫 문자 위치 반환 VERIFY(GSTRING , 'ABCDEFGHIJKLMNOPQRSTYVWXYZ') 영문자 아닌 위치 반환 6) TRANSLATE(A , B , C) : A에서 C에 있는 모든 문자를 찾아 대응되는 B의 문자로 변환 TRANSLATE(A , '-' , '?') A를 'WHAT,-ME-WORRY-’ 로 변환 Pascal (PL/I의 문자열 처리 기능 제거 고비용: 구현의 어려움과 실행 시간의 비효율) char 데이터형만 존재 문자열 : 문자형 1차원 배열 문자열에 대한 함수 없음 ord(c), chr(x) 함수 제공 C와 Java ??

37 5.5 집합형(Set Type) 집합형 Pascal 과 Modula 2 만이 집합을 내장 데이터형으로 가짐 type africa = (libya, egypt, algeria, sudan, niger, chad, mali, nigerai, rwanda, kenya, gabon, burundi, angola, mozambique, union_s_africa); countires = set of africa; var c1, c2, c3: countries; combine, common: countries; c1 := [libya, algeria, niger, angola]; c2 := [libya, algeria, sudan, chad, angola]; c3 := [libya, mali, nigeria, gabon, angola]; combine := c1 + c2; common := c1 * c2 * c3;

38 집합형(2) 다음에서 0은 거짓을 의미하고 1은 참을 의미한다. * 연산자는 교집합 연산자 + 연산자는 합집합 연산자
base 형인 africa의 개수(cardinality)는 15 combine과 common 값의 원소의 수는 15 각 원소의 크기는 1 비트 c1의 표현은 c2의 표현은 combine의 표현은 common의 표현은 합집합 연산자는 + 교집합 연산자는 *

39 5.6 레코드 레코드 이질형 요소들의 모임인 자료형 Pascal, Modula 2, Ada, C, FORTRAN 90은 모두 레코드를 제공

40 레코드(2) 예) Pascal type stock = 필드 참조 방식 ① 필드(변수명): Knuth가 제안한 함수 표기법
record name:array[ ] of char; price:array[ ] of real; dividend:real; volume:array[ ] of integer; exchange:(nyse, amex, nasdaq) end; var newstock, ibm:stock; 필드 참조 방식 ① 필드(변수명): Knuth가 제안한 함수 표기법 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 stock : 5개 필드로 구성된 레코드형 필드 ① price, volume : 숫자형 배열 ② name : 문자형 배열 ③ dividend : 실수형 ④ exchange : 열거형(nyse, amex, nasdaq) newstock, ibm : 레코드형(stock) 변수

41 레코드 (3) 역사 Cobol 시작(structure) PL/I
Pascal(record) => 가변부(variant part) 추가 레코드 초기화 (Algol W, Algol 68, Ada) var ibm, csc:stock; ibm :=make-stock('IBM', , 5.25, , nyse ); csc :=make-stock('Computer Science Corp.', , 0, , nyse); With문 (Pascal) 변수명을 생략하는 필드 지정 구문 newstock.name :="dec"; newstock.dividend :=36; newstock.exchange :=amex; with newstock do begin name :="dec"; dividend :=36; exchange :=amex; end;

42 레코드 (4) Ada의 레코드 사용 예 Ada type LISTOFFLIGHTS is access FLIGHT;
type FLIGHT is record FLIGHTNO : INTEGER range ; SOURCE : STRING; DESTINATION : STRING; RETURNFLIGHT : LISTOFFLIGHTS; end record; X, Y : LISTOFFLIGHTS; . . . X.RETURNFLIGHTS := Y; X.RETURNFLIGHTS : FLIGHT형을 가리키는 포인터 (여기서는 Y를 가리킴) 사용 X.RETURNFLIGHTS.FLIGHTNO X.RETURNFLIGHTS.SOURCE

43 5.7 공용체 형 공용체 가변부(variant part)
서로 다른 형의 값을 상이한 시간에 중첩된 기억장소에 저장할 수 있는 형 Pascal의 경우 데이터형에 따라 레코드의 필드를 선택적으로 접근할 수 있는 가변부(variant part)를 가지는 레코드 가변부(variant part) 구별부(discriminant)라고 하는 레코드의 특별한 구성 요소에 좌우됨 구별부를 이용한 필드들의 선택 기술

44 공용체 형 (2) 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 포인터 값인 q 값의 비트 표현이 문자로 간주되어 출력됨 Pascal과 같은 가변부의 사용은 심각한 오류 발생 유도 (구별부 값만 바뀌고 내용이 변화되지 않은 상태에서 접근하는 경우) 구별부 tag 값에 따라 필드 결정 1) tag = false이면 data 필드 생성 2) tag = true이면 downlink 필드 생성 다음 문장 가능 p↑.tag := true; p↑.downlink := q; p↑.tag := false; writeln(p↑.data)

45 공용체형 (3) EUCLID 매개변수화 선언 : 실행중 구별부 값이 변함으로써 발생되는 오류 제거
var x:listnode(true) var y:listnode(false) var z:listnode(any) 위의 예제에서 z := y는 가능, y := z 불가 해결법(원래의 데이터 형 값을 검색하려면 case 문에서 구별자 사용: 레코드의 어느 변환부가 사용되는지 실행 시간 검사 가능) case discreminating w = z on tag of true => x := w; end false => y := w; end end case Ada : any 사용 불가 x는 tag 값이 true y는 tag 값이 false z은 tag 값이 true와 false z := y; 가능 tag 초기화 후 배정 불가능

46 5.8 형 시스템 데이터 형 변환 묵시적 형 변환(수식 평가나 지정시 발생) 명시적 형 변환(cast) 묵시적 형 변환
Fortran등 초기 언어에서 시작(혼합형 연산) PL/1 : 내장된 모든 데이터 형에 대한 묵시적 변환 제공

47 형 시스템 (2) 혼합형 연산 해결 1) 피연산자와 연산 결과에 대한 데이터 형을 표로 제공
예) Algol 68 (widening이 기본) 2) 연산 결과의 데이터 형을 미리 결정하여 해당 연산을 수행 - 피연산자가 연산 결과의 데이터 형과 다르면 결과형으로 변환하여 연산 - 예) P = Q + I / J (Fortran문장) + integer real double integer real double integer real** double*** real** real double* double*** double* double * : (실수형 -> 배정도형)후 연산 ** : (정수형 -> 실수형) 후 연산 *** : ** , * 변환 후 연산 1) P = Q + REAL(I / J) 2) P = Q + REAL(I) / REAL(J) 해석

48 형 시스템 (3) 형 변환의 종류 축소 변환(narrowing) - 축소되는 크기로 변환(절단, 반올림 발생)
예) 정수형 -> 문자형, 실수형 -> 정수형 등 확대 변환(widening) - 확대되는 크기로 변환 예) 문자형 -> 정수형, 정수형 -> 실수형 등 Pascal 정수에서 실수로의 확대 변환 부분 범위들 사이의 확대 변환과 축소 변환만 내장 C, C++, Java 확대 변환에 대해서만 자동 변환이 허용 축소 변환은 캐스트 명령을 사용 float r ; int i ; . . . i = r ; 허용x

49 형 시스템 (4) 중복 정의된 연산자 (Overloaded Operators)
연산자 기호가 두 가지 방식 이상으로 사용될 수 있을 때, 연산자 중복 정의(operator overloading)이라고 부름 C++와 Ada에서는 프로그래머가 연산자를 중복 정의할 수 있음 Ada function "*"(X, Y:MATRIX) return MATRIX; C++ complex& operator+(complex& a, complex& b) { complex r = a; r += b; return r; } c = operator+(a, b); c = a + b; /* syntactic sugar */

50 데이터 형의 동등(Type Equivalence)
Algol68, Algol-w, Pascal의 주요 공헌은 데이터 형에 관한 기능 사용자 정의 데이터 형 Strong typing 요구 문제점(동등, 일치성)들을 내포 데이터 형 일치성(type compatibility) 객체 형이 특정 문맥에서 정당한지 결정하는 의미적인 규칙 일반적인 규칙. ① 이름 동등(name equivalence) 함께 선언되거나 또는 동일 식별자 이름으로 선언되면 동일형 ② 구조 동등(structural equivalence) 구성요소가 모든 측면에서 같으면 동일형 * 선언 동등(declaration equivalence) 실제로 같은 선언문으로 선언된 것만 동일한 것으로 간주 이름 동등에서 함께 선언된 것만을 분리하고자 할 때 사용

51 데이터 형의 동등(2) 예) type T = array [1 .. 100] of integer;
var x, y : array [ ] of integer; z : array [ ] of integer; w : T; type T2 = ...; type T1 = T2 type T1 = array[ ] of real; T2 = array[ , ] of real; 규칙 ① : x, y 동등. w는 x나 z와 다른 형 규칙 ② : x, y, z, w 모두 동등 규칙 ① : T1, T2는 다른 형 규칙 ② : T1, T2는 동등 규칙 ② : T1과 T2는 다른 형 (서로 다른 구조임)

52 데이터 형의 동등 (3) 동등 규칙에 대한 장단점 존재 이름 동등 : 단순하지만, 별도의 데이터 형 이름을 정의하도록 강요
구조 동등 : 순서만 다르고 모든 것이 같은 열거형은 동등(?) 구조적으로는 같으나 개념이 다른 경우 예) type month = ; dozen = ; .... 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 : 선언 동등

53 데이터 형의 동등(4) 선언 동등(declaration equivalence) 함께 선언된 데이터 형끼리만 동등 예)
type stock = record name : array[ ] of char; dividend : real; price : array[ ] of real; end; var industrial, utility : stock; transportation : stock; 1) industrial 와 utility : 선언 동등 2) industrial, utility와 transportation : 다른 형 3) 구조 동등이나 이름 동등 : 세 변수 모두 compatibility

54 데이터 형의 동등(5) Ada, Modula 2, C++는 이름 동등을 이용하고, C는 구조체를 제외하고는 구조 동등을 이용
Pascal은 형 동등 여부를 결정하는 규칙을 제공하지 않고, 컴파일러에 좌우됨

55 데이터 형의 동등(6) 데이터 형 일치성( type compatibility)
객체의 형이 특정 문맥에서 정당한지를 결정하는 의미 규칙들을 의미 Pascal과 Modular-2 부분 범위들에 동일형에 대한 적합성을 부여 X가 [ ]의 변수 Y가 [ ]의 변수 “x := y ; “의 사용 적합 만약, 실행시 y의 값이 –5라면 실행시간 오류 (정적 형 오류가 아님) Ada 서브 타입(subtype): 부분 범위형 선언 subtype ainteger is INTEGER range ; 유도된 형(derived type) :부분 범위형을 새로운 데이터 형으로 간주하는 선언 type binteger is new INTEGER range ;


Download ppt "제 5 장 자 료 형 기본 데이터 형 포인터 형 배열 데이터 형 스트링 집합 형 레코드 공용체 형 형 시스템."

Similar presentations


Ads by Google