Q&A

  • 동적 배열의 문법
제가 프로그래밍하다가 에러가 나서 질문을 하게 되었습니다.

동적 배열에 관한 질문입니다.

문법적으로 example 1



var

a, b : array of TStrings;

...

begin

...

setlength(a, 10);

a := b;



일 경우 에러가 없습니다.

그러나 example 2의 경우 맞지않은 type이라는 에러 메세지가 나타납니다.



example 2



var

a : array of TStrings;

b : array of TStrings;

...

begin

...

setlength(a, 10);

a := b;

왜 이런 에러가 발생되는지요? 그리고 a, b를 결코 같이 쓸수 없는 경우의 변수일 경우 어떻게 b의 값을 a에 집어 넣을 수 있는지요?



답변 부탁드립니다.



3  COMMENTS
  • Profile
    무명 2000.07.08 03:59
    윤미영 wrote:

    > 제가 프로그래밍하다가 에러가 나서 질문을 하게 되었습니다.

    > 동적 배열에 관한 질문입니다.

    > 문법적으로 example 1

    >

    > var

    > a, b : array of TStrings;

    > ...

    > begin

    > ...

    > setlength(a, 10);

    > a := b;

    >

    > 일 경우 에러가 없습니다.

    > 그러나 example 2의 경우 맞지않은 type이라는 에러 메세지가 나타납니다.

    >

    > example 2

    >

    > var

    > a : array of TStrings;

    > b : array of TStrings;

    > ...

    > begin

    > ...

    > setlength(a, 10);

    > a := b;

    > 왜 이런 에러가 발생되는지요? 그리고 a, b를 결코 같이 쓸수 없는 경우의 변수일 경우 어떻게 b의 값을 a에 집어 넣을 수 있는지요?

    >

    > 답변 부탁드립니다.



    안녕하세요~



    a,b: array of TStrings;



    이렇게 선언하였을때는 a와 b가 같은 타입이지만...



    a : array of TStrings;

    b : array of TStrings;



    이렇게 하면 a와 b는 같은구조를 가진 다른 타입이 됩니다.

    이것은 동적 배열에만 해당되는것이 아니고 파스칼문법의 기본적인 특징입니다.

    만약 따로따로 선언하시려면 이렇게 해보세요.



    type TStringsArray = array of TStrings;



    var

    a : TStringsArray;

    b : TStringsArray;



    그리고 a:=b 라고 하셨는데 이것은 복사하는것이 아니고 가리키는것입니다.

    즉, a의 내용을 수정하면 b도 바뀌게 됩니다.



    즐플~~

  • Profile
    한상훈 2000.07.08 18:20
    재밌는 사실이군여.. ^^

    아래가 다르다면 이해는 가는데



    var

    a : array of TStrings;

    b : array of TStrings;



    a:=b 처럼 일치시키는 방법이



    type TStringsArray = array of TStrings;

    var

    a : TStringsArray;

    b : TStringsArray;



    위와갈은 선언에서 뿐인가요? 다른 연산자는 없나여?



    글구 a:=b;가 같은 데이터를 가리키는 포인터일때



    a:=~.create;

    b:=~.create;

    a:=b;

    a.free; (or b.free;)

    위처럼 한쪽만 제거해도 둘다 제거되나여?









  • Profile
    무명 2000.07.08 19:38
    한상훈 wrote:

    > 재밌는 사실이군여.. ^^

    > 아래가 다르다면 이해는 가는데

    >

    > var

    > a : array of TStrings;

    > b : array of TStrings;

    >

    > a:=b 처럼 일치시키는 방법이

    >

    > type TStringsArray = array of TStrings;

    > var

    > a : TStringsArray;

    > b : TStringsArray;

    >

    > 위와갈은 선언에서 뿐인가요? 다른 연산자는 없나여?

    >

    > 글구 a:=b;가 같은 데이터를 가리키는 포인터일때

    >

    > a:=~.create;

    > b:=~.create;

    > a:=b;

    > a.free; (or b.free;)

    > 위처럼 한쪽만 제거해도 둘다 제거되나여?

    >



    안녕하세요~



    type을 사용하는것이 정석이고 type없이 곧바로 array를 만드는것이

    약식이라고 보시면 됩니다. 그러므로 ....

    var

    a : array of TStrings;

    b : array of TStrings;



    여기에선 약식으로 두개의 타입이 생성된것입니다.

    그리고....



    a:=~.create;

    b:=~.create;

    a:=b; // 여기에서 a가 가리키는 인스턴스를 잃어버리게 됩니다.

    a.free; (or b.free;) // a와 b는 같은곳을 가리키기때문에

    // 하나가 free되면 다른하나도 free됩니다. 그러나 원래의 a는 free되지 않고

    // 계속 메모리에 상주합니다.



    a:=b 라는 형식은 a와 b의 타입에따라 전혀 다른 동작을 보이는데 ...

    일반변수/포인터/객체/프로퍼티/동적배열/스트링 모두 다릅니다.

    이중 동적배열은 메모리해제를 델파이가 자동으로 해줍니다.

    동적배열 a,b가 있을때 ...

    a:=b; // 만약 a가 메모리 할당이 되었다면 free되면서 b를 가리키게 됩니다.



    즐플~