본문 바로가기
언어 참조

이름 충돌 피하기

2023. 7. 30.

이 글은 도움말을 번역한 내용입니다.

명명 충돌은 이전에 정의된 식별자를 만들거나 사용하려고 할 때 발생합니다. 경우에 따라 명명 충돌로 인해 모호한 이름 감지 또는 현재 범위에서 중복 선언과 같은 오류가 발생할 수 있습니다. 특히 처음 사용하기 전에 모든 변수를 명시적으로 선언하지 않은 경우 이름 충돌이 감지되지 않으면 코드에서 잘못된 결과를 생성하는 버그가 발생할 수 있습니다.

범위 지정, Private 모듈 수준 및 Public 모듈 수준을 이해하면 대부분의 이름 지정 충돌을 피할 수 있습니다.

 

식별자가 두 개 이상의 범위 수준에 표시되는 경우 명명 충돌이 발생할 수 있습니다:

둘 이상의 범위 수준에서 표시되는 경우.

동일한 수준에서 두 가지 다른 의미를 가집니다.

 

예를 들어, 별도의 모듈에 있는 프로시저들은 같은 이름을 가질 수 있습니다. 따라서 Mod1과 Mod2 모듈에 각각 MySub라는 프로시저를 정의할 수 있습니다. 각각의 프로시저는 자신의 모듈 내에서만 호출되는 경우 충돌이 발생하지 않습니다. 그러나 MySub가 세 번째 모듈에서 호출되고, 이 두 개의 MySub 프로시저를 구분할 자격이 주어지지 않으면 오류가 발생할 수 있습니다.

'Moduel 1
Sub MySub()
    MsgBox "This is MySub in Module1"
End Sub

'Module 2
Sub MySub()
    MsgBox "This is MySub in Module2"
End Sub

'Module 3
Sub CallProcedures()
    MySub ' 어느 모듈의 MySub가 호출될지 모호합니다.
End Sub

대부분의 명명 충돌은 각 식별자 앞에 모듈 이름과 필요한 경우 프로젝트 이름으로 구성된 접두사를 추가함으로써 해결할 수 있습니다.(번역에는 한정자라고 나오지만 이해하기 쉬운 접두사라는 표현을 썼습니다.)

'Moduel 1
Sub MySub()
    Debug.Print "This is MySub in Module1"
End Sub

'Module 2
Sub MySub()
    Debug.Print "This is MySub in Module2"
End Sub

'Moduel 3
Sub CallMySub()

    Module1.MySub ' Calls the MySub procedure from Module1
    Module2.MySub ' Calls the MySub procedure from Module2
    
End Sub

Visual Basic은 식별자에 대한 각 참조를 일치하는 식별자의 "가장 가까운" 선언과 일치시킵니다. 예를 들어, 프로젝트의 두 모듈(Mod1 및 Mod2)에서 MyID가 Public으로 선언된 경우, Mod2 내에서 한정자 없이 Mod2에 선언된 MyID를 지정할 수 있지만 Mod1에서 지정하려면 Mod2.MyID로 한정자를 지정해야 합니다.

' Moduel 1
Public MyID As Integer

Sub Mod1_Sub()
    MyID = 10
    Mod2.MyID = 30 ' Setting the MyID variable in Mod2 to 30 using the qualifier Mod2.MyID
    Debug.Print "Mod1 - MyID: " & MyID & ", Mod2 - MyID: " & Mod2.MyID
End Sub

' Module 2
Public MyID As Integer

Sub Mod2_Sub()
    MyID = 20
    Debug.Print "Mod2 - MyID: " & MyID
End Sub

* 이 부분은 저같은 초보자가 아직은 신경쓸 부분은 아니라고 생각해서 예제가 없습니다.

Mod2가 다른 프로젝트에 있지만 직접 참조된 프로젝트에 있는 경우에도 마찬가지입니다. 그러나 Mod2가 간접 참조된 프로젝트, 즉 직접 참조하는 프로젝트에서 참조하는 프로젝트에 있는 경우 MyID라는 이름의 Mod2 변수에 대한 참조는 항상 프로젝트 이름으로 한정되어야 합니다. 직접 참조된 세 번째 모듈에서 MyID를 참조하는 경우 검색을 통해 가장 먼저 발견되는 선언과 일치합니다:

 

Tip

이름 충돌로 인해 발생하는 일반적인 오류에는 모호한 이름, 중복 선언, 선언되지 않은 식별자, 찾을 수 없는 프로시저 등이 있습니다. 각 모듈을 Option 명시문으로 시작하여 변수를 사용하기 전에 명시적으로 선언하도록 하면 잠재적인 명명 충돌 및 식별자 관련 버그를 방지할 수 있습니다.

 

도움말 출처

 

 

Avoiding naming conflicts (VBA)

Office VBA reference topic

learn.microsoft.com

 

'언어 참조' 카테고리의 다른 글

Visual Basic 문 작성  (0) 2023.07.31
실행 문 작성  (0) 2023.07.30
개체, 메서드, 속성 및 이벤트 이해  (0) 2023.07.30
개체 변수 만들기  (0) 2023.07.29
Set 문  (0) 2023.07.29