본문 바로가기
Delphi/문법

델파이 포인터 (Pointer) 6편

by MonoSoft 2023. 8. 10.
728x90
반응형

델파이 포인터 (Pointer) 6편

728x90

 

 

 

기초 강좌

 

포인터란 무엇일까요?

 

포인터는 한마디로 가리킨다는 의미입니다.

쉽게 다음과 같은 예를 많이 들죠.

 

저도 포인터에 대한 상투적인 예를 간략히 들면 다음과 같습니다.

 

선생님께서 민영이네 집에 가정 방문을 가려고 합니다.

그런데 집의 위치를 잘 몰라서 민영이의 짝인 형철이에게 민

영의 집이 어딘지 물었습니다.

그러자 형철이는 '저기'라고 말하면서 손가락으로

민영의 집을 가리켰습니다.

자. 여기서 선생님은 민영의 집을 모르지만

민영의 집을 알고 있는 형철이를 알고 있습니다.

형철이는 민영의 집을 손가락으로가리키로 있는데

바로 형철이가 포인터인 셈입니다.

 

많은 사람들이 포인터를 이렇게 이해 시키더군요.

어쨌든 포인터의 개념은 이쯤하고 델파이에서

포인터를 사용하는 방법을 설명하기 시작하겠습니다.

 

델파이에는 포인터형의 자료형이 있고,

일반 자료형을 포인터 형으로 만들 수도 있습니다.

PChar, PWORD 등은 포인터 형의 자료형 앞에 P로 시작되는 것이

Pointer의 약자라는 것을 쉽게 알 수 있죠.

 

반면 Integer나 string 같은 것은 포인터가 아닌

일반 자료형 입니다 그런데 이런 일반자료형에 " ^ " 표시를 앞에 붙여서

포인터 자료형으로 사용 할 수 있습니다.

 

^Integer; ^stirng; 처럼 말이죠.

 

 

예를 들면

 

 

procedure TForm1.MyProcedure;

var

  AStr : ^string; {<-일반자료형을 포인터 형으로 사용}

  BStr : string;

begin

  BStr := 'SAMPLE';

  AStr := @BStr;

  ShowMessage(AStr^);

end;

 

위와 같이 포인터 형으로 사용 할 수 있는 것입니다.

 

^stirng처럼 일반 자료형 앞에 ^표시를 붙여

포인터 자료형으로 사용한다는 겁니다.

 

그러니까 AStr은 실제 자료값을 가지고 있는 것이 아니라,

실제 자료값을 가지고 있는 메모리의 주소만 가지고 있다는 것이죠.

 

위의 예에서 보면 BStr이라는 string의 변수에는

'SAMPLE'이라는 값 저장되어 있습니다.

그리고

AStr := @BStr; 이라는 구문이 있죠?

 

procedure TForm1.MyProcedure;

var

  AStr : ^string;

  BStr : string;

begin

  BStr := 'SAMPLE';

  AStr := @BStr; {<--바로 여기 }

  ShowMessage(AStr^);

end;

 

여기서 @BStr은 무엇인고 하니 BStr의 포인터 값이라는 뜻입니다.

BStr 앞에 @를 붙여서 BStr값의 포인터 값을 구할 수 있는 겁니다.

 

그러니까 BStr이 'SAMPLE'이라는 실제의 값을 가지고 있다면

@BStr에는 BStr의메모리 주소를 가지고 있다는 것이죠.

 

그런데 여기서는 AStr에 BStr의 포인터 값을 대입하는 군요.

그러니까 말하자면 AStr은 BStr의

메모리 주소 값을 가지고 있는 포인터가 되는 셈입니다.

 

우리는 여기서 델파에서 포인터를 표시하는

두가지 형식을 알게 된 것 입니다.

 

바로 @와 ^을 사용하여서 말이지요.

그런데 맨 마지막 구문을 보면 AStr^이라는 것이 있네요.

 

이게 무얼까?

 

procedure TForm1.MyProcedure;

var

  AStr : ^string;

  BStr : string;

begin

  BStr := 'SAMPLE';

  AStr := @BStr;

  ShowMessage(AStr^); {<--바로 여기 }

end;

 

이게 중요합니다. 이게 무언고 하니 포인터가 가리키는 곳의 실제 값입니다.

그러니까 AStr이 BStr의 포인터라고 아까 설명 했는데

AStr이 가리키는곳에는 실제로 무슨 값이 있냐 하는 겁니다.

 

그걸 알기 위해서 포인터 변수 뒤에 ^를 붙여

포인터가 가리키고 있는 실제 값을 알 수 있는 것이죠.

 

당연히 AStr^은 BStr의 값인 'SAMPLE'이 겠죠.

 

결론적으로 말할 때 위 예제는 실제 값을 포인터로

넘겨 받은 후 포인터가 가리키는 실제의 값을 메세지를 통해

보여주는 예제하고 할 수 있습니다.

 

위의 예제를 다음과 같이 바꾸면 어떨까요?

 

procedure TForm1.MyProcedure;

var

AStr : ^string;

begin

AStr^ := 'SAMPLE'; {<--바로 여기가 중요 }

ShowMessage(AStr^);

end;

 

Access Violation 에러!!!

 

왜 에러가 날까요?

 

그건 바로 AStr이 아직 메모리에

할당이 되지 않아서 그런 겁니다.

 

할당되지도 않은 메모리에 값을 넣는다는 것이

불가능하다는 얘기지요.

 

그러니까 AStr을 사용하기전에 메모리에 할당해야 하겠지요.

 

7편 계속...

728x90
반응형

'Delphi > 문법' 카테고리의 다른 글

델파이 포인터 (Pointer) 8편  (0) 2023.08.21
델파이 포인터 (Pointer) 7편  (0) 2023.08.11
델파이 포인터 (Pointer) 5편  (0) 2023.08.09
델파이 포인터 (Pointer) 4편  (0) 2023.08.08
델파이 포인터 (Pointer) 3편  (0) 2023.08.07

댓글