델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · web viewor : 합 연산자 xor :...

59
▣ 기기기기 기기기 기기기 C 기기 // : 기기기기 {} : 기기기 기기 (* *) : 기기기 기기 // 기기기기 /* */ 기기기기기 ; : 기기기 기 Begin .. end; : 기기 기기기기 기기 ; 기기기 기 { } 기기 기기기기 기기 := 기 : a := b + c ; = 기 : a = b + c ; = 기 : if a = b then begin end ; == 기 : if (a == b ) { } {$ } - > 기기기기 기기기 # :: 기기기 기기기 ▣ 변변변 변변 * 기기기 기기기 기기기기 기기기 기기 기기기 기기기 * 기기기 기기기기 기기기 기기 기기 기 기기 기기기 기기기 기기 기기기기 기기기기 기기기 기기기

Upload: others

Post on 05-Sep-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

▣ 기본적인 사항들 ▣ 델파이 C 자바

주석

// : 한줄주석{} : 여러줄 주석(* *) : 여러줄 주석

// 한줄주석/* */ 여러줄주석

문장

; : 문장의 끝Begin .. end; : 항상 한상으로 존재

; 문장의 끝{ } 항상 한상으로 존재

할당

:= 예 : a := b + c ;

=예 : a = b + c ;

동치

= 예 : if a = b then

begin end ;

== 예 : if (a == b )

{ } 특수기호

{$ } - > 컴파일러 지시자 # :: 전처리 지시자

▣ 변수와 상수 ▣ * 변수와 상수는 메모리가 가지고 있는 데이터 값이다* 변수는 메모리의 데이터 값이 변할 수 있고 상수는 데이터 값이 프로그램 실행도중 변하지 못한다* 상수가 존재하는 이유는 세상에는 변하면 안되는 것이 있기때문 (예 : 1일은 24시간, 1년은 12달, 부과세는 10% 등등…)

델파이 C 자바변수명

* 대소문자 구분안함* 영문 255 자이내 가능* 특수문자 사용못함 , ‘_’ 는 제외* 예약어 사용 못함* 변수 이름에 첫글자는 반드시 문자형이어야 함

* 대소문자 구분 함* 영문 31 자이내 가능* 특수문자 사용못함 , ‘_’ 는 제외* 키워드 사용 못함* 변수 이름에 첫글자는 반드시 문자형 또는 _ 함

지역변수

* 함수나 프로시저내에 존재하는 변수* 반드시 ‘var’ 을 먼저 선언함 예 :Procedure do ;VarX, Y : integer ;BeginEnd;

* 함수내에 존재하는 변수* 기억부류 데이터타입 변수명 = 값

예 : Auto int aint = 10 ;

전역번수

* 함수나 프로시저 바깥에 존재하는 변수* 반드시 ‘var’ 을 먼저 선언함

Unit unit1 ;interface

* 함수 바깥에 존재하는 변수예 : int a,b ; a = 10 ; b = 20 ;

Page 2: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

VarForm1 : Tform ; -- 모든 유닛 전역변수ImplementationVarAint : integer ; -- unit1내의 전역변수Procedure do ;BeginEnd;End.

주1) 전역변수는 가끔적 사용안하는 것이 좋다주2) 전역변수 사용시 전역변수임을 표시하는 것이 좋다 예 g_col : integer : ‘g_’ -> 모든 유닛 전역변수임을 표시

u_col : integer : ‘u_’ -> 유닛내의 전역변수임을 표시주3) 위처럼 지역변수 와 전역변수를 구분하는 것이 좋다주4) 전역변수 이름 충돌 주의요망

주1) c는 변수명에 대소문자 구분하니 특히 주의 바람주2) c는 변수명앞에 컴파일러에게 var 이란 예약어가 없어서c컴파일러가 어쩌다 한번씩 혼동 함

상수명

* 대소문자 구분안함* 영문 255 자이내 가능* 특수문자 사용못함 , ‘_’ 는 제외* 예약어 사용 못함* 상수명 이름에 첫글자는 반드시 문자형이어야 함

* 대소문자 구분 함* 영문 31 자이내 가능* 특수문자 사용못함 , ‘_’ 는 제외* 키워드 사용 못함* 상수명 이름에 첫글자는 반드시 문자형이어야 함

지역상수

* 함수나 프로시저내에 존재하는 상수* 반드시 ‘const’ 을 먼저 선언함 예 :Procedure do ;constX = 10 ;BeginEnd;

* 함수 내에 존재하는 상수Const 데이터형 상수명 = 값 ;

예 : const int kim_int = 10 ;

주1) Const를 생략가능하나 생략시 가끔식 오류발생

전역상수

* 함수나 프로시저 바깥에 존재하는 상수* 반드시 ‘‘const’ 을 먼저 선언함

Unit unit1 ;interfaceconstbugase = 0.1 ; -- 모든 유닛 전역상수Implementation

매크로상수#define 상수명 상수값 예 : #define kim_int 10 ;

주1) 매크로상수는 델파이의 전역상수와 같다주2) #define을 ‘전처리지시자’ 라고 번역한다주3) c는 델파이처럼 각 유닛간의 명확한 범위가 없으므로 전역상수(매크로상수) 선언시 상수명 끼리 이름 충돌을

Page 3: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

consta_const = ‘연습용’ ; -- unit1내의 전역상수Procedure do ;주1) interface 내에 선언된 상수는 다른 유닛에서도 사용 가능하며 Implementation 내에 선언된 상수는 해당 유닛내에서만 사용가능 함주2) 전역상수는 이름충돌 주의 요망

특히 주의 요망

형정의상수

constbugase: real = 0.1 ; 주1) 위처럼 형정의된 상수는 실행도중 값 변경가능{$j+}주2) 컴파일러 지시자를 {$j-} 로 고치면 형정의된 상수 도 실앵도중 값을 변경할 수 없다

C는 델파이처럼 자료형을 엄격히 구분하지 않으므로 ‘형정의상수’ 와 ‘상수’ 라는 명확한 개념이 없다

리소스상수

ResourcestringConst_name = ‘상수명’ ;주1) 리소스 상수는 프로그램 리소스 안에 저장된다주2) 리소스 상수는 서로 다른 언어간에 번역에 이용됨

없음

▣ 자료형 ▣사용이유 : 자료형을 사용하는 이유는 CPU 에게 메모리의 사용량을 알려주기 위해서 이다. 즉 어떤 변수명이 얼마만큼의 메모리를 차지하는지 CPU가 알아야지

