Visual Basic의 산술 연산자

산술 연산자는 리터럴, 변수, 기타 식, 함수 및 속성 호출, 상수로 표현되는 숫자 값의 계산을 포함하는 친숙한 산술 연산을 수행하는 데 사용됩니다. 또한 산술 연산자로 분류되는 비트 시프트 연산자는 피연산자의 개별 비트 수준에서 작동하고 비트 패턴을 왼쪽 또는 오른쪽으로 이동합니다.

산술 연산자

다음 예제와 같이 식에 + 연산자를 사용하여 두 값을 추가하거나 - 연산자(Visual Basic)를 사용하여 다른 값에서 하나를 뺄 수 있습니다.

Dim x As Integer
x = 67 + 34
x = 32 - 12

부정에서는 다음 예제와 같이 - 연산자(Visual Basic)도 사용하지만 피연산자는 하나만 사용합니다.

Dim x As Integer = 65
Dim y As Integer
y = -x

곱하기 및 나누기에서는 다음 예제와 같이 * 연산자/ 연산자(Visual Basic)를 각각 사용합니다.

Dim y As Double
y = 45 * 55.23
y = 32 / 23

지수화에서는 다음 예제와 같이 ^ 연산자를 사용합니다.

Dim z As Double
z = 23 ^ 3
' The preceding statement sets z to 12167 (the cube of 23).

정수 나누기는 \ 연산자(Visual Basic)를 사용하여 수행됩니다. 정수 나누기는 몫을 반환합니다. 즉, 나머지를 고려하지 않고 제수가 피제수로 나눌 수 있는 횟수를 나타내는 정수를 반환합니다. 이 연산자에 대한 제수와 비제수는 모두 정수 형식(SByte, Byte, Short, UShort, Integer, UInteger, LongULong)이어야 합니다. 다른 모든 형식은 먼저 정수 형식으로 변환해야 합니다. 다음 예제에서는 정수 나누기를 보여 줍니다.

Dim k As Integer
k = 23 \ 5
' The preceding statement sets k to 4.

모듈러스 산술은 Mod 연산자를 사용하여 수행됩니다. 이 연산자는 제수를 피제수로 나눈 후 나머지를 정수 횟수로 반환합니다. 제수와 피제수가 모두 정수 형식인 경우 반환되는 값은 정수입니다. 제수와 피제수가 부동 소수점 유형인 경우 반환되는 값도 부동 소수점입니다 다음 예에서는 이러한 동작을 보여 줍니다.

Dim x As Integer = 100
Dim y As Integer = 6
Dim z As Integer
z = x Mod y
' The preceding statement sets z to 4.
Dim a As Double = 100.3
Dim b As Double = 4.13
Dim c As Double
c = a Mod b
' The preceding statement sets c to 1.18.

0으로 나누기 시도

0으로 나누면 관련된 데이터 형식에 따라 결과가 달라집니다. 정수 나누기(SByte, Byte, Short, UShort, Integer, UInteger, Long, ULong)에서 .NET Framework는 DivideByZeroException 예외를 throw합니다. Decimal 또는 Single 데이터 형식에 대한 나누기 작업에서 .NET Framework는 DivideByZeroException 예외도 throw합니다.

Double 데이터 형식과 관련된 부동 소수점 나누기에서는 예외가 throw되지 않으며, 결과는 피제수에 따라 NaN, PositiveInfinity 또는 NegativeInfinity를 나타내는 클래스 멤버입니다. 다음 표에는 Double 값을 0으로 나누려고 시도한 다양한 결과가 요약되어 있습니다.

피제수 데이터 형식 제수 데이터 형식 피제수 값 결과
Double Double 0 NaN(수학적으로 정의된 숫자가 아님)
Double Double > 0 PositiveInfinity
Double Double < 0 NegativeInfinity

DivideByZeroException 예외를 catch할 때 해당 멤버를 사용하여 처리할 수 있습니다. 예를 들어 Message 속성에는 예외에 대한 메시지 텍스트가 포함됩니다. 자세한 내용은 Try...Catch...Finally 문을 참조하세요.

비트 시프트 연산

비트 시프트 연산은 비트 패턴에 대한 산술 시프트를 수행합니다. 패턴은 왼쪽의 피연산자에 포함되고 오른쪽의 피연산자는 패턴을 이동할 위치 수를 지정합니다. >> 연산자를 사용하여 패턴을 오른쪽으로 이동하거나 << 연산자를 사용하여 왼쪽으로 이동할 수 있습니다.

패턴 피연산자의 데이터 형식은 SByte, Byte, Short, UShort, Integer, UInteger, Long 또는 ULong이어야 합니다. 이동량 피연산자의 데이터 형식은 Integer이거나 Integer로 확장해야 합니다.

산술 시프트는 원형이 아니으므로 결과의 한쪽 끝에서 이동된 비트가 다른 쪽 끝에서 다시 도입되지 않습니다. 시프트로 인해 비워진 비트 위치는 다음과 같이 설정됩니다.

  • 산술 왼쪽 시프트의 경우 0

  • 양수의 산술 오른쪽 시프트의 경우 0

  • 부호 없는 데이터 형식의 산술 오른쪽 시프트의 경우 0(Byte, UShort, UInteger, ULong)

  • 음수의 산술 오른쪽 시프트의 경우 1(SByte, Short, Integer 또는 Long)

다음은 Integer 값을 왼쪽과 오른쪽으로 이동하는 예제입니다.

Dim lResult, rResult As Integer
Dim pattern As Integer = 12
' The low-order bits of pattern are 0000 1100.
lResult = pattern << 3
' A left shift of 3 bits produces a value of 96.
rResult = pattern >> 2
' A right shift of 2 bits produces value of 3.

산술 시프트는 오버플로 예외를 생성하지 않습니다.

비트 연산

논리 연산자 외에도 Not, Or, AndXor는 숫자 값에 사용될 때 비트 산술 연산을 수행합니다. 자세한 내용은 Visual Basic의 논리 및 비트 연산자의 "비트 연산"을 참조하세요.

형식 안전성

피연산자는 일반적으로 동일한 형식이어야 합니다. 예를 들어 Integer 변수를 사용하여 추가를 수행하는 경우 다른 Integer 변수에 추가해야 하며 결과를 Integer 형식의 변수에도 할당해야 합니다.

형식이 안전한 코딩 방법을 보장하는 한 가지 방법은 Option Strict 문을 사용하는 것입니다. Option Strict On을 설정하면 Visual Basic에서 형식이 안전한 변환을 자동으로 수행됩니다. 예를 들어 Double 변수에 Integer 변수를 추가하고 값을 Double 변수에 할당하려고 하면 데이터 손실 없이 Integer 값을 Double로 변환할 수 있으므로 작업이 정상적으로 진행됩니다. 반면에 형식이 안전하지 않은 변환은 Option Strict On으로 인해 컴파일러 오류가 발생합니다. 예를 들어 Double 변수에 Integer 변수를 추가하고 값을 Integer 변수에 할당하려고 하면 Double 변수를 Integer형식으로 암시적으로 변환할 수 없으므로 컴파일러 오류가 발생합니다.

그러나 Option Strict Off를 설정하면 Visual Basic에서 암시적 축소 변환을 수행할 수 있지만 예기치 않은 데이터 또는 정밀도 손실이 발생할 수 있습니다. 이러한 이유로 프로덕션 코드를 작성할 때는 Option Strict On을 사용하는 것이 좋습니다. 자세한 내용은 Widening and Narrowing Conversions을 참조하세요.

참고 항목