Microsoft MVP성태의 닷넷 이야기
[답변]: ASP 의 ByVal 과 ByRef 특성 [링크 복사], [링크+제목 복사],
조회: 17969
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
부모글 보이기/감추기


결론부터 말씀드리면, "예. 올바른 동작이 맞습니다."

이것은, 스택에 전달되는 인자의 주소 구조를 보면 알 수 있습니다.
RecordSet 같은 경우에는, ByVal 로 넘긴다고 하더라도 내부적인 연결 개체까지 완전히 clone 되어 전달되는 것이 아니기 때문입니다.

쉽게 예를 들어, int 의 경우라면.

int a = 6;
TestA(ref a);
TestB(a);

와 같이 전달하는 경우, TestA 함수에서는 전달되는 a 로컬 변수의 메모리 주소가 스택에 전달되었다고 보시면 되고, TestB 의 경우에는 a 변수의 내용인 6 이라는 값 자체가 스택에 전달된 경우입니다.

자... 그럼, 이를 Recordset 에 옮겨 볼까요?

Recordset localRs;

TestA(ref localRs);
TestB(localRs);

마찬가지로, TestA 의 경우에는 localRs 변수의 메모리 주소가 전달되었습니다. 반면에 TestB 의 경우에는 localRs 가 담고 있는 인터페이스 포인터의 값이 넘어간 것입니다.

결국, TestA 와 TestB 함수안에서 rs.Close 를 해버리면 결국 같은 객체를 가리키는 것이기 때문에 동작은 동일하게 발생합니다.

단지 다른 점이 있다면. 아래와 같은 식으로 하는 경우에만 그 차이를 발견할 수 있습니다.

TestA(ref rs)
{
 rs = null; // localRs == null 이 되어버림
}

TestB( rs )
{
 rs = null; // localRs 는 변하지 않음.
}

TestA 함수의 경우에는, localRs 변수의 주소값이 스택에 넘어와서 참조하게 되는 것이기 때문에, rs = null 을 해버리면, 인자로 전달되었던 localRs 변수 자체가 null 값으로 되어버리는 반면, TestB 는 ByVal 로써, localRs 변수의 값이 스택에 전달되어 해당 스택 변수 4byte(32bit 시스템) 만을 null 로 초기화하는 것입니다.

인자가 전달되는 스택을 그려가면서 답변을 드리면 이해가 더 빨리 되실 것 같은데... ^^; 그림 실력이 워낙 딸려서 그냥 말로만 적고 넘어가 봅니다. 혹시나 실험하시면서 더 궁금한 것이 있다면 댓글 남겨 주십시오. ^^ 같이 확인을 해드리겠습니다.

(위의 내용은 VB 6.0 에서도 동일하게 적용될 거라고 확신합니다.)







[최초 등록일: ]
[최종 수정일: 5/16/2007]


비밀번호

댓글 작성자
 




... 91  92  93  [94]  95  96  97 
NoWriterDateCnt.TitleFile(s)
115김용국3/21/200510079                답변글 [답변]: [답변]: [답변]: [답변]: IE에 Docking된 WinFormControl내의 특정 메소드에 값을 보내기 .. 잘 되기는 하는데 한가지 문제가 ... [1]
119김용국3/22/200510037                    답변글 [답변]: 정상태님 아주 잘 해결 되었습니다.... 감사합니다!
108guest3/17/200510222닷넷 프레임워크 배포
111정성태3/19/200510677    답변글 [답변]: 닷넷 프레임워크 배포
107안연준3/17/20059880[-_-]스마트 클라이언트에 관련 된 질문[-_-]
110정성태3/19/200510755    답변글 [답변]: [-_-]스마트 클라이언트에 관련 된 질문[-_-]
116안연준3/21/200510235        답변글 [답변]: 친절한 답변 고맙습니다.
98김용국3/18/200511976정성태님... 연결이 준비됬습니다
99정성태3/2/200512871    답변글 [답변]: 정성태님... 연결이 준비됬습니다
100김용국3/18/20059851        답변글 [답변]: 죄송합니다! 급히올리느라 file path의 변경을 하지않고 그냥올렸네요....!
101정성태3/2/200510101            답변글 [답변]: [답변]: 죄송합니다! 급히올리느라 file path의 변경을 하지않고 그냥올렸네요....!
102김용국3/18/200510169                답변글 [답변]: 거듭죄송하네요..... 후~~~주소를 변경하고 빌드를 다시 했습니다....
103정성태3/2/200510063                    답변글 [답변]: [답변]: 거듭죄송하네요..... 후~~~주소를 변경하고 빌드를 다시 했습니다....
104김용국3/2/200510176                        답변글 [답변]: 네... 빨리 검토해 봐 주셔서 감사합니다~~
105정성태3/2/20059375                            답변글 [답변]: [답변]: 네... 빨리 검토해 봐 주셔서 감사합니다~~
106김용국3/2/20059865                                답변글 [답변]: 답변감사합니다!
91김용국2/28/200511552IE에 WindowsFormControl을 올려 실행하면 이런에러가 나네요???파일 다운로드1
92정성태2/28/200512852    답변글 [답변]: IE에 WindowsFormControl을 올려 실행하면 이런에러가 나네요???
93김용국2/28/200511823        답변글 [답변]: 답변감사합니다... 재질문을 드립니다
94정성태2/28/200512418            답변글 [답변]: [답변]: 답변감사합니다... 재질문을 드립니다
95김용국2/28/200512449                답변글 [답변]: IE주소창에서 해당주소로 실행을 해보니....디버깅 PopUp화면이...^
96정성태2/28/200511486                    답변글 [답변]: [답변]: IE주소창에서 해당주소로 실행을 해보니....디버깅 PopUp화면이...^
97김용국3/1/200512081                        답변글 [답변]: 준비되는데로 말씀드리겠습니다 ^^
88안지환2/22/200513594^^ 사이트 잘 들러보았습니다.
89정성태2/22/200513578    답변글 [답변]: ^^ 사이트 잘 들러보았습니다.
85한기열2/22/200512185정성태님 홈같은 부드러운 페이지 넘김?은 어떻게 구현하나요?
... 91  92  93  [94]  95  96  97