CPU는 그 메모리가 가지고 있는 데이터를 가져올 수 있다속도 : 델파이는 변수명에 엄격한 자료형을 사용함으로써 속도가 빠르지만C나 자바는 그렇지 못하기에 속도가 느리다종류 : 숫자형, 문자형, boolean형,배열형(array), 집합형(set), 레코드형(record), 클래스형(class), 가변형(variant),열거형(emun),부분범위형(subrange),

포인터형(point),프로시저형(procedural) , 사용자정의형

1.숫자형 자료형 (integer $ real types)델파이 C 자바

정수형

Btye : -128..127 - 1바이트 Word : 0..65535 - 2 Longword : 0..4294967295 - 4Shortint : -128..127 - 1Smallint : -32768..32767 - 2Longint : -2147483648..2147483647 - 4Integer : -2147483648..2147483647 - 4Cardinal : 0..4294967295 - 4Int64 : -2e63..2e63-1 - 8

주1) Integer와Cardinal는 시스템에 따라 크기변하고 나머지는 고정형 크기

Char : -128..127 - 1바이트Signed chat : -128..127 - 1바이트unsigned chat : 0..255 - 1바이트int : -32768..32767 - 2short int : -32768..32767 - 2unsigned int : 0..65535 - 2unsigned short int : 0..65535 - 2long : -2147483648..2147483647 - 4unsigned long int : 0..4294967295 - 4

주1) 1바이트라도 32비트 cpu는4바이트씩 끝어서 읽음주2) 통신을 제외하면 Char나int 나long의 속도차는 없음

Page 4: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

오히려 cpu는4바이트씩 끝어서 읽어므로 Char 보다 Long이 빠를 수도 있음 – 통신제외

실수형

Real48 : -2.9e39..1.7e38 - 6Single : -1.5e45..3.4e38 - 4Double : -5.0e324..1.7e308 - 8Real : -5.0e324..1.7e308 - 8Extended : 3.6e4951..1.1e4932 - 10Comp : 2e63 + 1.. 2e63-1 - 8Currency : -922조.5477..922조.5807 - 8

주1) Real48구 델파이 버전의 호환용주2) 실수형은 Real 이나 Double 사용이 무난주3) Extended는 물리학에서 주로사용주4) Currency는 화폐형으로 주로사용주5) Currency 부동소수점이 아니고 고정소수점형주6) Comp는 실제로는 정수형임주7) Real은 시스템에 따라 크기변함 주8) Real외 나머지는 크기가 고정되어 있음

Float : 소수점6자리 까지 - 4바이트Double : 소수점 15 자리 까지 - 8바이트Long Double : - 10 바이트

주1) c에서 실수연산은 전부 부동소수점이다주2) c에서는 Currency 처럼 고정소수점이 없다

2. 문자형 자료형 (string types)C의 최대의 실수는 문자열 정보가 맨끝에 있다는 것이다 그래서C는CPU가 문자열을 읽는데 속도가 느리다

델파이 C 자바아스키코드형

* 문자를 아스키코드로 변환할려면 byte나ord를 이용* 반대의 경우에는 chr를 사용하면 됨예:VarI : integer ; s : string ; c,d,e : char ;Begin

I := ord(‘A’) ; -- 65 대입c := chr(65) ; -- ‘A’ 대입 d := ‘a’ ;s := ‘abc’ ;e := s[1] ; ‘a’ 가 대입된다

End;주1) String과array of Char는 둘다 배열이지만 String[0] 은 문자열 길이를 가지고 있고 Char[0] 은 첫번재 문자를 가지고 있다

* 문자는 ‘’ : 문자열은 “”char st = ‘A’ ; // 1바이트와 아래는 완전 동일char st = 65 ; char st[] = “A” ; // 2바이트 - > A와 \0문자

주1) 아스키코드는 메모리를1바이트 차지하는 단순한 숫자다

문 * 문자열은 사실 배열이다 * 문자열은 배열이다

Page 5: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

자형

* 문자열은 일종의 포인터다 * 델파이는 문자열 앞에 문자열의 기본정보를 저장예:Proceure do ;vara : string;begina := ‘Hello World’;end;에서a[1] 은H 등등

char str[4] = {‘a’,’b’,’c’,’\0’} ;char str[4] = “abc” ;char str[] = “abc” ;* 문자열 포인터char *str1 ;char str2[] = “abc” ;str1 = str2 ; // str2의 배열메모리주소 str1에 대입puts(str1) // abc 출력* 문자열 배열 포인터char *astr[] = {“ab”, “cd”,”ef”} ;주1) c에서 \0(널문자) 이 필요한 이유는 cpu 에게 문자열의

마지막을 알리기 위함일반문자형

* 미국에서 정한 표준문자열* 영어는1바이트 한글은2바이트* ansistring은 일종의 포인터다* ansistring은 참조횟수 보존기법을 사용한다* ansistring은 그냥 string 이라고 쓰면 된다* ansistring은 일종의 동적배열과 같다* ansistring의 배열은 델파이가 자동으로 동적으로

메모리를 배열하고 해제한다///////////////////////예1) VarS : string ;A : array[0..3] of char ;Begin

S := ‘abc’ 4바이트 동적배열 생성후 글짜 대입A[1] := ‘a’ ;A[2] := ‘b’ ;A[3] := ‘c’ ;

End;//////////////////////////예2) var st1, st2 : string ;begin st1 := ‘abc’ ; // 문자열은 포인터다 - > ‘abc’ 가 대입이 안되고 // st1의 메모리주소가 st2에 대입된다

Page 6: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

st2 := st1 ; edit1.Text := inttostr(integer(st1)); edit2.Text := inttostr(integer(st2));

// edit1과edit2의 내용이 같다// st1과st2는 같은 메모리주소를 가진다// st1과st2의 크기는4바이트 – 포인터임

end;유니코드문자형

* 국제표준이다* 하나의 문자는2바이트 크기를 가진다* widestring은 유니코드 문자형이다

없음

호환문자형

없음

3. boolean형 자료형 (boolean types)* boolean형 은true(1) 와false(0) 의 자료형이다* 델파이에서 -1은 존재하지 않는다는 의미로 많이 사용함

델파이 C 자바불리언

bolean : 0(false) 또는1(true) - 2 bytebool : 0(false) 또는1(true) - 1 wordbool : 0(false) 또는1(true) - 2 longbool : 0(false) 또는1(true) - 4

주1) bytebool, wordbool, longbool의 존재이유는 다른 언어와의 호완성 때문

0 : 거짓 0이외의 값 : 참

