Transcript Document

1
Chapter 7 – 자료형
Outline
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9
자료형과 형 선언
단순형
열거형
배열
연상 배열 (Associative array)
레코드
포인터 자료형
자료형 변환
자료형 동치
2
7.1 자료형과 선언
•
자료형 (data type)
•
자료형 - 객체 집합 + 연산(생성, 작성, 소멸, 수정, 분해)
예) Lisp
- S-식 + CAR, CDR, CONS
예) 명령형 PL
- 기본 자료형 : 정수, 실수, 문자, 논리 형 등등
•
•
이 장에서 다룰 자료형의 범주
–
내장 자료형 : 표현법, 연산
–
사용자 정의 자료형
기본 자료형
Fortran 77
INTEGER
REAL
LOGICAL
CHARACTER
DOUBLE
COMPLEX
C
int
short
long
float
double
char
Java
int
short
byte
long
float
double
char
boolean
Ada
integer
float
boolean
character
natural
duration
priority
3
7.1 자료형과 선언
•
자료형 기법(typing mechanism)
–
자료형을 정의하고, 변수를 특정 자료형으로 선언하는 설비
–
Fortran, Cobol : 빈약한 제공
–
•
•
최근 언어 : 다양한 제공
변수, 자료형 선언
–
정적 자료형 검사
–
명세부를 구현부와 분리
–
프로그램 신뢰성 증가
–
프로그램 판독성 증가
추상 자료형
자료형 쟁점 사항
–
자료형 정보의 바인딩 시점 (번역시간 또는 실행시간)
강 자료형(strongly type)
신뢰성, 유지보수성, 판독성 증가
–
자료형의 적법성(compatibility)과 동치 관계
–
자료형의 매개변수와 매개변수의 평가 시점
4
7.1 자료형과 선언
• 자료형의 구성원 (객체, 요소, 값)
– 자료형의 영역(domain) 구성
– 리터럴(literal)
– 스칼라 형(단순형) : 수치형, 문자형, 열거형 등
– 구조 형 : 배열, 레코드
• 강자료형 (strong typing)
–
자료 형 : 정적 바인딩
• 스칼라형 (scalar type)
5
7.1 자료형
단순형
서수형 부분영역
열거형
문자형
포인터
실수형
정수형
레코드형
부울형
파스칼 자료형의 분류
구조형
배열형
파일형
집합형
6
7.1 자료형
단순형
접근형
복합형
스칼라형
제한형
파일형
실수형
고정형
지속형
전용형
이산형
부동형
배열형
레코드형
문자열
시간형
정수형
자연수형
열거형
양수형
부울형
(duration)
수치형
Ada의 자료형의 분류
문자형
태스크형
7
7.1 자료형
기본형
기본형
수치형
파일형
정수형
실수형
int
참조형
문자형
논리형
char
boolean
float
short
double
byte
long
Java의 자료형의 분류
배열형
클래스형
인터페이스형
8
7.2 단순형
• 수치형(Number)
– 기본 자료형(실수, 정수)
- 기계 의존적
빠른 연산 속도, 호환성 문제 발생
– 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)
9
7.2 단순형
• 수치형(Number)
– 다형성(polymorphism)
• Ada, C++ 등 제공
• 동일 속성의 연산자가 피 연산자 형에 따라 다른 것으로
간주되는 개념
예) + : 정수형 덧셈, 실수형 덧셈, 행렬 덧셈 등
– 혼합형 연산 해결 방법
• 제1방법
– 피연산자와 연산 결과에 대한 자료형을 표로 제공
예) Algol 68등 (widening이 기본)
10
7.2 단순형
• 수치형(Number)
혼합형 연산을 위한 규칙 표 (Algol 68)
+
integer
real
double
integer
real
double
integer
real** double***
real**
real
double*
double*** double* double
: 실수형 -> 배정도형
변환 후 연산
** :정수형 -> 실수형
변환 후 연산
*** : ** , * 변환 후 연산
*
– 제2방법
• 연산 결과의 자료형을 미리 결정하여 해당 연산을 수행
• 피연산자가 연산 결과의 자료형과 다르면 결과형으로 변환하여 연산
• 예) P = Q + I / J
해
석
제1방법) P = Q + REAL(I / J)
제2방법) P = Q + REAL(I) / REAL(J)
11
7.2 단순형
• 논리형(Boolean)
– 값의 영역이 두개의 객체(참과 거짓)로 구성
– 논리형 연산(and, or, not, imp,equiv)
1)
2)
3)
4)
5)
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
12
7.2 단순형
• 문자형
– 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) 문자열
13
7.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)
SUBSTR(A, 7, 2) = 'US'
'ME' 반환
A에 'WHAT,?US?WORRY?' 저장
4) INDEX(A, B) : A에서 문자열 B의 시작위치 반환 (없으면 0)
14
7.2 단순형
•
문자형
5) VERIFY(A, B) : A에 있으나 B에는 없는 첫 문자 위치 반환
예) VERIFY(GSTRING , 'ABCDEFGHIJKLMNOPQRSTYVWXYZ')
영문자 아닌 위치 반환
6) TRANSLATE(A , B , C)
: A에서 C에 있는 모든 문자를 찾아
대응되는 B의 문자로 변환
예) A 변수 : WHAT,?ME?WORRY?
TRANSLATE(A , '-' , '?')
A를 'WHAT,-ME-WORRY-’ 로 변환
•
Pascal
– PL/I의 문자열 처리 기능 제거
고비용 제거
–
문자열 : 문자형1차원 배열
문자열에 대한 함수 없음
–
char 형 만 존재
ord(c), chr(x) 함수 제공
–
15
7.3 열거형 (Enumerated Data Types)
• 열거형
– 사용되는 자료집합을 리스트 형태(순서 정의) 로 정의
– 열거형 연산 - 동등관계, 순서 관계, 배정연산 허용
(열거형 연산은 프로그래밍 언어의 능력을 향상)
– 예) Pascal의 열거형 사용 예
type weeks = (sun, mon, tue, wed, thu, fri, sat);
var x, y, z, today:weeks;
...
x :=mon ;
y :=tue ;
if today = wed then x := sun else y := sat ;
16
7.3 열거형 (Enumerated Data Types)
•
순서 관련 연산
pred(wed) => tue
pred(sun) => 미정의
succ(wed) => thu
succ(sat) => 미정의
•
<순서 관련 연산자>
• pred(x) - x 이전에 정의된 값
• succ(x) - x 다음에 정의된 값
• ord(x) - x가 정의된 위치
열거형 문제점
– 다중 정의(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;
ORD(Jul)
???
months’ORD(Jul) 또는 summermonths’ORD(Jul) 로 구분
17
7.3 열거형 (Enumerated Data Types)
•
부분 영역형
–
–
–
–
•
이미 정의된 자료형에서 일부 구간을 정의해 사용
범위 : (하한 ~ 상한) 정의
원래형의 연산을 부분 영역형에서 사용 가능
원래 자료형과 부분 영역형의 적법성 여부 (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;
불가능
18
7.4 배열
• 구조 자료형(structured data types)
– [집합체(aggregate), 복합형(composite type)]
– 여러 자료를 묶어 하나의 단위로 처리하는 자료형
– 배열(array) - homogeneous data 모임
– 레코드(record) - heterogeneous data 모임
집합체(aggregate)
배열형 (array type) ,배열(array)
19
7.4 배열
•
배열(Array)
– 이름, 차원, 원소형, 첨자(인덱스) 집합의 형과 범위로 구성
– 배열 참조 구문
•
•
배열 이름[인덱스-리스트]
소괄호 사용(Fortran, PL/I)
원소
– 컴파일러가 판별
•
대괄호 사용(Pascal, C, C++, Modula-2, Java)
– 함수 호출과 구별
– 첨자(인덱스)
•
•
•
일반적으로 연속적인 정수형 집합
Pascal : 실수형 제외 모든 스칼라 형 사용
각 차원 : 하한(lb) ≤ 상한(ub)
크기( ub - lb + 1)
20
7.4 배열
• 배열 첨자의 범위
– 첨자 범위의 하한값
• C, Java : 0
• Fortran : 1
• Fortran 77, Fortran 90 : 1
첨자 범위 바인딩
기억 장소 할당
장점
정적 배열
정적
정적
효율성
고정 스택-동적 배열
정적
동적
기억 장소 공간의 효율성
스택-동적 배열
동적
동적
고정 후 변경 불가
유연성
힙-동적 배열
동적
동적
변경 가능
유연성
21
7.4 배열
• 배열에서 상한/ 하한값 표현
– 예) Fortran : 상수
Algol : 정수 수식
Pascal : 상수(크기가 다른 형이면 다른 자료형)
type asize10 = array[1..10] of integer;
asize20 = array[1..20] of integer;
asize10, asize20은 다른 형으로 인식
22
7.4 배열
• Pascal에서 크기가 다른 배열들을 매개 변수로 전달
시, 최대 크기의 배열을 사용 (비효율적)
ISO 표준 Pascal은 적응 배열 (conformant array)를 제공.
적응 배열 : 배열의 형 정의를 포함하는 형식 매개변수이다.
Procedure SORT(var list : array [lower . . upper : integer] of person);
...
var student : array[100 . . 200] of person;
...
SORT (student);
23
7.4 배열
•
C
– 한 개의 첨자, 배열의 원소로 배열을 가질 수 있다.
다차원 배열 지원 (직교성)
– 예)
Int mat [5] [4] ;
• 5개의 원소를 가진 배열인 mat 생성.
• 각 원소는 4개의 원소를 가진 배열
•
Ada (동적 배열 허용)
type SEQUENCE is array(INTEGER range <>) of FLOAT;
type SEQREF is access SEQUENCE;
P:SEQREF;
...
P := new SEQUENCE(M .. N);
•
동적 배열(dynamic array) 허용 언어
C, C++, Ada등
Heap에 할당 후 포인터에 배정
24
7.4 배열
• 배열 명세표(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)
25
7.4 배열
• 배열 저장 위치 (행우선시)
base : 배열 시작 주소, s : 원소 크기,
1) 1차원 A(lb1:ub1)에 대해
loc(A(i)) = base + (i - lb1) * s
=
+i*
base - lb1 * s
: 상수
s
2) 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
+ i
*
s * ( ub2 - lb2 + 1 )
*
s
26
7.4 배열
α
13.
A(-2)
α+1
21.
A(-1)
Real A (-2 : 2)
α+2
3.4
A(0)
A
α+3
5.5
A(1)
real
α+4
14.3
A(2)
• 명세표 사용 예
배열명
원소의 형
원소의 길이
시작 주소
차원 수
one location
α
1
첨자 하한
-2
첨자 상한
2
Integer B(0:2, 1:2)
배열명
원소의 형
원소의 길이
B
integer
one
location
시작 주소
β
차원 수
2
첨자 하한
0
첨자 상한
2
첨자 하한
1
첨자 상한
2
β
13
B(0,1)
β+1
21
B(0,2)
β+2
3
B(1,1)
β +3
5
B(1,2)
β+4
14
B(2,1)
β+5
25
B(2,1)
27
7.4 배열
• 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
7.4 배열
• Algol68
[1:3] ref [ ] real w
=> 실수형 배열을 가리키는 3원소 배열
[1 : a ] real x
[1 : b ] real y
[1 : c ] real z
W
x1
W [1] := x
W [2] := y
W [3] := z
a
y
b
z
c
– 이 경우, W[2][3] <=> y[3]
29
7.4 배열
• 배열 부분 선택
•
slice - 배열의 연속된 일부분
– slice 표기 예 : w(1:3, 1:5)에 대해
PL/I :
Algol68 :
APL :
Algol68 :
w(3,*), w(*,5)
w[3, ], w[ ,5], w[3,5] = w[ ,5][3]
w[3; ], w[ ;5]
w[3,2:4] = w[3,2], w[3,3], w[3,4]
• [배열] 슬라이스 ([array] slice)
30
7.4 배열
• 배열 연산
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));
31
7.4 배열
• 배열 자료형 고려사항
– 배열 이름과 배열 원소에 대한 구문
– 원소값에 대하여 어떤 자료형이 사용되는가?
– 첨자로 어떤 자료형을 사용할 수 있는가?
– 배열 크기의 바인딩 시간 ?
– 배열 이름에 대한 주소 결정이 얼마나 복잡하게 되어 있는가?
– 어떤 형태의 slicing을 제공하는가?
– 배열을 초기화시키기 위한 어떤 종류의 문장이 허용되는가?
– 배열에 대한 내장된 연산은 어떤 종류가 허용되는가?
32
7.5 연상 배열
• 연상배열(associative array)
– 키 값들에 의해서 접근되는 순서를 갖지 않은 데이터 집합체
– 사용자-정의 키들이 배열에 함께 저장
• 설계 시 고려사항
– 원소의 참조형 식과 연상 배열 크기의 바인딩 시간
%salaries = ( “Hong”=>1200000, “Won”=> 2000000,
“Kim” => 1500000, “Lee” => 2500000) ;
$salaries = { “Won” } => 2000000 ;
delete $salaries { “Lee”} ;
@salaries = ( ) ;
33
7.6 레코드
•레코드
•
•
이질형 요소들의 모임인 자료형
예) Pascal
type stock =
record
name:array[1 .. 30] of char;
price:array[1 .. 365] of real;
dividend:real;
volume:array[1 .. 365] of integer;
exchange:(nyse, amex, nasdaq)
end;
var newstock, ibm:stock;
•
• stock : 5개 필드로 구성된 레코드형
• 필드
① price, volumn : 숫자형 배열
② name : 문자형 배열
③ dividend : 실수형
④ exchange : 열거형(nyse, amex, nasdaq)
• 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
34
7.6 레코드
•
역사
– Cobol 시작(structure)
– PL/I
– Pascal(record) => 가변부(variant part) 추가
•
레코드 초기화 (Algol 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;
35
7.6 레코드
• Ada의 레코드 사용 예
– Ada
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 : FLIGHT형을 가리키는
X.RETURNFLIGHTS := Y;
포인터 (여기서는 Y를 가리킴)
• 사용
X.RETURNFLIGHTS.FLIGHTNO
X.RETURNFLIGHTS.SOURCE
36
7.6 레코드
•가변부(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과 같은 가변부의 사용은 심각한 오류 발생 유도
(판별자값만 바
뀌고 내용이 변화되지 않은 상태에서 접근하는 경우)
37
7.6 레코드
• EUCLID
– 매개변수화 선언 : 실행 중 판별자 값이 변함으로써 발생되는 오류
제거
var x:listnode(true)
var y:listnode(false)
var z:listnode(any)
• x는 tag 값이 true
y는 tag 값이 false
z은 tag 값이 true와 false
z := y; 가능
• tag 초기화 후 배정 불가능
• 위의 예제에서 z := y는 가능, y := z 불가
case discreminating w = z on tag of
true => x := w; end
false => y := w; end
end case
• Ada : 매개변수화 선언에 any 허용 안됨
해결법
38
7.7 포인트 자료형 (Point Data Types)
•
포인터와 포인터 변수
– 포인터 (pointer)
•
객체에 대한 참조
– 포인터 변수 - 객체를 참조하기 위한 주소를 값으로 취하는 식별자
–
필요성
① 실행시간까지 크기(갯수)를 알 수 없는 자료
동적 기억 장소 할당
② 다중 관계(multiple relationship)
–
문제점
① 다수의 포인터가 동일 객체 지시 => 이명
② 포인트 되지 않은 객체 존재
③ 현수참조(dangling reference)
– 포인터 변수 : r-value(객체를 가리킴), l-value
39
7.7 포인트 자료형 (Point Data Types)
•
예) Pascal (예외 - forward reference)
type nodeptr =↑node;
node = record
number:real;
next:nodeptr
end
var x, y : nodeptr;
: nodeptr 형의 포인터 변수
...
new(x);
: node 형의 객체 생성 (x에 배정)
...
dispose(x)
: x에 배정된 객체 소멸
• x : node형 객체를 가리키는 포인터 변수
x↑: node 형 객체
x↑.number : x가 가리키는 객체의 실수부분
x↑.next : x가 가리키는 객체의 포인터 부분
• 연산 - 배정연산, 동등연산, 역참조(dereference)
• 포인터 상수 - nil
• 수명(life time) - 생성(new())부터 소멸(dispose())까지
40
7.7 포인트 자료형 (Point Data Types)
•
•
예) Ada
type NODE
type NODEPTR is access NODE
type NODE is record
NUMBER : REAL;
NEXT : NODEPTR;
end record;
객체 생성 및 값 배정 (Pascal과 Ada 비교)
var P, Q:NODEPTR;
...
new(P);
P↑. NUMBER := 3 . 54;
P↑. NEXT := nil;
•
Pascal
Ada
var P, Q:NODEPTR := new NODE(3.54, nil);
필드 접근과 복사 (Ada에서의 field 지정)
P.NEXT := Q.NEXT; Ada
P.NUMBER := Q.NUMBER;
Ada
P.all := Q.all
41
7.7 포인트 자료형 (Point Data Types)
• Pascal과 Ada의 포인터 변수
언 어
포인터 배정
값 배정
필드 지정
생성
Pascal
p := q
p↑:= q↑
p↑.필드명
new(p);
Ada
p := q
p.all := q.all
p.필드명
p := new(자료형)
[ := 초기값];
• C와 C++의 포인터
–
–
–
–
–
주소가 어셈블리 언어에서 사용되는 것 처럼 사용 : 유연성
허상 참조, 분실된 동적-변수 문제 :
해결책 미제공
포인터 산술 연산이 가능
메모리에 있는 거의 모든 변수를 가리킬 수 있다.
‘*’ 역참조 연산 , ‘&’주소 연산자
int *ptr ;
int a, b ;
...
ptr = &b ;
a = *ptr ;
“a = b ; “와 동일
42
7.7 포인트 자료형 (Point Data Types)
• 배열 첨자 범위의 하한 값 : 0
• 첨자를 갖지 않는 배열 이름은 첫 번째 원소의 주소를 참조
int array [10] ;
int *ptr ;
...
ptr = array ;
array[0]의 주소를 ptr에
배정한다.
*(ptr + 1)은 array[1]와 동일하다.
*(ptr + index)은 array[index]와 동일하다.
ptr[index]은 array[index]와 동일하다..
• void *형의 포인터를 제공한다.
43
7.7 포인트 자료형 (Point Data Types)
•
참조형
–
–
–
–
C++은 참조형이라 불리는 포인터형 제공
주로 함수 정의에서 형식 매개 변수를 위해서 사용
묵시적으로 항상 역참조 되는 상수 포인터
참조형 변수는 상수 : 정의시 주소값으로 초기화
다른 변수를 참조하도록 변경될 수 없다.
– 묵시적 역참조 자동
– 참조 변수에 배정을 허용하지 않아 자동 역참조
void incr( int *p) {(*p)++}
int result = 0 ;
int &ref_result = result ;
...
ref_result = 100;
result = 100; 과 동일
incr(&a);
void incr( int &x) {x++}
incr(a);
44
7.7 포인트 자료형 (Point Data Types)
• Java
– 안전성 향상을 위해 포인터 제거
• C++ 포인터와 Java 참조 변수 의 차이
– C++ - 메모리 주소 참조
– Java - 클래스 인스턴스 참조
45
7.8 자료형 변환 (Type conversion)
• 자료형 변환
• 묵시적 형 변환(수식 평가나 배정 시 발생)
• 명시적 형 변환(cast)
– 묵시적(Implicit)형 변환
•
•
•
•
•
강제로 요구되어 시스템에 의해 자동 변환
자동변환(Automatic conversion)
강요변환(Coercion)
Fortran등 초기 언어에서 시작(혼합형 연산)
PL/1 : 내장된 모든 자료형에 대한 묵시적 변환 제공
46
7.8 자료형 변환
• 종류
–
축소변환(narrowing)
–
- 축소되는 크기로 변환(절단, 반올림 발생)
예) 정수형 -> 문자형, 실수형 -> 정수형 등
확대변환(widening)
- 확대되는 크기로 변환
예) 문자형 -> 정수형, 정수형 -> 실수형 등
• Pascal
– 정수에서 실수로의 확대 변환
– 부분 영역들 사이의 확대 변환과 축소 변환만 내장
• C, C++, Java
– 확대 변환에 대해서만 자동 변환이 허용
– 축소 변환은 캐스트 명령을 사용
float r ;
int I ;
...
i=r;
허용x
47
7.8 자료형 변환
•
•
•
스칼라 형 : 형 변환 용이
구조형, 사용자 정의형 : 거의 불가능
정수에서 실수로 확대 배정 허용 ?
정수형의 범위가 실수형의 가수 범위보다 클 때
48
7.9 자료형의 동치 (Equivalence)
•
Algol68, Algol-w, Pascal : 주요 공헌(자료형)
• 사용자 정의 자료형
• 강력한 자료형 요구
• 문제점(동치, 적법성)들을 내포
– 자료형 적법성(type compatibility)
• 객체 형이 특정 문맥에서 정당한지 결정하는 의미적인 규칙
– 일반적인 규칙
① 이름 동치(name equivalence)
– 함께 선언되거나 또는 동일 식별자 이름으로 선언되면 동일형
② 구조 동치(structural equivalence)
– 구성요소가 모든 측면에서 같으면 동일형
* 선언 동치(declaration equivalence)
– 이름 동치와 구조 동치의 중간을 택함
– 자료형 이름을 재 선언하여 사용 할 경우 동일형 간주
49
7.9 자료형의 동치 (Equivalence)
•
예)
type T = array [1 .. 100] of integer;
var x, y : array [1 .. 100] of integer;
z : array [1 .. 100] of integer;
w : T;
•
예)
type T2 = ...;
type T1 = T2
•
예)
type T1 = array[1 . . 100] of real;
T2 = array[1 . . 10, 1 . . 10] of real;
규칙 ① : x, y 동치.
w는 x나 z와 다른 형
규칙 ② : x, y, z, w 모두 동치
규칙 ① : T1, T2는 다른 형
규칙 ② : T1, T2는 동치
선언동치도 T1, T2 동치
규칙 ② : T1과 T2는 다른 형
(서로 다른 구조임)
50
7.9 자료형의 동치 (Equivalence)
• 동치 규칙에 대한 장단점 존재
– 이름 동치 : 단순 명료, 자료형 이름 정의 강요
– 구조적 동치 : 순서만 다르고 모든 것이 같은 열거형은 동치형(?)
– 구조적으로는 같으나 개념이 다른 경우
예)
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 : 선언 동치
51
7.9 자료형의 동치 (Equivalence)
• 선언 동치(declaration equivalence)
– 이름 동치에 재 선언 자료형도 동치로 간주
– 이름 동치와 구조 동치 중간 개념
예)
type T1 = array[1..100] of integer ;
type T2 = array[1..100] of integer ;
type T3 = T2 ;
1) 구조 동치 : 세 자료형(T1,T2,T3) 모두 동치
2) 선언 동치 : 두 자료형(T2,T3) 이 동치
3) 이름 동치 : 모두 다른 형
52
7.9 자료형의 동치 (Equivalence)
• 자료형 적법성( type compatibility)
– 객체의 형이 특정 문맥에서 정당한지를 결정하는 의미
규칙들을 의미
– Pascal과 Modular-2
• 동일형에 대한 부분 영역들에 적법성을 부여
X가 [1. . . 100]의 변수
Y가 [-10 . . 10]의 변수
“x := y ; “의 사용 적법
• Ada
– 부자료형(subtype): 부분 영역형 선언
– 유도 자료형(derived type) :부분 영역형을 새로운
자료형으로 간주하는 선언
53
7.9 자료형의 동치 (Equivalence)
•
부 자료형 (sub type)
– Pascal, Modula-2의 부분 영역형
– Ada에서 사용
• subtype aint is INTEGER range 1.. 100 ;
•
파생 자료형 (derived type)
– 부분 영역형을 새 자료형으로 간주
– Ada에서 사용
• type bint is new INTEGER range 100 ;
슬라이드 쇼가 끝났습니다.
54
55
용 어 정리
56
자료형 (data type)
용어 국제 표준 규격 15.04.01
data type
자료형
A defined set of data objects of a specified data structure and a set of permissible operations,
such that these data objects act as operands in the execution of any one of these operations.
<Example> An integer type has a very simple structure, each occurrence of which, usually called value,
is a representation of a member of a specified range of whole numbers and the permissible
operations include the usual arithmetic operations on these integers.
<NOTE> The term " type" may be used instead of "data type" when there is no ambiguity.
명시된 자료 구조를 갖는 자료 객체들의 정의된 집합과, 어떤 연산의 수행 중 그 자료객체가
피 연산자로 쓰이도록 허용된 연산들의 집합
<예> 정수형은 매우 간단한 구조를 가지며, 통상 값이라 불리는 것 즉 정수형의 값은 명시된 범위의 전체 수
중 한 원소의 표현이다. 그리고 이것에 허용된 연산으로는 이러한 정수에 대한 통상의 산술 연산이
포함된다.
<주> 모호성이 없으면 “형(type)”은 “자료형(data type)”을 대신하여 사용되어질 수 있다.
57
강자료형 (strong typing)
용어 국제 표준 규격 15.04.30
strong typing
강자료형
Enforcement of the requirement that operands in a language construct must be of data
types compatible with those of the operation or have explicitly undergone type
conversion before the operation is performed.
<Example> The strong typing in Ada makes the addition of 2 + 3.5 illegal, because 2 is
an integer and 3.5 a real number.
언어 구성자에서 쓰인 피연사자들이 해당 연산에 적법한(compotible) 자료형이기를
요구하거나 연산이 수행되기 전에 명시적인 형 변환을 수행하도록 하는 요구 하는.
<예> 강자료형인 Ada에서 2 + 3.5 덧셈은 부적절하다. 왜냐하면 2는 정수이고, 3.5는
실수이기 때문이다
58
스칼라형 (data type)
용어 국제 표준 규격 15.04.04
scalar type
simple type
스칼라형
단순형
A data type, each instance of which represents a scalar.
<NOTE> pascal scalar types are either ordinal types or real types. Ada scalar types are
either discrete types or real types
각각의 인스턴스가 스칼라인 자료형
<주> Pascal의 스칼라형은 서수형이나 실수형이다. Ada의 스칼라형은 이산형이나
실수형이다.
59
다형성 (polymorphism)
용어 국제 표준 규격 15.09.10
polymorphism
다형성
The ability of different objects to respond to the same message differently.
다양한 객체들이 동일한 메시지에 다르게 응답하는 능력.
60
집합체 (aggregate)
용어 국제 표준 규격 15.03.06
aggregate
집합체
A structured collection of components, where the components may have the same or
different data structure, and where the data structure of the collection itself may also
be a constituent part of a corresponding composite type.
구조화된 구성 요소들의 모임인데, 그 구성 요소들은 동일하거나 상이한 다른
자료구조들을 가질 수 있으며 그 모임자체의 자료 구조 또한 상응하는 혼합형의
부분요소가 될 수 있다.
61
배열형 (array type)
용어 국제 표준 규격 15.04.19(15.03.08)
1. array type
2. array
배열형
배열
1.
A composite type whose components are the same data type.
2.
An aggregate that is an instance of an array type and each element or appropriate
group of elements in which may be referenced randomly and independently of the
others.
<NOTE> Array types may be organized and referenced as if the components were
arranged in columns,rows, etc.
1.
구성원들이 동일한 자료형인 복합형
2.
각 요소 또는 적정 그룹의 요소들이 다른 요소들과 독립적으로 임의로 참조될 수
있는, 배열형의 인스턴스인 집합체
<주> 배열형은 마치 구성 요소들이 열, 행으로 정렬되는 것처럼 구성되거나 참조 될 수
있다.
62
배열 슬라이스 (array slice)
용어 국제 표준 규격 15.03.09
array slice
slice
배열 슬라이스
슬라이스
A portion of an array that consists of contiguous cells along any dimension.
<NOTE> In Ada, an array slice is also a basic operation.
배열에서, 임의 한 차원에서의 연속적인 원소들로 구성되어진 부분
<주> Ada에서 배열 슬라이스는 기본 연산이다.
63
레코드형 (record type)
용어 국제 표준 규격 15.04.20
record type
레코드형
A composite type whose components are field types or other record types.
<Example> A personnel record may consist of personal arranged as fields or
subrecords within this personnel record.
<NOTE> 1. A record type defines a set of values and operations. An instance of such a
record type may contain values which themselves are records.
2. This definition is identical to the definition in entry 17.05.13 of ISO/IEC
2382-17. The example and notes have been added.
구성요소들이 필드형 또는 다른 레코드형인 복합형
<예> 사원 레코드는 이 사원 레코드내의 필드 또는 하위레코드로 정렬된 개인
데이터로 구성될 수 있다.
<주> 1. 레코드형은 값과 연산의 집합을 정의한다. 이런 레코드형의 인스턴스는 그
자신이 레코드인 값을 갖을 수 있다.
2. 이 정의는 ISO/IEC 2382-17의 17.05.13 항목의 정의와 같다. 예와 주석문이
추가되어 왔다.
64
가변부 (variant part)
용어 국제 표준 규격 15.03.10
variant part
가변부
A part of a record, composed of data objects, whose corresponding data structures or
declared data types may vary.
<NOTE> Both the number of data objects and their composition may vary.
자료 객체들로 구성된 레코드의 한 부분으로, 해당 자료구조나 선언된 자료형이 변할
수 있는 부분
<주> 자료 객체의 수와 그들의 구성 모두 변형될 수 있다.
65
판별자 (discriminant)
용어 국제 표준 규격 15.03.12
discriminant (noun)
판별자 (명사)
A parameter-like language construct that indicates the data structure to be used within
a given variant record.
주어진 가변 레코드에서 사용되는 자료구조를 가리키는 매개변수와 유사한 언어
구성자
66
포인터 (pointer)
용어 국제 표준 규격 15.03.20
pointer (in programming language)
포인터(프로그래밍 언어에서)
A data object whose data value is the address of another data object.
자신의 자료값이 다른 자료 객체의 주소가 되는 자료 객체
67
자료형 변환 (type conversion)
용어 국제 표준 규격 15.03.09
type conversion
형 변환
Transformation of the representation of data value of one data type to that of another
data type, usually performed to avoid an illegal data type mismatch.
<NOTE> Type conversion among numeric types frequently is permitted but may cause
loss of accuracy, precision, or both.
한 자료형의 자료값 표현을 다른 자료형의 자료값 표현으로 변환하는 것, 보통 다른
자료형과의 타입이 맞지 않음을 피하기 위해 수행
<주> 수치형 사이에서 형변환은 자주 허락된다. 그러나 정확도, 정밀도 또는 둘 모두를
잃게되는 원인이 될 수 있다.
68
부분 자료형 (sub type)
용어 국제 표준 규격 15.04.22
sub type
부분 자료형
A data type derived from another data type by one or more constraints on that other
data type.
다른 자료형에 대한 하나 이상의 제약조건에 의해 그 자료형으로부터 파생된 자료형
69
파생 자료형 (derived type)
용어 국제 표준 규격 15.04.28
derived type
파생 자료형
A data type whose data values and operations are replicas of those of an existing parent type.
<NOTE> 1. Strong typing prohibits operations among data values of different derived type, or
between a derived type and a parent type, unless explicit type conversion is used.
2. The set of data value or the applicable operations of derived type may be reduced or
expanded.
3. Contrast with parent type.
자료값과 연산들이 기존의 원 자료형에서 복사된 자료형
<주> 1. 만약 명백한 형 변환이 사용되지 않는다면, 강자료형은 다른 유도 자료형들의 자료값들
사이의 연산이나 유도 자료형과 원 자료형 사이의 연산을 금지한다.
2. 파생 자료형의 자료값 또는 적용가능한 연산들의 집합은 감소되거나 확장되어 질 수 있다.
3. 원 자료형과 대조