Presentation is loading. Please wait.

Presentation is loading. Please wait.

6장 데이터 타입(2) 2016. 5. 10 순천향대학교 컴퓨터공학부 하 상 호.

Similar presentations


Presentation on theme: "6장 데이터 타입(2) 2016. 5. 10 순천향대학교 컴퓨터공학부 하 상 호."— Presentation transcript:

1 6장 데이터 타입(2) 순천향대학교 컴퓨터공학부 하 상 호

2 Perl에서 영역 묵시적으로 선언된 변수는 전역 변수이다. 지역 변수 선언 가능 my $var => 정적 영역 (디폴트)
local $var => 동적 영역

3 목차 서론 기본 데이터 타입 문자 스트링 타입 사용자-정의 순서 타입 배열 타입 연상 배열 레코드 타입 튜플 타입 리스트 타입
공용체 타입 포인터와 참조 타입 타입 검사 강타입 타입 동등

4 배열 타입 배열(array)은 동질적인(동일한 타입을 갖는) 데이터 원소들의 집단체(aggregate)이고, 개개의 원소는 그 집단체의 첫번째 원소에 상대적인 위치로 식별 설계시 고려사항 어떤 타입이 첨자에 대해서 적법한가? 원소 참조시 첨자 식이 범위 검사되는가? 첨자 범위는 언제 바인딩되는가? 배열 할당은 언제 일어나는가? 톱니형 또는 직사각형 다차원 배열이 허용되는가? 또는 둘 다 허용되는가? 배열이 할당될 때, 초기화 가능한가? 슬라이스(slice)가 존재한다면, 어떤 종류의 슬라이스가 지원되는가?

5 배열 인덱싱 인덱싱은 인덱스로부터 원소로의 사상을 의미 인덱스 구문 arrayName (인덱스 리스트) => 원소
괄호 사용 FORTRAN, PL/I, Ada 배열 참조와 함수 호출간의 균일성(uniformity)를 보여준다: 이 둘 모두 사상(mapping)을 의미 대괄호 사용 다른 대부분의 언어

6 배열 인덱스(첨자) 타입 첨자 타입 인덱스 범위 검사 FORTRAN, C: 정수만 가능
Ada: 정수, 열거, 불리안, 문자 등 임의 순서 타입 Java: 정수만 가능 인덱스 범위 검사 C, C++, Perl, FORTRAN: 범위 검사 명세하지 않음 Java, C#: 범위 검사 명세 Ada: 디폴트는 범위 검사 요구하나 프로그래머에 의해서 무위화 가능

7 첨자 바인딩 및 배열 유형 배열 변수의 첨자 타입의 바인딩은 보통 정적이지만, 그 첨자 값 범위는 때때로 동적으로 바인딩
첨자 범위 하한이 묵시적으로 0,1, 또는 임의 정수 값으로 설정 가능 첨자 범위가 프로그래머에 의해서 명세 첨자 범위 바인딩 시기, 기억공간 바인딩 시기 및 그 할당 위치에 기준하여 배열을 5가지로 유형화 정적 고정 스택-동적 스택-동적 고정 힢-동적 힢-동적

8 첨자 바인딩 및 배열 유형(계속) 정적 배열(static array)은 첨자 범위가 정적으로 바인딩, 기억공간 할당이 정적
장점: 효율적(efficiency) 예: C/C++의 static 배열 고정 스택-동적 배열(fixed stack-dynamic array)은 첨자 범위는 정적 바인딩, 기억 공간은 선언문 세련화시간에 할당 장점: 기억공간의 효율적 예: C/C++의 함수 내부에 선언된 배열

9 첨자 바인딩 및 배열 유형(계속) 스택-동적 배열(stack-dynamic array)은 첨자 범위와 기억공간 할당이 모두 세련화 시간에 동적 바인딩. 이러한 바인딩은 변수 존속기간 동안 고정 장점: 유연성 (배열의 크기를 사용 전까지 알 필요없음) 예제: in Ada, Get(List_Len); declare List: array(1..List_Len) of Integer; begin end;

10 첨자 바인딩 및 배열 유형(계속) 고정 힙-동적 배열(fixed heap-dynamic array)은 첨자 범위와 기억 공간 바인딩이 실행중 사용자 프로그램이 요청할 때 이루어지고, 힙으로부터 할당. 바인딩 이후는 고정 유연성 vs. 할당 시간 언어 예 C, C++의 동적 배열 Java, C#의 배열

11 첨자 바인딩 및 배열 유형(계속) 힙-동적 배열(heap-dynamic array)은 첨자 범위, 기억 공간 바인딩이 동적, 이후 바인딩은 변경 가능 유연성 vs. 할당 및 회수 부담 언어 예: Java의 ArrayList, C#의 List Perl, JavaScript ArrayList band = new ArrayList(); Band.add(“Paul”); Band.add(“Pete”); System.out.println(“band.get(1));

12 배열 초기화 배열의 기억공간 할당 시점에 그 배열을 초기화하는 수단을 제공 예제
int list[] = {4, 5, 7, 83}; char name[] = “Gildong”; char *names[] = {“Bob”, “Jake”, “Joe”}; String[] names = {“Bob”, “Jake”, “Joe”}; // in Java