사용예

예 :Ord(false) -> 0Ord(true) -> 1 ;Succ(false) -> true ;Pred(true) -> false ;

4. 열거형(enum)형 자료형 (enumerated types)* 열거형을 사용하는 이유는 이름의 통일성을 확보하기 위해서이다

Page 7: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

* 예 : 월,화,수,목,금,토,일 등을 열거형 으로 사용하면 동일 프로그램에서 이름 충돌을 방지할 수 있다* 열거형은 일종의 사용자정의 자료형이다 -> 서수형 자료형

델파이 C 자바열거형

Type enum_name = (var1, .. , var9) ;또는Type enum_name = (var1 = 12, .. , var9 = 19) ;주1) 열거형은 사용자정의 서수형 자료형임주2) 열거형의 인덱스는0부터 시작한다 주3) 인덱스가 미리 정해진 경우에는 정해진 인

데스를 사용함

enum 이름{원소들} 변수1,변수2 ;또는enum kim{ab=1,ed,gt} ; // 인덱스가1부터 시작enum kim kim1,kim2;주1) 열거형의 인덱스는0부터 시작한다 주2) 인덱스가 미리 정해진 경우에는 정해진 인데스를 사용함

사용예

unit Unit2;interface

type T_suit = (club,diamond, heart, spade) ; T_class = class procedure an_doing ; end;

var an_class : T_Class ;

implementation

procedure T_class.an_doing; var an_suit : T_suit ;begin

an_suit := club ; ord(an_suit) - > 0 ;inc(an_suit) - > 1 ;

end;end.

5. 부분범위형 자료형 (subrange types)* 부분범위형을 사용하는 이유는 전체집합에서 일정한 부분만을 사용하기 위해서이다

델파이 C 자바열 Type range_name = 100..200 ; 없음

Page 8: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

거형 주1) 부분범위형은 사용자정의 서수형 자료형사용예

unit Unit2;interface

typeT_suit = (club,diamond, heart, spade) ;T_range = club..heart ; -> 부분범위형

T_class = class procedure an_doing ; end;

var an_class : T_Class ;

implementation

procedure T_class.an_doing; var

an_suit : T_suit ;an_range : T_range ;

beginan_suit := club ; an_range := club ; (ok)an_range := spade ; (에러)

end;end.

* 예 : 월,화,수,목,금,토,일 등을 열거형 으로 사용하면 동일 프로

6. 집합형 자료형 (set types)* 집합형을 사용하는 이유는 인간생활이 하나의 집합형태이기 때문이다

델파이 C 자바집합형

Type set of 범위형

주1) 집합형은 범위를 가지고 있는 것 만이 사용주2) 집합형은 원소가 256 이하이여함

없음

사 unit Unit2;

Page 9: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

용예

interface

typeT_suit=(club,diamond, heart, spade); ->열거형;T_range = club..heart ; -> 부분범위형T_set = set of T_range; -> 집합형

T_class = class procedure an_doing ; end;

var an_class : T_Class ;

implementation

procedure T_class.an_doing; var

an_suit : T_suit ;an_range : T_range ;an_set : T_set ;

beginan_suit := club ; an_range := club ; (ok)an_range := spade ; (에러)an_set := []; -> 공집합an_set := [club,diamond]; -> 원소 두개an_set := [kim]; -> 에러,kim 원소없음 if club in an_set thenbeginend;edit1.Font.Style := edit1.Font.Style+[fsBold] ;edit1.Font.Style := edit1.Font.Style-[fsBold] ;

end;end.

7. 배열형 자료형 (array types)* 배열형을 사용하는 이유는 메모리를 보다 효율적으로 사용하기 위함 * 프로그램 시작과 동시에 메모리의 일정량을 미리 할당 받으면 프로그램 속도 빠름

Page 10: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

델파이 C 자바정적배열

Type array[1..24] of 기본형 2차원배열Type array[1..24,1..24] of 기본형 Type array[1..24] of array[1..10] of 기본형 Type array[boolean,1..24] of 기본형 주1) 배열의 요소는 순서있는 서수형만 사용가능주2) 배열은 인댁스가c처럼0이 아니도 됨주3) 배열은 메모리 요구량이2GB를 초과 못함주4) 정적배열 @a와 @a[0] 의 메모리주소 동일

일차원배열 : 자료형 배열명[배열크기] ;이차원배열 : 자료형 배열명[행크기][열크기] ;int b[3] = {1,2,3} ; int a[10] = {1,3.} ; // 일부만 초기화하면 나머지는0int c[] = {1,3,5,7} ;주1) 배열명은 포인터상수다주2) 배열인덱스는0부터 시작주3) 배열의 크기가 없는경우 초기화된 개수가 배열크기주4) 정적배열은 크기가 결정되면 크기변경 안됨

사용예

unit Unit2;

interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;

typeT_suit=(club,diamond, heart, spade); //열거형;T_range = club..heart ; // 부분범위형T_set = set of T_range; // 집합형T_array1 = array[1..24] of integer ;T_array2 = array[boolean,1..24] of integer ;T_array3 = array[1..5,T_range] of integer ;T_class = classconstructor create ;publicprocedure an_doing ;end;

varan_class : T_Class ;

implementation

uses Unit1;

procedure T_class.an_doing;var

int c[10] ;c[0] := 10 ;c[1+3] := 2 ;* 2차원배열int s[2][3] = { {1,2,3},{4,5,6}} ;

* 배열복사int c1[5],c2[5]={1,2,3,4,5} ;c1 = c2 // 에러발생* 배열복사는 모든원소를 복사해야함 for (i=0 ; i<=4 ; i++) {

c1[i] = c2[i]} ;

* 배열과 포인터

* 문자열과 배열

Page 11: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

an_range : T_range ;an_array1 : T_array1 ;an_array2 : T_array2 ;an_array3 : T_array3 ;row_buf , col_buf : integer ;beginan_range := club ; //(ok)for row_buf := low(an_array1) to high(an_array1) dobeginan_array1[row_buf] := row_buf + 10 ;end;an_array2[true,1] := 100 ;an_array3[1,club] := 200 ;Form1.edit1.Text := inttostr(an_array2[true,1]) ;Form1.edit2.Text := inttostr(an_array3[1,club]) ;Form1.edit3.Text := inttostr(high(an_array1)) ;Form1.edit4.Text := inttostr(an_array1[24]) ;end;

constructor T_class.create;beginan_class := T_Class.create ;end;

end.동적배열

