프로그래밍Visual Basic 개발자

Visual Basic에서 모듈(Module)을 사용하는 방법은 무엇이며, 공통 프로시저 및 변수를 저장하는 측면에서 모듈과 클래스의 차이는 무엇입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

Visual Basic의 모듈(Module)은 역사적으로 명시적으로 인스턴스를 생성하지 않고 전체 프로젝트에서 접근 가능한 프로시저, 함수 및 변수를 저장하는 데 사용됩니다. 클래스의 도입 이후 그 역할이 일부 중복되었지만, 중요한 차이점은 여전히 존재합니다.

문제의 역사:

고전 Visual Basic (VB6)에서 모듈은 공통 함수 및 전역 변수를 그룹화하는 유일한 방법이었습니다. VB.NET에서도 모듈은 남아 있지만 클래스의 확장된 기능이 추가되었습니다.

문제:

개발자는 모듈과 클래스의 차이를 모를 수 있으며, 이로 인해 로직 저장 방식의 잘못된 선택, 코드의 우연한 중복 또는 변수가 예기치 않게 동작하게 되는 결과를 초래할 수 있습니다.

해결책:

모듈과 클래스 사이의 선택은 목표에 따라 달라집니다:

  • 모듈은 인스턴스를 생성하지 않고 애플리케이션 전체에서 접근해야 하는 프로시저와 변수를 저장하는 데 적합합니다.
  • 클래스는 객체의 상태와 행동을 캡슐화하고 상속이 가능하도록 설계되었습니다.

코드 예시:

' 모듈 Module MathUtils Public Function Add(x As Integer, y As Integer) As Integer Return x + y End Function End Module ' 사용 예 Dim result = MathUtils.Add(5, 10)

주요 특징:

  • 모듈의 모든 구성원은 항상 Shared이며 인스턴스 없이 접근할 수 있습니다.
  • 모듈은 상속을 지원하지 않으며 인스턴스를 생성할 수 없습니다.
  • 모듈은 클래스 내부에서 Friend/Protected로 선언할 수 없습니다.

함정 질문.

모듈에서 변수를 Public으로 선언하면 애플리케이션의 모든 폼/클래스에 일반적으로 적용됩니까?

네. 모듈에서의 Public 변수는 본질적으로 전역적입니다. 프로젝트의 어떤 코드에서도 접근 가능하므로 유용하지만, 멀티스레드 환경에서 오류가 발생하거나 값이 우연히 덮어쓰여질 수 있습니다.

New를 사용하여 모듈의 인스턴스를 만들 수 있습니까?

아니요. 모듈은 인스턴스를 만들 수 없습니다. 모든 기능이 정적으로 접근 가능합니다.

모듈을 상속하거나 Protected 또는 Private 접근 제한자를 사용하여 모듈을 선언할 수 있습니까?

아니요. 모듈은 상속할 수 없으며 네임스페이스(namespace) 수준에서만 선언될 수 있으며, 다른 접근 제한자(공용 또는 Friend 이외)는 가질 수 없습니다.

일반적인 오류 및 안티-패턴

  • 접근 제어 없이 전역 변수 사용
  • 클래스를 대신하여 모듈에 사용자 상태 저장(멀티스레드 환경에서는 유효하지 않음)
  • 서로 다른 모듈에 중복되는 함수 선언

실생활 예시

부정적인 사례

프로젝트에서 모든 사용자 상태 변수가 모듈에 Public으로 선언됩니다. 한 폼에서 값이 변경되면 모든 다른 폼에서 즉시 새로운 값으로 표시됩니다.

장점:

  • 변수에 빠르게 글로벌 접근 가능

단점:

  • 값 덮어쓰기 및 찾기 어려운 버그
  • 멀티스레드 시나리오에서 작동하지 않음 — race condition
  • 복잡한 유지보수

긍정적인 사례

모듈은 보조 유틸리티(예: 변환 함수) 저장에만 사용되며, 사용자 상태는 클래스에서 캡슐화하여 저장됩니다.

장점:

  • 코드의 명확한 조직
  • 접근 충돌 없음

단점:

  • 먼저 더 많은 설계 노력이 필요함