본문 바로가기

Web Development/ASP

[ASP] 제어 구문에 대해서

제어 구문과 결정 구조 (If... Then, Select Case..)

제어 구문

지금까지 알아본 여러 가지 변수와 배열 등은 사용자로 하여금 데이터를 저장하는 공간의 역할을 수행한다. 그러나 실제 프로그램에서는 이런 저장의 공간뿐만이 아닌 경우에 따라 실행되는 제어문이 필요하게 된다. 조건을 비교한다든지, 반복 실행을 한다든지 하는 것이 이에 속하는 것이다. 지금부터 실제 프로그램에 핵심이 되는 제어 구문에 대해서 알아보도록 하자.

제어 구문이란?

ASP와 같은 인터프리터 언어에서 특히 볼 수 있지만 일반적인 프로그램 코드의 실행은 단 방향성을 가진다. 예를 들어, 왼쪽에서 오른쪽으로 실행되든지 위에서 아래로 실행된다. 이런 흐름에 제어 구문이 존재하지 않다면 단 방향성을 피할 수 없게 되는 것이다. 필요한 부분에서 선택 실행이라든지 반복이라든지 하는 모든 작업이 이루어지지 않게 되는 것이다. 그러나 프로그래밍에서는 이런 점들을 보안하기 위해 사용자에게 제어할 수 있는 여러 가지 구문을 제공하고 있다. 분기를 위한 결정 구조, 프로세스의 반복에 사용되는 루프 구조, 코드에서의 제어 구조와 관련된 작업의 기본 사항인 제어 구조 작업등이 있다. 지금부터 이런 제어 구문의 종류들에 대해서 자세히 알아보겠다.

결정 구조

결정 구조는 하나의 조건에 대해 참인지 거짓인지 판단하여 서로 다른 구문을 실행시켜주는 구조를 나타낸다. 예를 들어, 회원으로 가입되어 있는지 안되어 있는지에 따라서 다른 부분을 출력한다고 하였을 때 이런 결정 구조를 사용할 수 있다. ASP는 이런 결정 구조를 위해서 다음의 세 가지를 지원한다.

● If... Then

● If... Then... Else

● Select Case

각각의 구문이 표현하는 의미가 조금씩 다르다. 어떤 경우에 사용할 수 있는지 실제 사용 예제를 보면서 알아보자.

1) If... Then

If... Then 구조를 사용하여 조건부로 여러 구문을 실행할 수 있다. If... Then의 구문 형식은 다음과 같다.


If 조건문 Then 실행구문

If 조건문 Then
  실행구문 1
  실행구문 2
End If


일반적으로 조건문은 비교를 나타내지만 경우에 따라 숫자값을 나타내는 산술식이 될 수 있다. 앞에서 알아본 관계 연산자나 논리 연산자를 이용해 조건문을 표현하게 되고, 이 조건이 참이면 Then 다음의 실행구문이 실행된다. 다음의 예제를 살펴보자.

● ifthen.asp


<%@ Language=VBScript %>

<%

Num1 = 10
Num2 = 3

If Num1 > Num2 Then
  Response.Write "Num1이 Num2보다 크다."
End If

If Num1 = Num2 Then
  Response.Write "Num1과 Num2는 같다."
End If

If Num1 < Num2 Then
  Response.Write "Num1이 Num2보다 작다."
End If

%>



ifthen.asp 결과

코드를 살펴보자. 우선 Num1을 10, Num2를 3으로 설정하였다. 이 숫자를 다른 것으로 변경하여도 상관없다. Num1과 Num2를 가지고 조건문을 만들어 각각 다른 문장을 출력하게 되는 것이다.

처음 If문에 있는 Num1 > Num2는 참인 조건이 되므로 다음 줄에 있는 메시지가 결과 화면에 나타난다. 그러나 이외의 조건에 대해서는 모두 거짓이므로 결과 화면에 출력되지 않는 것이다.

2) If... Then... Else

If... Then에서는 조건에 대한 참인 경우에만 구문이 실행되지만, 거짓이거나 다른 조건을 동시에 비교하고자 한다면 If... Then... Else문을 사용해야 한다. If.. Then... Else의 구문은 다음과 같다.


If 조건문 1 Then
  [실행구문 1]