Type array] of 기본형 2차원배열Type array of array of 기본형 주1) 동적배열은 일종의 포인터다(4바이트)주2) 동적배열은 참조횟수검사기법을 사용한다주3) 동적배열은 메모리 요구량이2GB 이내주4) 동적배열은 setlength을 이용 메모리 할당주5) 동적배열은 포인터므로 메모리 해제 -> nil주6) 동적배열 인덱스는 반드시0부터 시작주7) 동적배열 @a와 @a[0] 의 메모리주소 다름

* 명확히 없음* 다만 malloc() 와free() 와 포인터를 적절히 사용하면

가능

사용예

VarA, B : array of integer ;Begin

Page 12: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

setlength(A,10) // 10개 배열생성setlength(B,5) // 5개 배열생성A[0] := 10 ;B[0] := A[0] ;B[0] := 20 ;// A[0], B[0] 둘다 20임 동적배열은 포인터// 이기 때문

End;// 이차원배열VarA : array of array of string ;Row,Col : integer ;Begin

setlength(A,10) // 행10개 생성for row := low(A) to high(A) dobegin setlength(A[row],5) ; //각 행에 열5개 생성 for col := low(A[row]) to high(A[row]) do

begin A[row,col] := inttostr(row) + ‘,’ +

inttostr(col) ;Grid.Cells[col,row]:= A[row,col] ;

end;end;if A <> nil thenbegin A := nil ; // 메모리 해제 ;end;

End;

8. 레코드형 자료형 (array types)* 레코드을 사용하는 이유는 사람은 이름,나이,키,등등 서로 데이타 타입이 다른 요소를 가지고 있기 때문* 레코드형은 일종의 사용자 정의 자료형이다

델파이 C 자바기본형

레코드이름 = record필드1 : 자료형 ;필드2 : 자료형 ;등등 … ;

struct 구조체명 {자료형 멤버이름 ;자료형 멤버이름 ;등등…

Page 13: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

End ;

주1) 레코드형은 TYPE 절에서 사용하는 것이 좋음주2) 레코드형과 포인터를 적절히 사용하면 프로 그램의 속도가 빠르다

} 구조체변수명들 ;

비트구조체

struct 구조체명 {자료형 멤버이름 : 비트수 ;자료형 멤버이름 : 비트수 ;등등…

} 구조체변수명들 ;주1)비트구조체는 통신이나 하드웨어 제어에 적합주2)비트구조체를 잘못사용하면 프로그램 속도가 오히려 더 떨어짐 - > cpu 는 한번에 32 bit 읽음

사용예

TypeTdate = record

Year : integer ;Month : 1..12 ;Day : 1..31 ;

End;

Var Aday, Bday : Tdate ;Begin

Aday.year := 2005 ;Aday.month := 12 ;Aday.day := 28 ;Bday := Aday ;

End;

1. 일반 구조체struct date {

int year ;int month ;int day ;

} d1, d2 = {2007,1,1} ; int x, y ;

d1 = d2 ; // d2를d1에 복사x = d1.year ; // d1의 멤버 year을x에 할당y = d1.month ; // d1의 멤버 month을x에 할당

주1) 구조체 멤버호출시 [구조체변수명.멤버명] 처럼 (.) 사용

2. 비트구조체struct han_code{

unsigned sigh : 1 ;unsigned cho : 5 ;unsigned joong : 5 ;unsigned jong : 5 ;

} h_code ;가변형레코드

Tdate = recordName : string ; // 고정필드Case sort : integer of // 태그필드 1 : (value : integer) ; 2 : (areal : rea;) ;

End;

union 공용체명 {자료형 멤버이름 ;자료형 멤버이름 ;등등…

} 공용체변수명들 ;* 공용체의 크기는 가장큰 멤버의 크기 임

Page 14: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

* 공용체는 같은 메모리 공간을 멤버가 공유함예제 :union example {

char c ; int x ;

} ex1 ;ex1.c = ‘c’ ;또는ex1.x = 10 ;

포인터레코드

TypeTdate = record

Year : integer ;Month : 1..12 ;Day : 1..31 ;

End;Pdate = ^Tdate ;

Procedure TForm1.BtnClick(Sender:TObject); var re1, re2 : TAdate ; P1 : Pdate ;begin re1.Year := 2000 ; P1 := @re1 ; // 주소줄 대입 re2 := re1 ; // 데이터 자체 복사 // 아래 둘다 2000이 나온다 re_Edit1.Text := inttostr(p1^.Year) ; re_Edit2.Text := inttostr(re2.Year) ;end;

주1) 위처럼 주소줄만 복사하는 것이 빠르다주2) 메모리 주소는 단지4바이트이다

struct date {int year ;int month ;int day ;

} d1 = {2007,1,1} ;struct date *d2 ; // 구조체 포인터 선언int x, y, z ;x = d1.year ; d2 = &d1 ; // d2에d1의 메모리주소 할당y = d2->month ; //

패키드레코드

레코드이름 = packed recordEnd;

주1) 32비트 컴퓨터는 데이터정보를4바이트씩 처리주2) 만약 record의 크기가 13 이면 델파이는 그

크기를 16 으로 바꾼다 속도가 빠름주3) 하지만 record 앞에 packed 라는 예약어를

없음

Page 15: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

사용하면 본래의 크기인 13이 나온다주4) packed record는 일반적으로 record 보다

속도가 느리다 주5) 다른 언어와의 호완성과 통신을 고려하면

packed 를 사용하는 것이 좋다

9. 가변형 자료형 (Variant types)* 가변형을 사용하는 이유는 다른 언어와 의 호완성 때문이다* 가변형은 CPU가 데이터형을 일일이 검사하기 때문에 일반자료형보다 10배 이상 느리다

델파이 C 자바기본형

VarV : variant ;Begin

V := 10 ;V := ‘abc’ ;

End;

없음

가변형데이타형들

Varempty, varnull, varinteger, varsingle,Vardouble, varstring, varboolean,varVariant

주1) 기본형에다 var을 붙이면 된다

가변형배열생성

var VA : Variant;

Begin // 10개 가변형 배열생성

VA := VarArrayCreate([1,10 ], varVariant);VA[1] := 10 ;VA[2] := ‘abc’ ;

End;

주1) varVariant 대신에 varstring, varinteger등.주2) 2차원배열도 가능하다

OLE

OLEVariant는 윈도와 리룩스를 위해 존재Variant는 델파이를 위해 존재

Page 16: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