13 배열 연산 배열 연산은 배열 단위의 연산을 수행 언어 예 공통된 배열 연산: 배정, 접합, 동등/비동등 비교, 슬라이스
APL: 가장 강력한 배열 처리 언어 4가지 산술연산이 벡터와 행렬에 대해서 정의 벡터(V)와 행렬(M)에 대한 단항 연산자 제공 Perl: 배정 허용, 비교는 허용하지 않음 Python: 배정, 접합(+), 원소 멤버쉽(in) 허용, 비교 허용 C 기반 언어: ΦV: V의 원소를 역순으로 ΦM: M의 열을 역순으로 θM: M의 행을 역순으로 ØM: M의 전치행렬 계산 ÷M: M의 역행렬 계산

14 직사각형 배열 vs. 톱니형 배열 직사각형 배열(rectangular arrays)은 모든 행이 동일한 개수의 원소를, 모든 열이 동일한 개수의 원소를 갖는 다차원 배열 정확히 직사각형 테이블을 모델링 언어 예: Fortran, Ada, C# myArray[3, 7] 톱니형 배열(jagged arrays)은 행들의 크기가 동일할 필요가 없는 다차원 배열 다차원 배열에서, 배열의 원소가 배열인 경우(“an array of arrays”) 언어 예: C, C++, Java, C# myArray[3][7] // in C# int [][]ma = new int [MAX][]; // in Java for (int i = 0; i <= MAX; i++) ma[i] = new int [i+1];

15 슬라이스 슬라이스(slice)는 배열의 부분적 구조 배열 일부분에 대한 참조 메커니즘을 제공
배열 연산을 제공하는 언어에서 유용

16 슬라이스 예제 In Fortran 95, Vector(3:6) Mat(1:3, 2) Mat(2:3, 1:3)
Cube(2, 1:3, 1:4) Cube(1:3, 1:3, 2:3) Integer, Dimension (10) :: Vector Integer, Dimension (3, 3) :: Mat Integer, Dimension (3, 3, 4) :: Cube

17 배열 구현 배열 원소 접근 함수 구현 1차원 배열의 원소 접근 함수 배열 원소에 대한 첨자 식을 원소의 주소로 사상
사상 코드는 컴파일러가 생성 1차원 배열의 원소 접근 함수 In C, 주소(list[k]) = 주소(list[k]) = 주소(list[하한]) + (k-하한)*원소_크기 다차원 배열의 경우는?

18 배열 구현 다차원 배열의 저장 순서 행-우선 순서(row major order): 대부분의 언어
열-우선 순서(column major order): Fortran Ex. 3 5 7 1 3 8 6 2 5

19 배열 구현 다차원 배열에서 접근 함수 (행-우선 순서) C의 a[m][n] 배열에서, 주소(a[i][j]) =
주소(a[i,j]) = 주소(a[0,0]) + ((i번째 행보다 앞선 행의 개수)*(열의 크기) + (j번째 열의 왼쪽에 위치한 원소 개수) *원소_크기 3차원 배열의 경우는?

20 배열 구현 서술자 배열 원소 접근 함수에 필요한 정보 포함 색인 범위에 대한 실행시간 검사에 필요
첨자 범위의 정적/동적에 따른 컴파일-시간, 실행시간-시간서술자 필요 일차원 배열 다차원 배열

21 배열 매개변수에서 첫번째 첨자는 생략 가능한가?
배열 구현 언어 예 In C 배열 매개변수에서 첫번째 첨자는 생략 가능한가? double sum(double a[], int n) {…} int sum (int a[][5], int n, int m) {…}

22 연상 배열 연상 배열(associative array)은 원소들간에 순서가 없으며, 키 값을 통해서 원소에 접근하는 배열
사용자-정의 키가 원소와 함께 저장되어야 한다. 언어 예 Perl, Python에서는 내장 타입으로 지원, Java, C++, C#에서는 클래스 라이브러리에 의해서 지원 In Perl, %hi_temp = {“Mon”=>77, “Tue”=>79, “Wed”=> 65, …); $hi_temp {“Wed”} = 83;

23 레코드 타입 레코드(record) 타입은 이질적 가능한 데이터 원소들의 집단체 설계 고려사항 각 원소들은 이름으로 식별
COBOL에서 도입, 대부분 언어에서 제공(Fortran 90 이전 버전 제외) 설계 고려사항 필드 참조의 구문 형식은? 생략 참조가 허용되는가?

24 레코드 정의 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개 십진수 표현 레코드 수준 번호이며, 레코드의 계층적 구조를 나타냄 기억장소 형식을 나타냄

25 레코드 정의 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;

26 레코드 필드 참조 필드 참조 구문 참조 방식 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

27 레코드 연산 레코드 단위의 연산으로 배정, 동등/비동등의 비교, 초기화 등 배정은 일반적 (타입이 동등할 경우)

28 레코드와 배열 항목들의 동질적 vs. 이질적 => 동일한 방식의 처리 여부?
배열 원소 접근 vs. 레코드 필드 접근 => 동적 vs 정적

29 레코드 타입 구현 컴파일시간 서술자 필드들은 메모리에 인접하여 저장
필드의 크기가 동일하지 않기 때문에 각 필드에 레코드의 시작 주소에 상대적인 오프셋 주소가 연관 레코드 시작주소로부터 이격 거리


Download ppt "6장 데이터 타입(2) 2016. 5. 10 순천향대학교 컴퓨터공학부 하 상 호."

Similar presentations


Ads by Google