[ElseIf 조건문 2 Then
  [실행구문 2]] ...
[Else
  [실행구문 n]]
End If


If... Then... Else문은 우선 조건문이 참이 될 때까지 계속 비교하게 된다. 이렇게 하여도 참인 조건문이 없으면 Else 다음에 있는 실행구문으로 넘어가게 된다. 실행구문이 실행되면 End If로 가면서 모든 조건문의 실행이 끝나게 된다. 즉, 조건의 경우가 많은 경우 계속 비교할 수 있어 사용자에게 많은 선택의 경우를 줄 수 있는 구문이다.

If... Then... Elseif는 If... Then... Else의 특별한 경우이다. 조건의 수만큼 Elseif절을 사용하거나 전혀 사용하지 않을 수도 있다. Elseif절의 사용여부와는 상관없이 Else는 사용할 수 있다. 다음의 예제를 살펴보자.

● ifthenelse.asp


<%@ Language=VBScript %>

<%

Num1 = 10
Num2 = 3

If Num1 > Num2 Then
  Response.Write "Num1이 Num2보다 크다."
ElseIf Num1 = Num2 Then
  Response.Write "Num1과 Num2는 같다."
Else
  Response.Write "Num1이 Num2보다 작다."
End If

%>



ifthenelse.asp 결과

코드의 실행 결과는 앞의 ifthen.asp에서와 동일하나 그러나 앞서 If... Then... 문만을 사용할 때보다는 코드의 길이가 많이 줄어든 것을 볼 수 있다. Num1과 Num2의 값을 코드의 첫 부분에서 선언한 뒤 조건문을 통해 각각의 실행구문을 달리한다.

우선 Num1 > Num2의 경우를 조사한 뒤, ElseIf Num1 = Num2의 조건을 비교한다. 이런 조건에 만족하지 않는다면 Else 다음의 구문이 실행되는 것이다. 이처럼 If문은 사용자에게 여러 가지 발생할 수 있는 조건을 부여하게 하여 프로그램에서의 유연한 코드의 작성이 가능하게 하는 역할을 수행한다.

3) Select Case

If... Then...은 조건문의 비교를 통해서 사용자에게 다른 실행구문을 나타내어 준다. 그러나 조건문이 많아지거나 정해져 있는 값을 가지고 있다면 일일이 If... Then... ElseIf 문을 사용하는 것은 복잡한 코드를 만들게 된다. 이런 경우 사용할 수 있는 구문이 Select Case문이다. 즉 If... Then...을 사용할 경우에는 각각의 조건을 모두 비교해야 하지만 Select Case문을 사용할 경우에는 하나의 검사식을 한번만 평가하면 된다. Select Case의 구문은 다음과 같다.


Select Case 조건식
  [Case 목록1
    [실행구문-1]]
  [Case 목록2
    [실행구문-2]]

  ...

  [Case Else
    [실행구문-n]]
End Select


우선 비교하고자 하는 조건식이 Case문 다음에 위치한다. 이 조건식이 가질 수 있는 값의 목록이 각각의 Case 다음의 목록에 나타내는 것이다. 목록의 값이 여러 가지 존재할 경우에는 쉼표로 구분하여 목록을 작성할 수 있다. 조건식이 가지는 값이 Case 목록에 존재하지 않을 경우에는 Case Else 다음의 구문이 실행되는 전체 구조를 이룬다. 다음의 예제를 살펴보자.

● selectcase.asp


<%@ Language=VBScript %>

<%

Select Case Day(Now)
  Case 1,2,3,4,5,6,7,8,9,10
    Response.Write "오늘은 " & Day(Now) & ", 월초입니다."
  Case 11,12,13,14,15,16,17,18,19,20
    Response.Write "오늘은 " & Day(Now) & ", 중순입니다."
  Case 21,22,23,24,25,26,27,28,29,30,31
    Response.Write "오늘은 " & Day(Now) & ", 하순입니다."
End Select

%>



selectcase.asp 결과

Day(Now)는 오늘의 날짜에서 일의 값을 가져오는 표현식이다. 오늘의 날짜에 따라서 각각의 실행구문이 달라진다. 1에서 10, 11에서 20, 21에서 31까지 다른 실행구문이 출력된다. 이처럼 Select Case문은 표현식이 가지는 값들을 열거하여 다른 실행구문을 사용자에게 나타내고자 할 때 사용하면 좋은 결과를 얻을 수 있다