10. 포인터형 자료형 (Pointer types)* 포인터형을 사용하는 이유는 속도와 메모리 절약 때문이다* 포인터는 마치 사단장이 연대장에게 명령하는 것 과 같다. 나머지는 연대장이 알아서 한다* 최근에는 포인터라는 용어대신 참조(reference) 라는 말을 많이 사용한다* CPU가 메모리에서 포인터를 읽어면 그 포인터가 가지고 있는 메모리 주소의 데이터를 다시 읽는다* 델파이에서 포인터형에 데이터형이 존재하는 이유는 CPU 에게 포인터가 기지고 있는 메모리주소줄의 데이터형을 알려주기 위함 - > 속도 빠름

델파이 C 자바기본형

VarX,Y : integer ;P1 , P2: ^integer ;Begin

X := 10 ;P1 := @X ; // X의 메모리주소P에 대입P2 := addr(X) ;Y := P^ ; // CPU는P가 가지고 메리리주소 읽음// CPU그 주소줄의 데이터를 읽음// 그래서Y는10임

End;주1) @ 작용자는 메모리주소를 돌려준다주2) @ 와addr은 기본적으로 동일주3) ^ 는dereference = 참조값

1. 자료형 *포인터변수Int a,b, *p, *pp;a = 10 ;p = &a ; // p에a의 메모리 주소 대입b = *p ; // b=10 ,b에p가 가지고있는 메모리주소의 값 대입pp = null ;주1) & 작용자는 메모리주소를 돌려준다주2) 포인터 변수명에 * 는dereference = 참조값 임주3) null은 포인터가 아무런 값도 가지고 있지 않음2. 이중포인터int i = 100; int *p = &i; int **q = &p; // 이중포인터임 : p의 메모리주소 간직*p = 200 ; // i의 값200 ;**q = 300 ; // i의 값3003. 포인터 배열int *ap[3] = {&a, &b, &c}; // ap 라는 포인터배열3개 생성char *s[] = {“ac”, “bns”, “qwes”} ;// 문자열 포인터 배열을 사용하면 메모리가 낭비 안됨

문자열포인터

var st1, st2 : string ;begin // 동적으로 string 배열5개 생성 st1 := ‘abcd’ ; st2 := st1 ; // st1, 과st2는 같은 메모리 주소 Edit1.Text := inttostr(integer(st1)) ; Edit2.Text := inttostr(integer(st2)) ;

// st1, 과st2는 4바이트 포인터 임 Edit3.Text := inttostr(sizeof(st1)) ; Edit4.Text := inttostr(sizeof(st2)) ;

1. char a[] = “abc” ;2. char *p = “abc” ;

위의1에서 배열명a는 포인터 상수다위의2에서p는 포인터 변수다

주1) C는 문자열을 멍청하게 다룬다주2) C는 델파이처럼 문자열을 동적으로 배열한 후 자동으로 메모리에 배치하지도 않고 자동으로 메모리에서 제거하지 않는다

Page 17: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

End;

주1) 문자열은 동적배열을 대표하는 포인터다주2) 델파이에서는 문자열의 동적배열과 해제를 자동으로 알아서 한다

포인터주소표시

var x, y : integer ; p : ^integer ;begin x := 10 ; p := @x ;

y := p^ ;// 같은 메모리 주소가 나옴 - > x의 주소

Edit5.Text := inttostr(integer(p)) ;Edit6.Text := inttostr(integer(@x)) ;// 포인터 자체의 메모리 주소나옴 Edit7.Text := inttostr(integer(@p)) ;p := nil ;// 포인터자체가 가진 메모리 주소

Edit8.Text := inttostr(integer(@p)) ;Edit9.Text := inttostr(sizeof(p)) ; // 4바이트

End;주1) nil의 뜻은 포인터가 메모리 주소값을 가지고 있지 않다는 것이지 포인터 자체가 메모리에 없다는 뜻은 아니다

1. 이중포인터 : 포인터주소를 간직한 포인터int i = 100; int *p = &i; int **q = &p; // 이중포인터임 : p의 메모리주소 간직*p = 200 ; // i의 값200 ;**q = 300 ; // i의 값300

2. void 포인터 : 자료형이 없는 포인터 void *vp ; *(int *)vp ; // void 포인터를 int형 포인터로 변한 예:Int x=10 ;void *vp ;vp = &x ;*(int *)vp = 30 ; // x는30임

포인터형변환

VarI : integer ;P : pointer ; // 자료형이 없는 포인터Begin i := 10 ;

P := @i ;//자료형이 없는 포인터를 정수형포인터로 변환integer(p^) := 30 ; // 이제부터i는30임

End;메모리동적

1. 자료형이 있는 포인터VarP : ^integer ;Begin

New(p) ; // 포인터에 메모리 동적활당

Page 18: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

할당

P^ := 10 ; // 할당된 메모리에 10 대입Edit1.text := inttostr(p^) ; // 10 나옴Dispose(p) ; // 동적으로 할당된 메모리 해제

End;2. 자료형이 없는 포인터 VarBegin getmem(pp1,4) ; // 4바이트 메모리 할당 integer(pp1^) := 20; rr := integer(pp1^); pppp_edt2.Text := inttostr(rr) ; freemem(pp1) ; // 4바이트 메모리 해제End;주1) 데이터형이 없는 포인터는 동적메모리 할당 은 getmem과FreeMem을 사용주2) 중간에 변화를 주려면, ReallocMem를 사용

함수포인터

함수포인터 또는 프로시저 포인터

Function aaa(x,y: integer) : integer ;Var A : Function (x,y: integer) : integer ; C, D : integer ;Begin A := aaa ; // aaa 함수 메모리 주소 대입 // C와D는 결과 값 동일 C := A(1,1) ;

D := aaa(1,1) ;End;주1)함수포인터는 윈도우의 Callback에 주로사용주2)함수포인터는 같은 형태의 여러 개의 함수가 있을때 사용함주3) 함수포인터(4) : 함수의 메모리 주소값 메소드포인터(8) : 클래스주소값 + 함수의

메모리주소값

반환자료형 (*함수포인터명)(매개변수들,,,) ;

예 :int sum(int x, int y) ; // 함수원형 선언int (*psum)(int x, int y) ; // sum 함수의 함수포인터 선언void aaa() {

int c ;psum = sum ; // sum 함수 메모리주소 대입c = psum(10,20) ; // 또는c = *(psum(10,20)) 또는c = (*psum)(10,20) ;

}

주1)함수포인터 선언시 파라미터의 개수와 자료형 반드시 일치

포인터연산

