Download presentation
Presentation is loading. Please wait.
1
6장 데이터 타입(2) 순천향대학교 컴퓨터공학부 하 상 호
2
목차 서론 기본 데이터 타입 문자 스트링 타입 사용자-정의 순서 타입 배열 타입 연상 배열 레코드 타입 튜플 타입 리스트 타입
공용체 타입 포인터와 참조 타입 타입 검사 강타입 타입 동등
3
레코드 타입 레코드(record) 타입은 이질적 가능한 데이터 원소들의 집단체 설계 고려사항 각 원소들은 이름으로 식별
COBOL에서 도입, 대부분 언어에서 제공(Fortran 90 이전 버전 제외) 설계 고려사항 필드 참조의 구문 형식은? 생략 참조가 허용되는가?
4
레코드 정의 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개 십진수 표현 레코드 수준 번호이며, 레코드의 계층적 구조를 나타냄 기억장소 형식을 나타냄
5
레코드 정의 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;
6
레코드 필드 참조 필드 참조 구문 참조 방식 In COBOL
field_name OF record_name_1 OF ... OF record_name_n 다른 언어 record_name_1.record_name_ 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
7
레코드 연산 레코드 단위의 연산으로 배정, 동등/비동등의 비교, 초기화 등 배정은 일반적 (타입이 동등할 경우)
8
레코드와 배열 항목들의 동질적 vs. 이질적 => 동일한 방식의 처리 여부?
배열 원소 접근 vs. 레코드 필드 접근 => 동적 vs 정적
9
레코드 타입 구현 컴파일시간 서술자 필드들은 메모리에 인접하여 저장
필드의 크기가 동일하지 않기 때문에 각 필드에 레코드의 시작 주소에 상대적인 오프셋 주소가 연관 레코드 시작주소로부터 이격 거리
10
튜플 타입 튜플(tuple)은 레코드와 유사하나 원소들이 명명되지 않는 데이터 타입 In Python
myTuple = (3, 5.8, ‘apple’) # 요소들은 동일 타입일 필요가 없다 myTuple[1] # 튜플의 첫번째 원소 참조 myTuple[1] = 5 # Error: 튜플은 변경 불가(immutable) myTuple =+ yourTuple # ‘+’는 접합 연산자로 새로운 튜플 생성 del # 삭제 용도: 배열이 매개변수로 전달되나 변경되지 않아야 하는 경우 함수가 여러 개의 값을 반환할 때
11
리스트 타입 LISP에서 처음으로 도입, 최근에 일부 명령형 언어에 도입 In LISP, Scheme
리스트는 괄호로 구분되고, 원소들은 콤마로 구분되지 않는다. (A B C D) (A (B C) D) 데이터와 코드는 동일한 형식을 갖는다 (A B C)가 코드로 해석될 때, 함수 A가 매개변수 B C에 적용된다 해석기는 리스트가 무엇인지를 알 필요가 있고, 리스트가 데이터일 경우에 어포스트로피로 표시한다. ‘(A B C)는 데이터이다.
12
리스트 연산 리스트 분리 함수 리스트 생성 함수 (CAR ‘(A B C)) // 리스트의 첫번째 원소 반환
(CDR ‘(A B C)) // 리스트의 첫번째 원소를 제외하고 반환 리스트 생성 함수 (cons ‘A ‘(B C)) // 첫번째 매개변수를 두번째 매개변수 리스트에 // 포함시켜서 새로운 리스트 생성 (list ‘A ‘B ‘(C D)) // 매개변수들을 원소로 포함하는 리스트 생성/반환
13
리스트 예: 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]의 배열 생성 // 조건이 배열 각 원소에 적용되어 그 결과들로 구성된 새로운 배열 구성
14
공용체 타입 공용체(union)는 그 변수가 프로그램 실행 중에 다른 시기에 다른 타입의 값이 저장될 수 있는 타입
설계 고려사항 타입 검사가 요구되는가? => 그러한 타입 검사는 동적 공용체가 레코드에 포함되어야 하는가?
15
공용체 유형 자유 공용체(free union) 판별 공용체(discriminated union) 타입 검사를 지원하지 않음
언어 예: Fortran, C, C++ 판별 공용체(discriminated union) 타입 검사 지원 판별자(discriminant) 또는 태그(tag)라는 타입 지시자를 포함 언어 예: Ada
16
예제: 자유 공용체 In C union flexType { int intEl; float floatEl; };
union flexType e; float x; … e.intEl = 27; x = e.floatEl; // 타입 검사가 이루어지는가?
17
예제: 판별 공용체 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; 가변 부분
18
예제: 판별 공용체 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인지를 판단
19
공용체 평가 공용체가 안전한가? 자유 공용체 vs. 판별 공용체 언어 예 C, C++, Ada Java, C#
20
공용체 타입 구현 가장 큰 가변 요소를 위한 충분한 기억공간 할당
21
판별 공용체 타입 구현 판별 공용체 태그는 가변 요소와 함께 저장되며, 각 가변요소에 대해서 서술자 저장
type Node (Tag : Boolean) is record case Tag is when True => Count : Integer; when False => Sum : Float; end case; end record; 가변 요소별로 한 개의 항목 포함
Similar presentations