루프 구조 (For... Next, For Each... Next, Do... Loop)

루프 구조

여러 줄의 코드를 반복 실행하고자 할 경우에 반복되는 코드 수만큼 루프 구조를 사용하면 쉽게 해결할 수 있다.

예를 들어 반복 출력을 하거나 데이터에 저장되어 있는 목록을 출력하고자 할 때에 이런 루프 구조를 사용할 수 있다.
ASP에서 지원하는 루프 구조는 다음과 같다.

● For... Next

● For Each... Next

● Do... While

각각의 구문이 표현하는 의미가 조금씩 다르다. 어떤 경우에 사용할 수 있는지 실제 사용 예제를 보면서 알아보자.

1) For... Next

반복 실행하여야 하는 루프의 수를 알고 있을 경우에 For... Next문을 사용한다.
For 루프는 순환이 되풀이되는 동안 값을 증가시키거나 감소시키는 카운터 변수를 사용한다.
For... Next 구문은 다음과 같다.


For 카운터 = 시작값 To 종료값 [Step 증가값]
  실행구문
  ...
Next


우선 카운터 변수를 하나 설정한다. 이 변수를 기준으로 시작값부터 종료값까지 반복하여 실행하게 되는 것이다.
증가값에 대한 표기가 없으면 자동으로 1씩 증가하게 되고,
매번 카운터 값과 종료값을 비교하여 새로운 반복이 될 것인지를 판단하게 된다.

다음의 예제를 살펴보자.

● fornext.asp


<%@ Language=VBScript %>

<HTML>
<HEAD>
  <TITLE>For... Next 사용하기</TITLE>
</HEAD>

<BODY>

<% For i = 1 To 5 %>

For... Next의 <%=i%>번째 반복입니다.<BR>

<% Next %>

<HR>

<% For i = 1 To 10 Step 2

LoopCount = LoopCount + 1

%>

For... Next의 <%=LoopCount%>번째 반복이고, 카운터는 <%=i%>입니다.<BR>

<% Next %>

</BODY>
</HTML>



fornext.asp 결과

코드를 살펴보자. 우선 첫 번째 For문에서는 1부터 5까지 반복하면서 단순한 출력문을 나타낸다.
출력문에서 <%=i%>을 이용하여 현재 카운터의 값을 출력하고 있다.
두 번째 For문에서는 1부터 10까지 반복하면서 현재 루프의 수인 LoopCount와 현재 카운터의 값을 출력하였다.

For문의 기본적인 사용법에 대한 이해가 되는가.
For는 경우에 따라 Step에 마이너스(-) 값을 주어 감소하면서 반복문의 실행도 가능하게 된 구조를 제공한다.
ASP를 활용하는 여러 가지 구문들에게 실제 많은 예들을 볼 수 있을 것이다.

2) For Each... Next

For Each...Next 루프는 For...Next 루프와 비슷하지만 지정한 횟수만큼 문을 순환하지 않고 개체 컬렉션 또는 배열에서 각 요소에 대해 한 그룹의 문을 순환할 때 사용한다. 이 루프는 특히 컬렉션에 몇 개의 요소가 있는지 모를 경우에 유용하게 사용된다. For Each... Next의 구문 형식은 다음과 같다.


For Each 요소 In 그룹
  실행구문
  ...
Next


요소는 Variant 변수, 일반 개체 변수 또는 개체를 가리킨다. ASP에서는 배열의 속성이나 레코드셋의 속성이 이에 속한다. 그리고 그룹의 경우는 배열의 이름이나 레코드셋의 이름이 사용될 수 있다. 다음의 예제를 살펴보자.

● fornexteach.asp


<%@ Language=VBScript %>

<HTML>
<HEAD>
  <TITLE>For Each... Next 사용법</TITLE>
</HEAD>

<BODY>
<%

Dim Language(5)

Language(0) = "ASP"
Language(1) = "PHP"
Language(2) = "Visual Basic"
Language(3) = "Delphi"
Language(4) = "Power Builder"

For Each Item In Language
  Response.Write Item & "<BR>"
Next

%>

</BODY>
</HTML>