* 델파이는 Pchar과Pwidechar의 자료형 외에는포인터연산을 지원하지 않음

* 자바나C# 역시 포인터 연산은 엄격히 제한함* 포인터연산의 경우 16 비트컴퓨터와 32비트

컴퓨터등 시스템에 따라 다르기 때문에 실질적

1. 포인터 값의 증가int ii=10, cc,* pp ;pp = &ii ; // ii의 메모리주소 할당cc = (*pp)++ ; // pp가 가르키는 값의 증가 -> 11이 됨2. 메모리 주소 증가

Page 19: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

으로 거의 소용없음 Int aa=10, bb, *p ;p = &aa ; // ii의 메모리주소 할당 - > 메모리주소 : 1000p++ ; // p가 가지고 있는 메모리주소 값2증가 - > 1002됨3. 배열과 포인터 연산int a[] = {1,2,3,4,5} ;int b, c, *p ;p = &a[0] ;b = *(p + 2) ; // b는3 - > 메모리주소가 증가됨주1) 배열의 값이 메모리에 연속적으로 배치될때만 포인터연산

이 가능함 주2) 포인터연산은 기본적으로 정의된 자료형에 크기에 의존 int *p ; double *d ; p++ // 16비터컴퓨터2 , 32비터컴퓨터4. 증가함 d++ // 메모리주소8증가함

11. 연산자델파이 C 자바

할당

:= --- > 할당연산자 = --- > 비교연산자

= ---- > 할당연산자 == ---- > 비교연산자=== ---- > 동치연산자

산술

+ : 더하기- : 빼기

* : 곱하기 / : 실수형 나누기 Div : 정수형 나누기 Mod : 나누기의 나머지 값 대입

+ : 더하기- : 빼기

* : 곱하기 / : 실수형 나누기 % : 나누기의 나머지 값 대입

관계

= : 같다<> : 다르다< : 작다> : 크다<= : 작거나 같다>= : 크거나 같다

== : 같다!= : 다르다< : 작다> : 크다<= : 작거나 같다>= : 크거나 같다

논리

Not : 부정연산자 And : 곱연산자 Or : 합 연산자 Xor : 배타적 연산자

! : 부정연산자 && : 곱연산자 || : 합 연산자

비트

Not : 비트부정연산자 And : 비트곱연산자

~ : 비트부정연산자 & : 비트곱연산자

Page 20: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

논리

Or : 비트합 연산자 Xor : 비트 배타적 연산자 Shr : 우 시프트 연산자 Shl : 좌 시프트 연산자

| : 비트합 연산자 ^ : 비트 배타적 연산자 >> : 우 시프트 연산자 << : 좌 시프트 연산자

집합연산

+ : 합집합 - : 차집합 * : 교집합 <= : 부분집합인가 - > 결과 boolean >= : 포함집합인가 - > 결과 boolean <> : 완전다른집합인가 - > 결과 boolean In : 원소가 집합에 속하는가->결과 boolean

없음

메모리연산

@ : 메모리주소표시 + : pointer addition - : pointer subtraction ^ : pointer dereference= : equality<> : inequality

& : 메모리주소표시 + : pointer addition - : pointer subtraction

연산순서

@, not * , /, div, mod, and , shl, shr , as+ , - , or, xor= , <> , < , > , <= , >= , in , is

12. 제어구조델파이 C 자바

비교문

If a = b then BeginEnd else if a=c thenBeginEnd;

방법1 :::if (a == b){ }else if (a < b){}else{} ;방법2 :::(조건) ? 실행1(true) : 실행2(false) ;(5>2) ? 10 : 5 ; // 5가2보다 크면 10, 아니면5임

CASE

Case x of1..10 : ;0,11 : ;12..13 : ;

switch (x){

case 0 : 실행문 ;

Page 21: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

esleEnd;주1) 변수X는 반드시 서수형 타입이어야 함

break ;case 0 : 실행문 ; break ;default : 실행문 ; break ;

}주1) break가 없으면 아래의 case가 실행됨 – 주의요망

FOR

1. 증가 순환문For x := 0 to 10 do // 11번 순환 BeginEnd;2. 감소 순환문For x := 10 downto 0 do // 11번 순환 BeginEnd;주1) 변수X는 반드시 서수형 타입이어야 함

for (초기값 ; 조건식 ; 증감식){반복문장} ;

예 :::for (i = 0 ; i <= 10 ; i++) // 증감반복

{반복문장} ; // i가11 이되면 (i <= 10) 조건이 거짓이므로 반복안됨for (i = 10 ; I >= 0 ; i--) // 감소반복

{반복문장} ;// i가 -1이되면 (i >= 0) 조건이 거짓이므로 반복안됨

WHILe

While x <= 10 doBegin Inc(x) ;End;주1) 변수X는 반드시 서수형 타입이어야 함주2) While은 무한 루프 조심 요망

int x = 0 ;while (x <= 10){ x++ ;}// x가11 이되면 (x <= 0) 조건이 거짓이므로 반복안됨// 위의0부터 10 까지 11번 반복됨

REPEAT

Repeat 문장1 ;문장2 ;

Until x <= 10 ;주1) Repeat는 순환전 한번을 실행한다주2) Repeat는begin..end 사용안함

int x = 0 ;do{ x++ ;}while (x<= 10) ;주1) do ~ while 문은 순환전 한번 실행함 주2) x가11 이되면 (x <= 0) 조건이 거짓이므로 반복안됨

순환제어

1. break ::: 순환문을 빠져나옴For x := 0 to 10 do // 8번 순환 Begin

If x = 8 thenBegin Break ;

1. break ::: 순환문을 빠져나옴for (i = 0 ; i <= 10 ; i++) {

If (i == 8){ Break ;

Page 22: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

End;End;주1) Break는 이중순환문을 빠져나오지 못함주2) Break는 순환문 다음 문장으로 이동시킴//////////////////////////////////////////////////2. continue For x := 0 to 10 do // 9번째 순환안함 Begin

If x = 8 thenBegin continue ;End;

End;주1) 순환도중 continue를 만나면 그 다음 문장은

실행하지 않고 순한문 첫문장으로 이동 함

} ;};주1) Break는 이중순환문을 빠져나오지 못함주2) Break는 순환문 다음 문장으로 이동시킴//////////////////////////////////////////////////2. continue for (i = 0 ; i <= 10 ; i++) {

If (i == 8){ continue ;} ;

};주1) 순환도중 continue를 만나면 그 다음 문장은 실행하지 않고 순한문 첫문장으로 이동 함

GOTO

