6장 데이터 타입(2) 2017. 5. 8 순천향대학교 컴퓨터공학부 하 상 호
목차 서론 기본 데이터 타입 문자 스트링 타입 사용자-정의 순서 타입 배열 타입 연상 배열 레코드 타입 튜플 타입 리스트 타입 공용체 타입 포인터와 참조 타입 타입 검사 강타입 타입 동등
레코드 타입 레코드(record) 타입은 이질적 가능한 데이터 원소들의 집단체 설계 고려사항 각 원소들은 이름으로 식별 COBOL에서 도입, 대부분 언어에서 제공(Fortran 90 이전 버전 제외) 설계 고려사항 필드 참조의 구문 형식은? 생략 참조가 허용되는가?
레코드 정의 In COBOL 수준 번호를 이용하여 중첩된 레코드를 표현 01 EMP-REC. 02 EMP-NAME. 05 FIRST PICTURE X(20). 05 MID PICURE X(10). 05 LAST PICURE X(20). 02 HOURLY-RATE PICURE 99V99. 20개의 alphanumeric 중간에 소수점을 갖는 4개 십진수 표현 레코드 수준 번호이며, 레코드의 계층적 구조를 나타냄 기억장소 형식을 나타냄
레코드 정의 In Ada In C In Java, C# type Emp_Name_Type is record First: String (1..20); Mid: String (1..10); Last: String (1..20); end record; type Emp_Rec_Type is record Employee_Name: Emp_Name_Type; Hourly_Rate: Float; Emp_Rec: Emp_Rec_Type;
레코드 필드 참조 필드 참조 구문 참조 방식 In COBOL field_name OF record_name_1 OF ... OF record_name_n 다른 언어 record_name_1.record_name_2. ... record_name_n.field_name 참조 방식 완전 자격 참조(fully qualified references)는 가장 큰 포괄적인 레코드부터 특정 필드에 이르기까지 모든 중간 레코드 이름들이 그 참조에 포함 Ex: Emp_Rec.Employee_Name.First 생략 참조(elliptical references)는 레코드 이름 일부가 생략되는 것을 허용(참조가 모호하지 않는 경우) Ex: First // First 필드에 대한 참조 Employee_Name.First Emp_Rec.First
레코드 연산 레코드 단위의 연산으로 배정, 동등/비동등의 비교, 초기화 등 배정은 일반적 (타입이 동등할 경우)
레코드와 배열 항목들의 동질적 vs. 이질적 => 동일한 방식의 처리 여부? 배열 원소 접근 vs. 레코드 필드 접근 => 동적 vs 정적
레코드 타입 구현 컴파일시간 서술자 필드들은 메모리에 인접하여 저장 필드의 크기가 동일하지 않기 때문에 각 필드에 레코드의 시작 주소에 상대적인 오프셋 주소가 연관 레코드 시작주소로부터 이격 거리
튜플 타입 튜플(tuple)은 레코드와 유사하나 원소들이 명명되지 않는 데이터 타입 In Python myTuple = (3, 5.8, ‘apple’) # 요소들은 동일 타입일 필요가 없다 myTuple[1] # 튜플의 첫번째 원소 참조 myTuple[1] = 5 # Error: 튜플은 변경 불가(immutable) myTuple =+ yourTuple # ‘+’는 접합 연산자로 새로운 튜플 생성 del # 삭제 용도: 배열이 매개변수로 전달되나 변경되지 않아야 하는 경우 함수가 여러 개의 값을 반환할 때
리스트 타입 LISP에서 처음으로 도입, 최근에 일부 명령형 언어에 도입 In LISP, Scheme 리스트는 괄호로 구분되고, 원소들은 콤마로 구분되지 않는다. (A B C D) (A (B C) D) 데이터와 코드는 동일한 형식을 갖는다 (A B C)가 코드로 해석될 때, 함수 A가 매개변수 B C에 적용된다 해석기는 리스트가 무엇인지를 알 필요가 있고, 리스트가 데이터일 경우에 어포스트로피로 표시한다. ‘(A B C)는 데이터이다.
리스트 연산 리스트 분리 함수 리스트 생성 함수 (CAR ‘(A B C)) // 리스트의 첫번째 원소 반환 (CDR ‘(A B C)) // 리스트의 첫번째 원소를 제외하고 반환 리스트 생성 함수 (cons ‘A ‘(B C)) // 첫번째 매개변수를 두번째 매개변수 리스트에 // 포함시켜서 새로운 리스트 생성 (list ‘A ‘B ‘(C D)) // 매개변수들을 원소로 포함하는 리스트 생성/반환
리스트 예: Python Python은 리스트 타입 제공 Python의 배열로서도 역할 원소들은 임의 타입 가능 리스트는 변경 가능(mutuable) 튜플처럼 사용 가능: 인덱싱, 접합, 슬라이싱(부분 참조), in 등 myList = [3, 5.8, “grape”] x = myList[1] //x에 5.8을 할당: 리스트 원소들은 0부터 인덱싱 del myList[1] // 두번째 원소 삭제 리스트 함축(list comprehension) 지원: 집합 표기법에 기반 [x*x for x in range (12) if x % 3 == 0] // range 함수는 [0, 1, 2, …, 11, 12]의 배열 생성 // 조건이 배열 각 원소에 적용되어 그 결과들로 구성된 새로운 배열 구성
공용체 타입 공용체(union)는 그 변수가 프로그램 실행 중에 다른 시기에 다른 타입의 값이 저장될 수 있는 타입 설계 고려사항 타입 검사가 요구되는가? => 그러한 타입 검사는 동적 공용체가 레코드에 포함되어야 하는가?
공용체 유형 자유 공용체(free union) 판별 공용체(discriminated union) 타입 검사를 지원하지 않음 언어 예: Fortran, C, C++ 판별 공용체(discriminated union) 타입 검사 지원 판별자(discriminant) 또는 태그(tag)라는 타입 지시자를 포함 언어 예: Ada
예제: 자유 공용체 In C union flexType { int intEl; float floatEl; }; union flexType e; float x; … e.intEl = 27; x = e.floatEl; // 타입 검사가 이루어지는가?
예제: 판별 공용체 Ada에서 가변 레코드(variant record)로 명세 판별자 type Shape is (Circle, Triangle, Rectangle); type Colors is (Red, Green, Blue); type Figure (Form: Shape) is record Filled: Boolean; Color: Colors; case Form is when Circle => Diameter: Float; when Triangle => Leftside, Rightside: Integer; Angle: Float; when Rectangle => Side1, Side2: Integer; end case; end record; 가변 부분
예제: 판별 공용체 type Shape is (Circle, Triangle, Rectangle); type Colors is (Red, Green, Blue); type Figure (Form: Shape) is record Filled: Boolean; Color: Colors; case Form is when Circle => Diameter: Float; when Triangle => Leftside, Rightside: Integer; Angle: Float; when Rectangle => Side1, Side2: Integer; end case; end record; 판별 공용체 사용 Figure: figure1; // 무제한 가변 레코드(unconstrained variant record) Figure: figure2(form=>triangle); // 제한 가변 변수(constrained // variant variable) 선언, // 다른 가변 타입으로 변경 불가 // 정적 타입 검사 가능 … figure1 := (filled=> True, color=>Blue, Form=>rectangle, side1=>12, side2=>3); // 태그 포함 모든 필드 배정 요구 if (figlure1.diameter > 3.0)… // 실행시간중 동적 타입 검사 // Form 태그가 Circle인지를 판단
공용체 평가 공용체가 안전한가? 자유 공용체 vs. 판별 공용체 언어 예 C, C++, Ada Java, C#
공용체 타입 구현 가장 큰 가변 요소를 위한 충분한 기억공간 할당
판별 공용체 타입 구현 판별 공용체 태그는 가변 요소와 함께 저장되며, 각 가변요소에 대해서 서술자 저장 type Node (Tag : Boolean) is record case Tag is when True => Count : Integer; when False => Sum : Float; end case; end record; 가변 요소별로 한 개의 항목 포함