웅 제목을 어케 달아야 할지 막막하네요.
음... 제가 질문드리고픈 문제는
비슷 비슷한 컴포넌트, 예를들어 TButton 상속받아서 만든 버튼이라고 치면...
A와 B 컴포넌트가 있다치고
둘다 Graphis를 포함하는데
A 컴포에서는 interface 부분의 uses절에
B 컴포에서는 implementation 부분의 uses절에 선언을 해 놨더군요.
A, B 모두 서로 위치를 바꿔서 설치 해 봐도 다 잘 됩니다.
전에 설명 보니까 상호참조 어쩌구 하던데...
보통 어느곳에 두는것이 좋을지 판단이 안서는군요.
델파이 VCL을 봐도 보통 interface uses절에 선언하는걸로 알고 있는 SysUtils도 어떤곳(Buttons.pas)에서는 implementation에 선언이 되어 있더군요.
헐~ 어떤 경우에 어디에 둬야할지...
개념 설명 좀 부탁드립니다. ㅡㅡ; (날고픈 초보)
또, 위치를 바꿔도 특별한 에러가 없다면 걍 아무데나 써도 괜찮은건지요. 웬지 메모리 부분에 관련이 있을것같아 막연한 불안감이...
다음을 참조하세요
파스칼의 유닛은 크게 '접속부'(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)해 주어야 합니다.
저 같은 경우는 델파이에서 추가하는 유닛은 접속부에 그냥 그대로 두고, 내가 필
요해서 추가하는 유닛들은 구현부에 두는 방식을 사용합니다. 그러면 순환 참조를
막을 수 있더군요.