Label Move1 ;Var X, Y, Z : integer ;Begin X := 1 ; Goto move1 ; // Move1으로 실행순서 이동함 Y := 2 ; // 실행안됨 Move1 ; // Move1이후부터 실행 Z := 3 ;End;

주1) goto 문은 Label과 함께 사용한다주2) goto 문은 다중순환문을 빠져나올 때 사용함

goto move1 ;문장들….

move1 : // move1 이후부터 실행 됨주1) goto 문을 만나면 goto 아래 문장들은 실행이 안됨주2) goto 문을 만나면 라벨표시된 문장으로 점퍼 이동주3) goto 문은 다중순환문을 빠져 나올 때 사용함

13. 함수(Function) 와 프로시저(procedure)* 수학에서 사용하는 함수와 동일하다고 생각하면 된다 * 함수를 사용하는 가장큰 이유는 소스코드 재활용이다* 델파이는 클래스 내부에 존재하는 함수는 특별히 메소드라는 이름으로 정했다* 함수는 결과 값이 있고 프로시저는 결과 값이 없다

델파이 C 자바기본문

1. 기본형태 Function 함수명(전달인자) : 결과값 ;

1. 기본형태 결과자료형 함수명(자효형 변수명,등등){

Page 23: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

법 unit Unit2;

interface Function 함수명(전달인자) :결과값; // 전역함수

Procedure 프로시저명(전달인자) ; // 전역implementation Function 함수명(전달인자) :결과값; // 지역함수Procedure 프로시저명(전달인자) ; // 지역

end.주1) 전역함수는 unit 밖에서도 호출가능주2) 지역함수는 해당 unit 내에서먼 호출가능주3) @함수명 : 함수명의 메모리 주소주4) 함수명은 일종의 포인터 상수다 즉

해당함수명이 시작되는 메모리 주소

return ; }예 :::int sum(int x, int y) { return = x + y ;}

int y ;y = sum(10,20) ;

호출규약

1. register :2. pascal 3. cdecl4. stdcall5. safecall

cdecl Right first Caller ‘’prepended _register Left first Callee ‘@’prepended _pascal Left first Callee Uppercase _stdcall Right first Callee No change * Right first는 함수의 파라미터를 오른쪽에서 왼쪽으로 평가하여 스택에 푸시하는것을 나타냅니다.

*Caller/Callee는 호출하는쪽 /호출 당하는쪽 에서 스택의 메모리 제거하는 동작을 의미함

* Calling conventionsDirective Parameter order Clean-up

registers?register Left-to-right Routine Yespascal Left-to-right Routine Nocdecl Right-to-left Caller Nostdcall Right-to-left Routine Nosafecall Right-to-left Routine No*register 호출은 CPU registers에 최대3개정도의

파라미터를 전달하여 사용한다* c언어 함수호출규약 : cdecl 

C는 cdecl 호출규약을 사용함나머지는 좌와 동일

Page 24: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

 win16 함수호출규약 : pascal    win32 함수호출규약 : stdcall    델파이 함수호출규약 : fastcall 또는 register

전달인자종류-값전달

** 데이터값 자체 전달 ** Function sum(x,y : integer) : integer ;Begin Result := x + y ; // 또는 //Sum := x + y ;End;Procedure do ; Var x, y, z : integer ;Begin x := 10 ; y := 20 ;

z := sum(x,y) ;End;

주1) 함수 sum(x,y : integer) 의x,y의 값을 복사함주2) 그러므로 sum의 x,y 와 do 의 x,y 는 서로

다른 변수임 주3) 결과값을 Result 나 함수명 둘다 사용해도 됨

- > 보통 Result를 사용함

** 데이터값 자체 전달 **int sum(int x, int y) { return = x + y ;}

int y ;y = sum(10,20) ;

주1)함수는 sum(x,y : integer) 의x,y의 값을 스택메모리에 복사하여 사용함

주2) sum(x,y : integer) 의 x,y의 변수는 함수실행종료와 더불어 스택메모리에서 자동으로 삭제 됨

참조파라미터

** 메모리 주소 값 전달 **Function sum(var x,y : integer) : integer ;Begin Result := x + y ; // 또는 //Sum := x + y ;

X := 30 ;Y := 40 ;

End;Procedure do ; Var x, y, z, t : integer ;Begin x := 10 ; y := 20 ; // @x, @y의 포인터 주소가 전달

** 메모리 주소 값 전달 -- >> 포인터 전달 *** 함수의 매개변수가 포인터 자료형 임int sum(int *x, int *y) { *x = *x + 1 ; // 원본의 x 값도 동시에 변경된다 return = *x + *y ;}호출예int a, b = 200, c = 100 ;a = sum(&b, &c) ; // & 을 사용하여 b 나 c 의 메모리 주소를 매개변수로

전달// 이제부터 b 는 201 임

주1)포인터를 매개변수로 전달하면 프로그램의 가독성이 현저히 손상됨 - > 스파게티 소스코드 됨

Page 25: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

z := sum(x,y) ; // 값30임//이제부터x는30, y는40이 됨T := x + y ; // 값70임

End;주1) sum(var x,y : integer) 에서 x,y의 값이 전달

되는 것이 아니고 x,y의 메모리 주소 값(포인터) 가 전달된다

주2) sum(var x,y : integer) 에서x,y의 값이 변경되면 Do의 x,y의 값도 같이 변경 됨

주3)전달인자로 포인터를 넘기는 이유는 포인터는 4바이트 이기 때문 - > 용량이 적어 속도빠름

주2)포인터를 매개변수로 전달하면 프로그램 실행 빠름주3)매개변수를 가끔적이면 상수파라미터 사용권장

상수파라미터

Function comparestr(const s1,s2 : string) : string ;주1)상수파라미터는 함수내에서 값을 변경못함주2)상수파라미터에 전달되는 것은 사실상 포인터주3)상수파라미터는 4바이트 임주4)상수파라미터는 문자열전달이나 객체의 전달에 자주 사용된다주5)상수파라미는 프로그램의 실행속도 증가시킴주6)상수파라미는 가독성도 아주 좋음

int sum(const int *x, const int *y) 좌와동일

out파라미터

* out 파라미터는 var 파라미터 처럼 메모리주소 넘김* out 파라미터는 초기값 없어도 됨* out 파라미터는 com 이나 corba 에 자주사용예 ::::procedure test1(out tmpStr : String) ;begin

tmpStr := 'OK';end;procedure do_test();varss : String;begin// ss 변수가 초기값이 없이 파라미터로 전달가능

