VB.NET IIf 문과 If문의 차이점

2024. 2. 13. 10:38VB.NET/왕초보

한줄짜리 조건문을 사용하기 위해서 여태까지는 IIf문을 사용했지만, VS2008 이후부터는 동일한 형식의 문법으로 If문을 그냥 사용할 수 있도록 기능이 추가되었다.

 

하지만 이들 사이에는 아주 큰 차이점이 있는데 이번에는 이 차이점에 대해 알아보도록 하자.

 

모두들 알다시피 IIf문의 문법은 아래와 같다.

Public Function IIf(ByVal Expression As Boolean, ByVal TruePart As Object, ByVal FalsePart As Object) As Object

 

총 3개의 파라미터가 들어가며, 첫번째 파라미터의 결과에 따라 True이면 두번째 파라미터를 반환하고, False이면 세번째 파라미터를 반환하는 단순한 구조이다.

 

아래 예제를 살펴보자.

Dim val1 As Integer = IIf(True, 1, 2)


이 예제에서 첫번째 파라미터가 True이니 val1에는 두번째 파라미터인 1이 들어가게 된다.

 

그러면 이 구문을 If문으로 변경하면 어떻게 될까? 이 경우에는 위 IIf문과 결과가 동일하다.

Dim val2 As Integer = If(True, 1, 2)

 

아직 If문이 이렇게 사용되는걸 모르는 개발자들이 많을텐데 VS2008 이후 부터 지원되는 기능이니 지금 사용되는 Visual Studio에서는 무조건 동작하는 동작이라고 볼 수 있다.

 

그렇다면, 이들 둘의 차이점은 어디에서 생기게 되는 것일까?

 

설명을 위해 아래와 같이 오류가 나는 간략한 함수를 하나 만들자.

Private Function DevideZero() As Integer
   Dim a As Integer = 1
   Dim b As Integer = 0
   Return a / b
End Function

 

0으로 나누니 당연히 오류가 나는 함수이다. 이제 이 함수를 호출하는 두개의 구문을 만들어보자.

Dim val1 As Integer = IIf(True, 1, DevideZero())
Dim val2 As Integer = If(True, 1, DevideZero())

IIf와 If를 사용하는것 외에는 동일하다. 이 구문을 실행시켜보면 첫번째 IIf를 사용한 구문은 오류가 나지만, 두번째 If를 사용한 구문은 오류가 나지 않는다.

 

즉, IIf를 사용하면 첫번째 파라미터가 True이든 False이든 관계없이 DevideZero() 함수의 결과를 확인하기 때문에 오류가 나는 것이고, If를 사용하면 첫번째 파라미터가 True이니 세번째 파라미터인 DevideZero()를 아예 실행하지 않아서 오류 없이 실행이 되게 된다.

 

당연히 두번째 If문을 사용하는게 훨씬 효율적이라고 볼 수 있고, 근소한 차이겠지만 실행 속도도 더 빠를 것이다. 하지만, 이 경우 상황에 따라 첫번째 파라미터가 True일때는 오류없이 실행되지만, False일때는 오류가 발생하니 프로그램이 정상동작을 했다가, 오류가 났다가 하는 무결성에 문제가 생길 수도 있다.

 

그러니, 상황에 따라 IIf문이나 If문을 적절하게 사용하는 지혜가 필요하다고 하겠다.

 

비슷한 경우로 아래 구문을 살펴보자.

If True Or DevideZero() Then val1 = 1

 

이 경우 Or로 묶인 두개의 구문인데 앞의 조건값이 True이니 사실 두번째 DevideZero()의 결과 여부와 관계없이 결과는 무조건 True이지만 굳이 DevideZero() 함수의 결과를 확인해서 오류가 나게 된다. C++이나 C#은 되는걸로 봐서 VB.NET에서 개선이 필요한 부분이 아닐까 싶다.

반응형