Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

델파이에서 With 구문과 지역 변수


Recommended Posts

마르코 칸투 (Marco Cantu)"Delphi With Statements and Local Variables"를 번역했습니다. (원문 작성: 2022년 11월, 최종 번역: 2022년 12월)

나는 최근에 델파이에서 With 구문을 사용하는 것에 반대하는 토론을 고객과 하면서, With 구문을 제거하는 좋은 방법으로 지역 변수를 사용할 수 있다는 점을 깨달았다.

델파이 개발자라면 누구나 알고 있듯이, With 구문은 파스칼 초기부터 지금까지 오브젝트 파스칼에 오랫동안 있어 왔지만, 나를 포함하여 많은 사람들은 With 구문을 유해한 것으로 간주해 왔다. 왜 그런지 다시 설명하기 위해 With의 범위로 인한 이슈를 강조하는 전형적인 코드를 사용해보겠다:
spacer.png

위 코드가 하는 일을 보자. 먼저 폼 위에서 마우스 클릭 (보다 정확히 말하자면 마우스 버튼 누름)이 발생한 위치에 버튼을 생성하고 해당 폼을 부모로 지정한다. 그리고 그 버튼의 클래스 이름을 사용하여 캡션(Caption)에 표시하고, 버튼의 색상을 빨강색으로 바꾼다. 글쎄, 이 코드의 마지막 줄이 동작할 것이라고 가정하는 사람이 있겠지만, 실제로는 매우 잘못되어서 다음과 같은 결과가 나온다:

spacer.png

이 TButton 클래스에 Color 프로퍼티가 없는 경우, 델파이 컴파일러는 코드에 있는 Color가 이 메소드를 실행하는 현재 오브젝트를 가리키고 있다고 가정하기 때문이다. With 구문은 With 구문의 직접적인 범위 안에 해당 오브젝트를 추가해 주지만, With에 의해 추가된 오브젝트 부분과 With 구문이 들어있는 메소드를 실행하는 오브젝트 자체를 구분할 수 있는 방법은 제공하지 않는다. 이런 방식은 복잡한 애플리케이션에서는 매우 위험하다.

임시 변수가 반복해서 작업을 하도록 할 때, With 대신 사용할 수 있는 "현대식" 방법은 인라인 변수(inline variable)를 사용하는 것이다. 코드는 매우 비슷하지만, TButton이 하는 각 작업마다 변수를 접두사로 지정하기 때문에, 개발자가 의도하는 바를 명확하게 컴파일러에게 전달할 수 있다: 

spacer.png

그러면 위 그림과 같이 이 버튼에 Color 프로퍼티를 할당(assign)하려고 시도하는 경우, 델파이 컴파일러가 에러를 보여 준다. 의도하지 않은 다른 오브젝트에서 Color 프로퍼티를 바꿨던 With 구문과 비교하면 상당한 장점이다.

이제 원래 요청을 보자: "델파이 안에 있는 오브젝트 파스칼 언어서 With 구문을 제거할 것인가?" 가까운 시일 내에서 그렇게 될 가능성은 매우 낮다. 하지만, 선택적 경고를 도입하여, "당신의 코드에서 With 구문을 사용하고 있습니다." 라고 컴파일러가 알려줄 수 있도록 해달라는 요청들이 있다.

이 댓글 링크
다른 사이트에 공유하기

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.