델파이의 기본적인 연산자와 키워드에 대한 정리이다.


@ : 주소값을 반환한다. (C언어의 &와 동일한 기능을 가짐)

     

^ : 포인터연산자 (C언어의 *와 동일함)

    하지만 C언어와 다른 점이 있다면 그 위치에 따라 다른 역할을 한다.

    ^(자료형) 으로 포인터를 선언할 때 쓰이거나

    (포인터변수)^ 로 포인터가 값에 접근할 때 쓰인다. 

var
  aPName : ^String;
  aName : String;
begin
  aName := '고현정';
  aPName := @aName;
  aPName := aName^ + ' 예쁘다!';
end;


div : 정수형 변수를 나누고 몫을 반환함 ( / 기호는 사용할 수 없음)


mod : 나눈 값의 나머지를 반환함 ( % 기호는 사용할 수 없음)


and : 때에 따라 비트연산자와 논리연산자로 나뉨. 둘 다 참일 때만 참을 반환함 (1 : 참, 0 : 거짓)


in  : 집합형 변수(세트형 변수)에 선언한 원소들 중에 속하는지 Boolean값은 판별할 때 쓰임

type
  TNumSet = set of 0..9;
var
  aNumSet : TNumSet;
  aNum : Integer;
begin
  aNum := 5;
  if aNum in aNumSet then
    Writeln('aNum은 5');
end;

is : 델파이엔 클래스가 존재한다. 그래서 조상의 개념이 존재하는데, is는 상속받고 있는지 판별하기 위한 키워드이다. 


unit : 파일의 단위. 주로 파일명과 유닛명은 동일하다.


type : 정의 영역의 시작. 변수형, 클래스, 구조체 등을 선언함. 사용자 정의자료형을 정의한 뒤에 var영역에서 자료형을 사용할 수 있음


uses : C언어의 include와 동일한 역할을 하며, 사용할 리소스를 추가해준다.


implementation : 선언부와 실행코드의 경계선. 이것보다 위에 써있는 경우 다른 유닛에서도 사용이 가능한 public이 된다. 그렇기 때문에 이 위 쓰는 변수는 기본으로 자동생성되는 델파이 초기변수들 외엔 쓰지 않는다.  다른 유닛에서 사용하면서 오류가 날 가능성이 있기 때문이다.


const : 정적 변수를 선언해주는 것. 프로시저나 함수의 전달인자 부분에 쓰일 때가 있으며, 다음 포스팅에서 설명할 예정!


record : C언어의 struct와 같은 역할을 하며, 구조체를 선언하기 위해 쓰인다. 연속된 공간에 한 덩어리로 메모리가 할당된다.

type
  PExam = ^TExam;
  TExam = record
    iName : String;
    iNext : PExam;
  end;


procedure와 function : 리턴값이 있으면 function, 없으면 procedure이다. 리턴값의 경우 Result 키워드가 사용되며, 자료형을 function 이름 맨 마지막 부분에 정의해준 뒤에 Result에 리턴값을 넣어주면 된다. 전달인자의 경우 생략이 가능하며, 같은 자료형의 다른 변수는 ', (콤마)'로 구분하고 각 자료형 별로 '; (세미콜론)'으로 구분해준다. 당연히 Function의 리턴값은 한 개뿐이므로 자료형도 하나만 쓸 수 있다.

procedure ThisIsProc(aData : Integer; aName : String);
begin
  // 내용
end;

function ThisIsFunc(aData : Integer; aName : String) : String;
begin
  // 내용
  Result := '리턴값을 대입해준다';
end;


array : 정적 배열과 동적 배열로 나뉘며, 범위를 적어주지 않으면 동적array로 선언하는 것과 같다. 동적배열의 경우 SetLength로 메모리를 할당해준 뒤에 사용이 가능하다.

procedure ForStaticArray;
var
  aStaticArray1 : array[1..10] of Integer;      // 정수형 정적  배열
  aStaticArray2 : array[15..25] of Integer;

  aStaticArray3 : array[1..5, 2..3] of Integer; // 정수형 정적 이차원 배열의 선언 1
  aStaticArray4 : array[1..5] of array[2..3] of Integer;      // 선언2
  aStaticArray5 : array[1..5] of StaticArray1;                // 선언3

  i : Integer;