test1(ss);showMessage(ss); // 'OK' 출력

end;

있는지 없는지 모르겠음

자료

* 파라미터가 var, const, out 인 경우 자료형 생략가능

있는지 없는지 모르겠음

Page 26: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

형없는파라미터

* 자료형이 없는 파라미터는 모든 타입의 자료형 전달

배열파라미터

Function sum(const a : array of integer) : integer ; Var I : integer ;Begin

Result := 0 ;For I := low(a) to high(a) do Result := Result + a[i] ;

End;주1) 배열파라미터는 크기가 정해질수 없다주2) 위에서 const 없어도 됨주3) 아래는 에러 발생 – 크기가 정해져 있음

Function sum(a : array[1..10] of integer) : integer ;주4) 아래는 에러가 발생하지 않음

Type Taa = array[1..10] of integer ;Function sum(a : aa) : integer ;

주5)크기가 있는 정적배열을 파라미터로 넘기고 싶으면 먼저 위처럼 먼저 자료형을 선언한 후에 사용함

1. 포인터 기법에 의한 전달int sum(int arr[], int x){}* 배열이 매개변수로 사용될 경우 배열크기 정하면 안됨* int arr[] 가 마치 배열처럼 보이지만 사실은 배열의

메모리 주소가 전달된다 - > 포인터 처럼 *그러므로 함수안에서 배열의 값을 변경하는 원본배열

값도 변경된다

2. 참조기법에 의한 전달int sum(const int arr[], int x){}*배열 앞에 const 라는 키워드가 있어면 함수안에서

배열의 값을 변경해도 원본배열 값은 변경되지 않음* 매개변수의 배열크기를 정하면 안됨

가변형배열파라미터

Function sum(a : array of const) : string ;a : array of const는 자료형에 관계 없이 전달예 : St := sum(10,’abc’, 10.5, true) ;

주1) format 함수를 참조 바람주2) 아래처럼 const를 사용하면 속도 빠름 Function sum(const a : array of const) : string ;

있는지 없는지 모르겠음

디폴

Function sum(a: integer; b:integer=20) : string ;

있는지 없는지 모르겠음

Page 27: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

트파라미터

위 함수의 호출시Ss := sum(10) ; 파라미터b를 생략하면 기본인 20인 대입된다주1) 디폴트 파라미터는 반드시 맨 뒤에 위치

예 : 아래는 에러 발생Function sum(a: integer=10; b:integer) :

string ;주2) 디폴트 파라미터는 변수를 연속해서 사용못함

예 : 아래는 에러 발생Function sum(a, b:integer=10) : string ;

주3)디폴트파라미터는 함수의 overload시 혼란야기주4) record,정적배열,variant, 등의 파라미터는 디폴드파라미터가 될 수 없다

사전선언

①Function aa : string ; forward ; // 함수 사전선언②Function bb : string ;

VarSs : string ;

Begin Ss := aa ;End ;③Function aa : string ;Begin Result := ‘abc’ ;End;

* 함수의 사전선언은 함수뒤에 forward를 사용한다주1)함수의 사전선언이 필요하는 이유는 프로그램

이 순서대로 실행되기 때문이다 : ①②③주2)만약에 함수가 사전선이 안되면 위에서 bb 함

수는 aa 함수가 어디에 있는지 모른다주3)클래스 밖에 있는 함수는 가끔적 사전선언을

하는 것이 안전하다

함수원형int sum(int x, int y) ; // 함수원형 선언int main(void){

int x;x = sum(10,30) ;

return = 0 ;}

int sum(int x, int y) { return = x + y ;}

주1) 함수의 함수원형이 필요하는 이유는 프로그램이 순서대로 실행되기 때문이다 주2) 함수원형 선언은 main 함수위에 복사하면 됨

오버로딩

Function test(const s : string) : string ; overload ;Function test(const s : integer) : string ; overload ;

있는지 없는지 모르겠음

Page 28: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

* 함수명이 같아도 overload 선언된 함수는 컴파일러가 파리미터 데이터형을 검사하여 올바른 함수를 호출

주1)오버로드 함수명을 사용하는 이유는 함수명 통일을 위함

주2)오버로드 함수명는 파리미터의 자료형에 의해 함수를 구분함 예 : 에러발생 파리미터형 같음 : string

Function aa(var s : string) : string ; overload ;Function aa( s : string) : string ; overload ;

함수포인터

Type Ta = function(s:string):string ; // 함수포인터

Function bb(s:string):string ;

Vara : Ta ; s : string ;

Begina := bb ; // bb 함수의 메모리 주소를a에 대입s := a(‘하하하’) ; // a의 함수포인터는 마치 bb 함수를 호출한 것임

End;

주1) 함수포인터는 크기 : 4바이트주2) 함수포인터를 잘 사용하면 소스코드가 잛아짐주3) 함수포인터를 남용하면 소스코드 해독 어려움주4) 함수포인터는 윈도우 callback 함수 주로 사용주5) @@함수포인터 : 함수포인터 의 자체 메모리

주소

함수포인터 ::: 다른 함수의 메모리주소를 데이타로 가짐반환형 (*함수포인터이름)(매개변수들) ;예 :::int (*psum)(int x, int y) ;int sum(int x, int y) ;

int main(void){ int a, b ;

psum = sum ; // sum 함수의 메모리 주소 대입a = (*psum)(10,20) // sum 함수를 호출한 효과발생

}int sum(int x, int y) { return = x + y ; }주1) (*psum)(10,20) 와 *(psum)(10,20) 는 동일함

함수의적용범위

unit Unit2;interface // 다른 유닛에서 호출 가능 함수들typeTmyhome = classend; // 다른 유닛에서 호출 가능 함수들implementation

# include<stdio.h>static int sum() ; // 현재 파일에서만 사용가능extern int et() ; // 외부 파일에서만 사용가능int main(void){}

주1)c 는 델파이처럼 함수의 범위가 명료하지 못하므로

Page 29: 델파이pds13.egloos.com/pds/200903/09/02/delphi_c_diff.doc · Web viewOr : 합 연산자 Xor : 배타적 연산자 ! : 부정연산자 && : 곱연산자 || : 합 연산자 비트논리

// 현재의 유닛에서만 호출 가능 함수들end.* implementation 밑에있는 함수는 현재의 유닛에

서만 호출 가능 함수들이고 위에 있는 함수는다른 유닛에서도 호출 가능 함수들임

대형프로젝트에서는 거의 사용이 불가능하며 간단 한 자동제어용으로 사용됨