If문과 Select문의 비교

프로그래밍의 가장 기본 중의 하나가 If문에 의한 실행의 분기일 것이다.
단순한 분기에서부터 다중 분기까지 가능하다.
<문제>
성적 점수에 따라 평점(A, B, C, D, F 등으로 표시되는 것. 학점하고 구분)을 반환하는 함수를 작성하라.

1) If문을 이용한 함수 1

[code lang-vb]   Public Function GetGrade(ByVal AverageScore As Single) As String
       If AverageScore >= 96 Then
           Return "A+"
       ElseIf AverageScore >= 90 And AverageScore < 96 Then
           Return "A0"
       ElseIf AverageScore >= 86 And AverageScore < 90 Then
           Return "B+"
       ElseIf AverageScore >= 80 And AverageScore < 86 Then
           Return "B0"
       ElseIf AverageScore >= 76 And AverageScore < 80 Then
           Return "C+"
       ElseIf AverageScore >= 70 And AverageScore < 76 Then
           Return "C0"
       Else
           Return "F"
       End If
   End Function [/code]
조건이 굉장히 복잡하게 보이지만, 계산 논리를 한번에 알아볼 수 있다.
이렇게 다중 분기하는 경우 다음과 같이 Select문을 생각해 볼 수 있다.

2)Select문을 이용한 함수
[code lang-vb]   Public Function GetGrade(ByVal AverageScore As Single) As String
       Select Case AverageScore
           Case 96 To 100
               Return "A+"
           Case 90 To 95
               Return "A0"
           Case 86 To 89
               Return "B+"
           Case 80 To 85
               Return "B0"
           Case 76 To 79
               Return "C+"
           Case 70 To 75
               Return "C0"
           Case Else
               Return "F"
       End Select
   End Function [/code]

이 함수는 심각한 문제를 안고 있다. 즉, 85.5와 같은 점수에 대해서는 "F"를 줄 수 있기 때문이다.
Case 간에 비어있는 범위가 생길 수 있다는 점에서 유의해야 한다.

3)다시 If문을 이용한 함수
처음 If문을 간결하게 다시 작성하면 다음과 같이 할 수 있다.
여기서 중요하게 볼 것은 처음 조건문은 그 다음 조건문의 필터 역할을 한다는 것이다.
예를들어 85.5점은 처음 조건문부터해서 두번째 조건문까지 만족하지 않는다. 그러나, 세번째 조건문에서는 통과하여 평점을 받게 된다. 즉, 세번째 조건문에 '90보다 작다'는 필터가 두번째의 조건문을 통해서 만들어진 것이다.
[code lang-vb]   Function GetGrade(ByVal 점수 As Single) As String
       Dim grade As String = ""
       If 점수 >= 95 Then
           grade = "A+"
       ElseIf 점수 >= 90 Then
           grade = "A"
       ElseIf 점수 >= 85 Then
           grade = "B+"
       ElseIf 점수 >= 80 Then
           grade = "B"
       ElseIf 점수 >= 75 Then
           grade = "C+"
       ElseIf 점수 >= 70 Then
           grade = "C"
       ElseIf 점수 >= 65 Then
           grade = "D+"
       ElseIf 점수 >= 60 Then
           grade = "D"
       Else
           grade = "F"
       End If
       Return grade
   End Function [/code]
주의사항 : 제대로 된 필터 기능을 사용하고자 한다면, 점수가 고득점부터 저득점으로 내려오든, 저득점에서 고득점으로 올라가든, 일정한 순서로 조건문을 배열해야 한다는 점이다.

정령 Select문으로는 해결할 수 없는가?
이것을 Select문으로 바꾸면 다음과 같이 될 것이다.

4) 다시 Select문을 이용한 함수
Is라는 키워드를 사용하면 다음과 같이 작성할 수 있다.
[code lang-vb]   Function GetGrade(ByVal 점수 As Single) As String
       Dim grade As String = ""
       Select Case 점수
           Case Is >= 95
               grade = "A+"
           Case Is >= 90
               grade = "A"
           Case Is >= 85
               grade = "B+"
           Case Is >= 80
               grade = "B"
           Case Is >= 75
               grade = "C+"
           Case Is >= 70
               grade = "C"
           Case Is >= 65
               grade = "D+"
           Case Is >= 60
               grade = "D"
           Case Else
               grade = "F"
       End Select
       Return grade
   End Function [/code]
이 방법도 Case 점수가 일정한 순서로 배치되어 가능하다는 점을 유의해야 한다.

Posted by solarview

2006/04/04 22:19 2006/04/04 22:19
, ,
Response
No Trackback , No Comment
RSS :
http://www.solarview.net/rss/response/4

Single.Parse()는 문자열을 읽어서 그 값을 Single형 값으로 바꾸어준다.
[code lang-vb]Dim myValue As Single = Single.Parse("36.5")[/code]

myValue는 단정도 실수인 36.5가 된다.
이 방법은 파일에서 문자열을 읽어온 후에, 그 값을 전환하는데 있어서 매우 유용하다.
같은 방법으로 문자열을 읽어서 특정 객체를 생성시키려면 다음과 같이 하면 된다.

<작성하고자 하는 클래스>
[code lang-vb]Public Class Person '클래스명 = Person
   Private m_Name As String
   Private m_Age As Short
   ...<중략>....
End Class[/code]

1) String형 매개변수를 갖는 생성자를 선언한다.
  그리고, 생성자 코드 안에 문자열을 해석할 InternalParse를 호출한다.
[code lang-vb]Public Sub New(ByVal myText As String)
   InternalParse(myText)
End Sub [/code]
  생성자 내용을 간단하게 하는 것이 좋다.
  다른 함수(초기화메소드)를 이용하면, 인스턴스 변수에 대한 초기화를 생성자 이외에서도 할 수 있다.

2) InternalParse() 메소드를 작성한다.
[code lang-vb]Private Sub InternalParse(ByVal myText As String)
   '문자열을 분해한다.
   Dim Words() As String = GetWords(myText) 'GetWords에 대한 함수는 각자가 작성 ^^
                                                                  '하나의 문자열을 의미있는 단어로 분할!
    '분해된 문자열을 인스턴스 변수에 대입한다.
   m_Name = Words(0) '이름
   m_Age = Short.Parse(Words(1)) '나이
End Sub [/code]

3) Parse() 메소드를 작성한다.
이 때, 이 클래스의 인스턴스 없이 Parse()메소드를 호출하기 위해서는 Shared를 선언한다.
[code lang-vb]Public Shared Function Parse(ByVal myText As String) As Person
   Return New Person(myText)
End Sub[/code]


4)사용법
[code lang-vb]Dim mySon As Person = Person.Parse("김창선, 4") [/code]

이름은 '김창선'이고 나이는 '4'인 mySon 인스턴스가 생긴다.

Posted by solarview

2006/04/03 22:18 2006/04/03 22:18
, , ,
Response
No Trackback , No Comment
RSS :
http://www.solarview.net/rss/response/3