Visual Basic에서 모듈(Module)은 프로젝트 전반에 걸쳐 접근할 수 있는 변수 및 프로시저를 선언할 수 있게 해줍니다(올바른 접근 수정자를 사용할 경우). 모듈 내에서 프로시저 외부에 선언된 변수는 해당 모듈의 필드가 되며, 이들의 범위는 수정자(Private/Friend/Public)에 따라 다르며, 생명 주기는 애플리케이션이 실행되는 동안 지속됩니다.
모듈 변수의 주요 특징:
전역 변수와의 차이점은 (예: 다른 언어 또는 구버전 VB6) 모듈 변수는 명시적으로 Public으로 선언되지 않는 한 어셈블리 외부에서 접근할 수 없다는 것입니다.
예시:
Module Globals Public Counter As Integer Sub Increment() Counter += 1 End Sub End Module ' 동일 프로젝트의 어느 곳에서든 Counter 접근 가능
질문: 모듈 변수를 Private 수정자로 선언하면 어떤 접근이 가능할까요? 동일 프로젝트의 다른 모듈에서 접근할 수 있나요?
답변: 아닙니다. Private 수정자를 가진 변수는 해당 모듈 내에서만 접근 가능하며, 다른 모듈이나 클래스에서는 접근할 수 없습니다.
Module Data Private x As Integer End Module ' Module Other는 x를 볼 수 없음
이야기
계산 서비스 개발 중 모든 중간 결과 값이 모듈 변수에 저장되었습니다. 개발자 중 한 명은 데이터가 호출 간에 "초기화될 것"이라고 생각했지만, 상태가 유지되어(Application Scope) 여러 사용자가 동시에 서비스를 사용할 때 오류가 발생했습니다. 해결책: 지역 변수를 사용하고 모듈 내 상태 저장을 피하며 스레드 안전성을 확보합니다.
이야기
다중 파일 프로젝트에서 모듈 변수가
Friend수정자로 선언되었습니다(대신Public). 모든 관련 프로젝트에서 사용할 수 있을 것이라고 예상했지만, 해당 모듈은 하나의 어셈블리 내에서만 보이는 것으로 나타나 통합 단계에서 예기치 않은 접근 오류가 발생했습니다.
이야기
코드 최적화 후 프로세스의 논리 플래그가 작동하지 않게 되었는데, 이는 클래스 생성자에 모듈이 전달되지 않았기 때문입니다. 이로 인해 구식 값이 사용되었고, 시스템이 구식 데이터로 작동하게 되었으며, 모듈 변수의 상태 변경 지점을 추적하는 데 어려움이 있어 버그를 오랜 시간 조사해야 했습니다.