foreachnext.asp 결과

For Each... Next 구문을 사용하면 정해진 수만큼 반복 실행을 하지 않아도 된다는 부분에 주의해야 한다. For Each Item In Language라는 선언을 통해 배열 개체를 기준으로 반복 실행한다는 것을 의미한다. 각각의 배열의 인덱스에 저장되어 있는 Item을 통해서 배열의 값을 출력하게 된다. For... Next와는 다른 사용법을 가지고 있는 For Each... Next를 적절히 사용하면 훌륭한 효과를 얻을 수 있을 것이다.

3) Do... Loop

For 루프 구문은 정해져 있는 수만큼 반복 실행한다면, Do 루프 구문은 무제한 실행하고자 할 때 사용할 수 있다. 기본적인 무한 루프의 조건속에 사용자가 입력한 조건이 참이되면 루프가 끝나게 된다. Do... Loop의 구문 형식은 다음과 같다.


Do While 조건문
  실행구문
  ...
Loop


조건문은 If... Then에서와 동일하게 참 또는 거짓을 평가하는 값이나 식이 되어야 한다. 우선 조건문이 거짓이면 실행되지 않고 루프를 빠져나가고, 참이면 실행구문을 실행한 후 다시 조건문으로 돌아가게 된다. 다음의 예제를 살펴보자.

● doloop.asp


<%@ Language=VBScript %>

<HTML>
<HEAD>
  <TITLE>Do... Loop 사용법</TITLE>
</HEAD>
<BODY>

<%

TempCount = 1

Do While TempCount < 10
  Response.Write TempCount & "번째 루프입니다. <BR>"
  TempCount = TempCount + 1
Loop

%>

</BODY>
</HTML>



doloop.asp 결과

코드를 살펴보자. 우선 TempCount라는 루프의 수를 저장하는 변수를 선언하였다. Do 구문에서 TempCount가 10보다 작을 경우에는 TempCount를 출력하고, TempCount의 값을 1씩 증가하는 실행구문이 실행된다. 이렇게 계속 1씩 증가하여 10이 되면 루프가 끝나게 된다.

Do... Loop의 사용법이 이해가 되는가? 위의 예제만으로는 부족하겠지만 Do... Loop는 데이터베이스를 다루는 부분에서 주로 사용되어 많은 효과를 얻을 수 있다. 이후 데이터베이스 부분에서 확인하기 바란다.

그리고 Do... Loop와는 조금 기능이 다른 Do... Loop While 구문도 사용할 수 있다. 구문의 형식은 다음과 같다.


Do
  실행구문
  ...
Loop While 조건문


Do... Loop While 구문은 Do... Loop와는 달리 우선 실행구문이 한번 실행된 후 조건문을 통해 루프를 계속 할 것인지 빠져나갈 것인지를 결정하게 된다. 그렇기 때문에 최소한 한번 이상은 실행되는 구조이다. 다음의 예제를 살펴보자.

●doloopwhile.asp


<%@ Language=VBScript %>

<HTML>
<HEAD>
  <TITLE>Do... Loop While 사용법</TITLE>
</HEAD>
<BODY>

<%

TempCount = 1

Do
  Response.Write TempCount & "번째 루프입니다. <BR>"
  TempCount = TempCount + 1
Loop While TempCount < 10

%>

</BODY>
</HTML>



doloopwhile.asp 결과

Do... Loop의 예제와 동일한 결과를 출력한다. 우선 처음 루프가 시작되면 실행 구문을 출력한다. 그런 다음 조건문을 비교하게 되고, 이렇게 계속 루프를 실행하다 조건이 거짓이 되면 루프를 빠져 나온다.

Do... Loop에는 또 다른 변형인 Do Until... Loop와 Do... Loop Until이 있다. 이것은 Do... While의 형식과는 달리 조건문이 거짓일 때만 실행되는 형식이다. 앞의 구문과는 반대의 역할을 수행한다고 보면 된다. 기본적인 구문은 다음과 같다.


Do Until 조건문
  실행구문
  ...
Loop

Do
  실행구문
  ...
Loop Until 조건문


Do와 For는 사용자에게 반복을 위한 구조를 제공한다. 경우에 따라 적절히 사용하면 좋은 결과를 얻을 수 있다. 이 구문들의 사용을 꼭 익힌 후 다음으로 진행하자.

