Visual Basic의 논리 및 비트 연산자
업데이트: 2007년 11월
논리 연산자는 Boolean 식을 비교하여 Boolean 결과를 반환합니다. And, Or, AndAlso, OrElse 및 Xor 연산자는 두 개의 피연산자를 사용하므로 이항 연산자이고 Not 연산자는 단일 피연산자를 사용하므로 단항 연산자입니다. 이러한 연산자 중 일부는 정수 계열 값에 대해 비트 논리 연산을 수행할 수도 있습니다.
단항 논리 연산자
Not 연산자(Visual Basic)는 Boolean 식에 대해 논리 부정을 수행하며 해당 피연산자의 반대 논리를 생성합니다. 식이 True인 경우 Not은 False를 반환하고 식이 False인 경우 Not은 True를 반환합니다. 다음은 이에 대한 예입니다.
Dim x, y As Boolean
x = Not 23 > 14
y = Not 23 > 67
' The preceding statements set x to False and y to True.
이항 논리 연산자
And 연산자(Visual Basic)는 두 Boolean 식에 대해 논리곱을 수행합니다. 두 식이 모두 True인 경우 And는 True를 반환합니다. 식 중 하나라도 False인 경우 And는 False를 반환합니다.
Or 연산자(Visual Basic)는 두 Boolean 식에 대해 논리합 또는 논리 포함을 수행합니다. 식 중 하나가 True이거나 두 식이 모두 True인 경우 Or는 True를 반환합니다. 두 식이 모두 True인 경우 Or는 False를 반환합니다.
배타적 or 연산자(Visual Basic)는 두 Boolean 식에 대해 배타적 논리합을 수행합니다. 식 중 하나만 True인 경우 Xor는 True를 반환합니다. 두 식이 모두 True이거나 두 식이 모두 False인 경우 Xor는 False를 반환합니다.
다음 예제에서는 And, Or 및 Xor 연산자를 보여 줍니다.
Dim a, b, c, d, e, f, g As Boolean
a = 23 > 14 And 11 > 8
b = 14 > 23 And 11 > 8
' The preceding statements set a to True and b to False.
c = 23 > 14 Or 8 > 11
d = 23 > 67 Or 8 > 11
' The preceding statements set c to True and d to False.
e = 23 > 67 Xor 11 > 8
f = 23 > 14 Xor 11 > 8
g = 14 > 23 Xor 8 > 11
' The preceding statements set e to True, f to False, and g to False.
단락(short circuit) 논리 연산
AndAlso 연산자는 두 Boolean 식에 대해 논리곱을 수행한다는 점에서 And 연산자와 매우 유사합니다. 두 연산자의 주요 차이점은 AndAlso가 단락(short circuit) 동작을 나타낸다는 것입니다. AndAlso 식의 첫 번째 식이 False인 경우 최종 결과를 변경할 수 없으므로 두 번째 식을 계산하지 않고 AndAlso는 False를 반환합니다.
마찬가지로 OrElse 연산자는 두 Boolean 식에 대해 단락(short circuit) 논리합을 수행합니다. OrElse 식의 첫 번째 식이 True인 경우 최종 결과를 변경할 수 없으므로 두 번째 식을 계산하지 않고 OrElse는 True를 반환합니다.
단락(short circuit)의 장단점
단락(short circuit)을 사용하면 논리 연산의 결과를 변경할 수 없는 식을 계산하지 않아 성능을 향상시킬 수 있지만 해당 식이 추가 작업을 수행하는 경우 단락(short circuit)은 이러한 작업을 건너뜁니다. 예를 들어, 식에 Function 프로시저에 대한 호출이 포함되어 있는 경우 식이 단락(short circuit)되면 해당 프로시저가 호출되지 않으며 Function에 포함된 추가 코드도 실행되지 않습니다. 프로그램 논리가 이러한 추가 코드에 따라 달라지는 경우에는 단락(short circuit) 연산자를 사용하지 않는 것이 좋습니다.
다음 예제에서는 And 및 Or 연산자와 단락(short circuit) 연산자의 차이점을 보여 줍니다.
Dim amount As Integer = 12
Dim highestAllowed As Integer = 45
Dim grandTotal As Integer
If amount > highestAllowed And checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount > highestAllowed AndAlso checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
If amount < highestAllowed Or checkIfValid(amount) Then
' The preceding statement calls checkIfValid().
End If
If amount < highestAllowed OrElse checkIfValid(amount) Then
' The preceding statement does not call checkIfValid().
End If
Function checkIfValid(ByVal checkValue As Integer) As Boolean
If checkValue > 15 Then
MsgBox(CStr(checkValue) & " is not a valid value.")
' The MsgBox warning is not displayed if the call to
' checkIfValid() is part of a short-circuited expression.
Return False
Else
grandTotal += checkValue
' The grandTotal value is not updated if the call to
' checkIfValid() is part of a short-circuited expression.
Return True
End If
End Function
위 예제에서는 호출이 단락(short circuit)되는 경우 checkIfValid() 내 일부 중요한 코드가 실행되지 않습니다. And가 단락(short circuit)하지 않으므로 12 > 45가 False를 반환하더라도 첫 번째 If 문은 checkIfValid()를 호출합니다. 12 > 45가 False를 반환하면 AndAlso가 두 번째 식을 단락(short circuit)하므로 두 번째 If 문은 checkIfValid()를 호출하지 않습니다. Or가 단락(short circuit)하지 않으므로 12 < 45가 True를 반환하더라도 세 번째 If 문은 checkIfValid()를 호출합니다. 12 < 45가 True를 반환하면 OrElse가 두 번째 식을 단락(short circuit)하므로 네 번째 If 문은 checkIfValid()를 호출하지 않습니다.
비트 연산
비트 연산은 두 정수 계열 값을 이진(2진법) 형식으로 계산합니다. 또한 해당 위치의 비트를 비교한 다음 이 비교를 기반으로 값을 할당합니다. 다음 예제에서는 And 연산자를 보여 줍니다.
Dim x As Integer
x = 3 And 5
위 예제에서 x 값을 1로 설정하는 이유는 다음과 같습니다.
값이 이진으로 처리됩니다.
3의 이진 형식 값 = 011
5의 이진 형식 값 = 101
And 연산자는 한 번에 하나의 이진 위치(비트)에서 이진 표현을 비교합니다. 지정된 위치에서 두 비트가 모두 1이면 해당 위치에는 결과적으로 1이 남습니다. 둘 중 한 비트가 0이면 해당 위치에는 결과적으로 0이 남습니다. 위의 예제 결과는 다음과 같습니다.
011(3의 이진 형식)
101(5의 이진 형식)
001(결과, 이진 형식)
결과는 10진수로 처리됩니다. 값 001은 1의 이진 표현이므로 x = 1입니다.
비교 비트 중 어느 하나라도 1인 경우 결과 비트에 1이 할당된다는 점을 제외하면 비트 Or 연산도 비슷합니다. Xor는 비교 비트 중 하나만 1인 경우 결과 비트에 1을 할당합니다. Not은 단일 피연산자를 사용하고 부호 비트를 포함한 모든 비트를 반전하여 해당 값을 결과에 할당합니다. 즉, 부호 있는 양수의 경우 Not은 항상 음수를 반환하고 음수의 경우 Not은 항상 양수 또는 0을 반환합니다.
AndAlso 및 OrElse 연산자에는 비트 연산을 사용할 수 없습니다.
참고: |
---|
비트 연산은 정수 계열 형식에 대해서만 수행할 수 있으므로 비트 연산을 수행하려면 먼저 부동 소수점 값을 정수 계열 형식으로 변환해야 합니다. |