Q&A

  • 비슷한 컴포넌트가 참조하는 파일의 위치가...
웅 제목을 어케 달아야 할지 막막하네요.

음... 제가 질문드리고픈 문제는

비슷 비슷한 컴포넌트, 예를들어 TButton 상속받아서 만든 버튼이라고 치면...

A와 B 컴포넌트가 있다치고

둘다 Graphis를 포함하는데

A 컴포에서는 interface 부분의 uses절에

B 컴포에서는 implementation 부분의 uses절에 선언을 해 놨더군요.

A, B 모두 서로 위치를 바꿔서 설치 해 봐도 다 잘 됩니다.


전에 설명 보니까 상호참조 어쩌구 하던데...

보통 어느곳에 두는것이 좋을지 판단이 안서는군요.

델파이 VCL을 봐도 보통 interface uses절에 선언하는걸로 알고 있는 SysUtils도 어떤곳(Buttons.pas)에서는 implementation에 선언이 되어 있더군요.

헐~ 어떤 경우에 어디에 둬야할지...

개념 설명 좀 부탁드립니다. ㅡㅡ; (날고픈 초보)

또, 위치를 바꿔도 특별한 에러가 없다면 걍 아무데나 써도 괜찮은건지요. 웬지 메모리 부분에 관련이 있을것같아 막연한 불안감이...
1  COMMENTS
  • Profile
    박상기 2003.07.16 01:13





    다음을 참조하세요


    파스칼의 유닛은 크게 '접속부'(interface section)와 '구현부'(implementation)로
    나누어집니다.

    unit Unit1;

    interface
    // 여기서부터 접속부...

    ...

    implementation
    // 여기서부터 구현부...

    end. <-- 유닛의 끝.


    유닛의 구조를 간단하게 나타내면 위와 같습니다.

    접속부와 구현부 공히 유닛에서 쓰일 이름(identifier)을 선언(declare)할 수 있습
    니다. 즉 갈피(label), 자료형, 상수, 변수, 절차나 함수 등을 여기서 선언할 수 있
    다는 말입니다. 그럼 접속부와 구현부는 어떤 차이가 있을까요?

    '접속부'에서 '접속'이라는 것은 무엇입니까? '어디에 갖다 붙일 수 있다'는 말이
    겠지요? 즉, 다른 유닛이나 프로그램과 접속하기 위해서 필요한 이름을 여기에서 선
    언합니다. 즉 접속부에서 선언한 이름들은 이 유닛을 사용하는 다른 유닛이나 프로
    그램이 쓸 수 있습니다.
    그러나 '구현부'에 선언된 이름들은 다른 유닛이나 프로그램에서는 절대로 쓸 수
    없고 해당 유닛만 사용할 수 있습니다.

    이와 같은 기법을 '정보 은폐'라 부르는데요, 꼭 필요한 정보만 알려주고 나머지
    정보는 숨겨둠으로써 프로그램을 독립적으로 작성할 수 있도록 하는 것입니다. 쉽게
    말해서 구현부에서 선언된 이름은 C/C++ 언어의 static 선언과 비슷하다고 할 수 있
    습니다.

    uses 문을 접속부와 구현부에 나누어 두는 것은 한 유닛이 서로 자기를 호출하는 '
    상호 참조'를 막기 위함입니다. 무슨 말이냐면,...

    unit Unit1;

    interface

    uses Unit2;
    ....
    end.


    unit Unit2;

    interface

    uses Unit1;
    ....
    end.

    위의 경우를 보십시오. Unit1이 Unit2를 사용하고 있고, Unit2 또한 Unit1을 사용하
    고 있습니다. 이렇게 유닛끼리 서로서로 참조하게 되면 결국은 끝없이 참조 현상이
    일어나게 됩니다. 따라서 상호 참조가 일어나는 유닛들 중 하나를 접속부가 아닌 구
    현부에 선언해야할 필요가 있습니다. 아래를 보십시오.

    unit Unit1;

    interface

    uses Unit2;

    implementation
    ....
    end;


    unit Unit2;

    interface
    ...
    implementation

    uses Unit2; <-- 주목!
    ....
    end;


    위를 잘 보십시오. unit1이 unit2를 사용하고 있고, Unit2가 Unit1을 사용하고 있
    습니다. 다만 Unit2는 interface, 즉 접속부가 아닌 implementation, 즉 구현부에서
    사용했습니다. 앞서 구현부에서 사용한 모든 이름은 다른 유닛에게는 알려지지 않는
    다고 했습니다. 결국은 Unit1은 Unit2가 자신(Unit1)을 사용한다는 것을 알리가 없
    습니다. 그러므로 Unit1과 Unit2를 서로서로 참조해도 무관한 것입니다.

    절차와 함수의 경우는 접속부에서는 오직 선언만 할 수 있으므로, 접속부에서 선언
    한 모든 절차와 함수는 구현부에서 실제로 정의(definition)해 주어야 합니다.

    저 같은 경우는 델파이에서 추가하는 유닛은 접속부에 그냥 그대로 두고, 내가 필
    요해서 추가하는 유닛들은 구현부에 두는 방식을 사용합니다. 그러면 순환 참조를
    막을 수 있더군요.