제어 구조 작업

제어 구조 작업

지금까지 알아본 여러 가지 제어 구조 구문을 가지고 실제 프로그래밍을 하다보면 앞의 예들로는 부족한 부분이 있다. 예를 들어 이중 구조의 반복문을 실행한다든지, Loop를 실행하다 중간에 빠져 나온다든지 하는 작업들이 있을 수 있다. 지금부터 이런 작업들을 어떻게 할 수 있는지 알아보자.

1) 중첩된 제어 구조

제어 구조 내부에 다른 제어 구조를 포함할 수 있다. 예를 들어 For... Next 루프 내에 If... Then을 사용한다든지, 다른 For... Next를 사용하는 것을 중첩된 제어 구조라 한다. 다음의 구구단을 출력하는 예제를 보자.

● multiple.asp


<%@ Language=VBScript %>

<HTML>
<HEAD>
  <TITLE>구구단 만들기</TITLE>
</HEAD>
<BODY>


<%

for i = 2 to 9
  Response.Write i & "단 <BR>"

  for j = 1 to 9
   Response.Write i & " x " & j & " = " & i*j & "<BR>"
  next

  Response.Write "<BR>"
next

%>


</BODY>
</HTML>



multiple.asp 결과

구구단을 출력하는 예제이다. 이 예제에는 두 개의 For... Next구문이 사용되었다. 우선 첫 번째 나오는 For문은 구구단에서의 단을 나타내는 역할이다. i가 증가하면서 현재 수행중인 단을 출력하며, 다음에 나오는 For를 통해 구구단의 각 요소들을 출력하게 된다. 즉 첫 번째 반복문에서 8번과 두 번째 반복문에서 9번이 루프를 돌면서 전체 72번의 루프가 생성하게 된다.

이렇게 중복 제어 구문을 사용하여야 할 경우가 많이 있다. 복잡한 연산이 아니니 잘 활용할 수 있도록 해야 하겠다. 그리고 중복 제어 구문을 사용할 경우에는 위의 코드 입력과 같이 들여 쓰기에 주의하는 것을 잊지 않아야 할 것이다.

2) 제어 구조 빠져나가기

제어 구조를 사용하다 경우에 따라 제어 구조를 빠져나가야 하는 상황이 발생한다. 이런 경우에는 Exit문을 이용하면 쉽게 해결할 수 있다. For 루프를 사용할 때에는 Exit For, Do 루프를 사용할 때에는 Exit Do를 사용할 수 있다. 구문 형식은 다음과 같다.


For 카운터 = 시작값 To 종료값 [Step 증가값]
  [실행구문 블럭]
  [Exit For]
  [실행구문 블럭]
Next

Do [{While | Until} 조건문]
  [실행구문 블럭]
  [Exit Do]
  [실행구문 블럭]

Loop


루프의 중간에 Exit문으로 제어 구문을 빠져나가게 된다. Do의 경우에는 모든 형식에 Exit Do를 사용하게 된다. 다음의 예제를 살펴보자.

● exit.asp


<%@ Language=VBScript %>

<HTML>
<HEAD>
  <TITLE>Exit 문 사용하기</TITLE>
</HEAD>
<BODY>

<%

for i = 1 to 10
  if i > 5 then
   Exit for
  end if
  Response.Write i & "번째 루프입니다. <BR>"
next

%>


</BODY>
</HTML>


 
exit.asp 실행 결과

For 루프를 이용하면 정해져 있는 수만큼 반복 실행하게 된다. 예제에서는 1부터 10까지 설정되어 있다. 그러나 For의 실행 구문에 If문을 이용하여 i의 값이 5보다 클 경우에는 Exit For를 이용해서 루프 구조를 빠져나가게 되어 있다. 이렇게 하여 결과 화면에서는 5번째까지 표현이 되게 된다.

지금까지 VBScript에서 지원하고 있는 제어 구문에 대해서 알아보았다. 변수와 같이 이용하여 실제 코드로 가장 많이 사용되며, 프로그래머의 능력을 볼 수 있는 부분이 된다. 많은 예제들을 접함으로서 어떤 경우에 사용할 수 있는지 하나하나 익히도록 해야 하겠다.