begin
  aStaticArray1[1] := 1;                       // 인덱스로 직접 접근

  index := 20;
  aStaticArray2[i] := 5;                     // 변수 index를 이용한 접근

  aStaticArray3[1][2] := 10;                   // 인덱스로 이차원 배열의 원소에 접근

  for i := Low(aStaticArray2) to High(aStaticArray2) do    // Low와 High를 통한 접근
    aStaticArray2[i] := i + 15;
end;

procedure ForDynamicArray;
var
  aDynamicArray : array of Integer;            // 동적배열
begin
  SetLength(aDynamicArray, 10);                // SetLength를 이용해서 메모리 할당
  aDynamicArray[5] := 10;                      // 메모리 할당 후 접근
end;


나열형 변수와 집합형(세트형) 변수 : 아래 예시를 통해 확인하자

procedure ForType;
Type
  TDrinkKind = (DKCoke, DKSprite, DKFanta);
  TDrinkKindSet = Set of TDrinkKind;
var
  aDrinkKind : TDrinkKind;
  aMyDrink : TDinkKindSet;
  aDrinkArray : array[TDrinkKind] of String;
  Feeling : String;
begin
  aDrinkKind := DKCoke;
  //aDrinkKind := Coke;        // 에러

  aMyDrink := [DKFanta];

  aDrinkArray[DKFanta] := 'Lee';    // 인덱스 대신 TDrinkKind의 원소로 인덱스 접근

  if DKSprite in aMyDrink then      // in <- 집합형에서 원소가 있는지 검사함
    Feeling := 'Good';
end;


for문 : 다른 분기문, 반복문은 C언어와 유사한데, for문의 경우 downto가 존재한다는 차이점이 있다. 델파이의 for문은 안에서 i값(조건부분에 들어가는 변수)을 임의로 수정할 수가 없으며, 순차적으로 1씩 증감하는 것만 가능하다. 증가하는 경우 'for ~ to ~ do then'을, 감소하는 경우 'for ~ downto ~ do then'을 사용한다. 

procedure Forfor;
var
  i : Integer;
  TempArray : array[2..5] of Integer;
begin
  for i := Low(TempArray) to High(TempArray) do begin
    if i mod 2 = 1 then
      continue;               //홀수일 경우 건너뜀
    TempArray[i] = i;
  end;
  for i := High(TempArray) downto Low(TempArray) do
    TempArray[i] = i;
end;


if ~ else if ~ else : else문을 쓸 경우 if, else if문에서는 ; (세미콜론)을 사용하지 않으며, 사용하면 에러가 발생한다. 물론 begin ~ end 블록 안에서는 줄 마다 ; (세미콜론)을 써줘야 한다. 즉, if문 안에 한 문장이어서 블록 설정을 하지 않는 경우 ; (세미콜론)을 써주지 않는다. 

if k < 3 then
  aYesOrNo := True       // ; (세미콜론)을 써주지 않음
else if (k > 3) and (k < 10) then begin
  k := 1;                 // begin..end 블록 안이기 때문에 ; (세미콜론)을 써줘야 함
  aYesOrNo := False;     
end else
  k := 11;
end;


with : record나 class에서 사용되며, 유지보수가 쉽고 생략이 가능하다는 점에서 경제적인 코딩이 가능하므로 자주 쓰임

(아래의 두 코드는 같은 내용이다)

a : Tset;
a.iData1 := 10;
a.iData2 := 14;
a : Tset;
with a do begin
  iData := 10;
  iData := 14;
end;


프로시저와 함수의 전달인자에서 쓰이는 var, const의 의미

§procedure(var S : String)
  §C언어에서 포인터의 개념. 주소값이 복사되어 접근 및 수정이 가능함
§procedure(const S : String)
  §C언어에서 참조의 개념. 주소값이 복사되며 접근은 되지만 수정이 불가능함
§procedure(S : String)

  §변수값이 그대로 복사됨. record, array, String의 경우 거의 사용 안 함 → 복사하면서 속도저하 우려




중구난방인 것 같지만 검색하는 사람들은 어차피 정독하러 오는 게 아니라 필요한 부분만 잘 읽고 갈 거라고 믿으며...



+ Recent posts