개발일기장
프로시져(Procedure) 본문
프로시져 사용하기
이 강좌는 사실 기초강좌에서 다루어야 할 내용이지만 어쩌다 보니 중급 강좌로 넘어 왔네요.
제목에 있는 프로시져(Procedure)란 뭘까요? 우리는 보통 프로시져라는 말은 어떤 행위를 하는데 있어서 절차나 순서를 말합니다. 그래서 이런 경우에는 이런 프로시져에 따라 수행하라. 뭐 이런 말을 하게 되죠. 그럼 컴터에서 프로시져란 단순한 절차를 말하는 것이 아니라 그런 절차를 밟기 위해 수행해야 하는 일련의 처리 과정 혹은 행위의 묶음을 말합니다. 즉 추상적 개념의 순서가 아니라 구체적 행동들의 모임입니다.
예를 들어,
두 수를 더하기하는 프로시져가 있다면 두 수를 읽어 들이고 두 수를 더하면 되겠죠. 그 일련의 처리는 다음과 같겠죠.
1. number1을 읽어 들인다.
2. number2를 읽어 온다.
3. number1 + number2한다.
4. 결과값을 sum에 할당한다.
5. 필요하면 sum을 출력한다.
그럼 왜 이런 프로시져가 필요할까요? 이는 프로그램의 경량화를 위해서 필요하죠. 프로그램 전체에서 더하기 하는 과정이 10군데가 있다면 매번 더하기 처리가 필요할 때마다 위의 5단계 처리과정을 일일이 코드 입력을 해야 하겠죠. 미칠 노릇 입니다. 그냥 더하기 하세요라고 하면 얼마나 좋을까요. 더하기를 전문으로하는 뭔가가 있다면 두수를 던져주고 더하기 하세요라고 명령하면 되죠. 이때 더하기를 전문으로하는 뭔가가 프로시져가 되고 던져주고 더하기 하세요라고 명령하는 것을 프로시져를 호출(Call)한다고 합니다.
프로시져에는 두가지 종류가 있습니다. 일련의 처리의 결과를 반환하는 Function 프로시져가 있고 처리만 하고 반환값이 존재하지 않는 Subroutine 프로시져가 있습니다. 즉 위의 예로 설명하자면 단계5의 유무에 따라 함수가 되기도 하고 서브루틴이 되기도 합니다.
여기서 프로시져를 호출할 때 던져 주는 뭔가를 바로 인수(Parameter)라고 합니다. 매개변수라고 하기도 합니다. 사실 직관적으로는 매개변수가 더 잘 어울리는 용어같습니다. 인수는 대통령직인수위원회할때의 인수를 말합니다(?). 매개변수를 넘겨주는 방식에는 매개변수값 자체를 넘겨주는 ByVal(By Value)와 매개변수의 메모리상의 위치는 넘겨주는 즉 참조를 전달하는 ByRef(By Reference)가 있습니다.
그럼 예제를 통해서 알아 볼까요.
예제7.1 사용자 지정 서브루틴 호출
아주 간단한 예제를 해볼까요. 디자인은 폼1에 달랑 버튼하나만 첨가합니다. 속성도 살짝 바꿉니다.
자! 그럼 ButtonAdd를 더블 클릭할까요. 그리고 서브루틴을 하나 만들어 보죠.
그럼, ButtonAdd를 클릭할때마다 AddNum()이라는 서브루틴이 호출되게 할까요.
이렇게 되면 버튼이 클릭될때마다 AddNum이라는 서브루틴이 호출됩니다. 실행해 볼까요.
즉 필요한 위치에서 그 서브루틴의 이름을 불러주면 호출되는 거죠.
7.1 인수가 있는 서브루틴, 인수 전달 방법은 ByVal(값전달)와 ByRef(참조전달)
이번에는 인수도 같이 전달 해볼까요. 방법은 2가지1가 있습니다. 강좌 도입부에서 언급한 것처럼 값전달과 참조전달입니다. 이 둘의 특징을 명확히 알고 있어야 합니다. 이 둘의 가장 큰 차이점은 서브루틴을 호출한 후 벌어집니다. ByVal,값전달은 넘겨준 인수를 처리하여도 서브루틴밖에서의 인수의 값은 변하지 않습니다. 그에 반해서 ByRef,참조전달은 서브루틴에서 인수처리를 하면 처리된 결과에 따라 서브루틴밖에서도 인수값이 변하게 됩니다. 말이 어렵습니다. 예제를 통해서 알아보죠.
예제7.2 ByVal / ByRef
그냥 간단한 예제를 하나 해보죠. 값을 두배로 하는 서브루틴이 있다고 해보죠. 매개변수 즉 인수를 넘기는 방법에 따라 어떤 결과가 생기는지 알아보죠. 디자인은 약간 복잡해 보일수도 있겠네요. 넘기기 전 변수의 값을 보여주어야 하고 서브루틴내에서의 값도 비교해서 보여주어야 하기 때문입니다. 그리고 서브루틴에서 처리한 후 변수의 값도 보여주어야 합니다. 적당히 속성값도 변화시켰습니다. 텍스트속성과 네임속성입니다. 아래에서 보면 Label2가 반복되는데요 복사해서 그렇습니다. 텍스트만 같고 네임속성은 각가 After,Before,Sub으로 다르죠.
각각 버튼을 클릭하여 코드를 작성해보죠.
코드와 실행화면입니다. ByRef로 하면 서브루틴밖에서도 num값이 변해 있습니다. 길지 않으니 직접 입력해서 해보세요. 차이를 알 수 있습니다.
이번에는 함수에 대해서 알아볼까요. 서브루틴과는 다른 함수의 특징은 위에서 언급한 것 처럼 반환값이 존재한다는 것입니다. 따라서 함수 생성시 데이터 type을 정의해 주어야 합니다.
7.3 함수 사용하기
값을 두배로 하는 함수가 있다고 할까요. 매개변수 즉 인수는 single이고 반환값이 만약에 String이라면 다음과 같이 생성해주어야 합니다.
Private Function DoubleFunc(ByVal num As Single) As String
예제를 통해서 보죠.
예제 7.3
어떤 예제를 할까요. 반환값을 String으로 해야 하니까......이렇게 할까요. 함수의 코드입니다.
Private Fucntion DoubleFunc(ByVal num As Single) As String
Dim numString As String
num = num * 2
numString = num.ToString()
return numString
End Function
여기서 ToString()은 문자열로 만들라는 거죠. 예제를 위해서 억지로 함수를 만들어 본 겁니다.
이제 디자인해볼까요. 폼에 그냥 텍스트박스와 버튼하나만 만들죠. 그리고 텍스트박스에 입력한 값을, 버튼을 클릭하면 메시지박스에 그 두배값이 출력되게 하죠. 그러니까 입력은 숫자인데 출력은 문자열이 되는 겁니다.
위에서 보면 MessageBox.Show()는 문자열을 표시하게 하는 함수인데요. 그 인수로 DoubleNum()이라는 함수자체를 사용하고 있습니다. 이는 함수이므로 가능한 거구요. 함수의 반환값(Return)이 문자열이기 때문입니다.
처음등장하는 메서드가 있네요.
TextBox1.Clear()
TextBox1.Focus()
이것은 각각 깨끗하게 초기화하라는 말이구요, 그리고는 커서를 위치시키라는 말입니다. 입력에 대비해서요. 그럼 실행해 볼까요.
여기서 메세지박스의 확인을 클릭하면 텍스트박스의 내용이 지워지고 커서가 위치하고 있는 것을 볼 수 있습니다. 유용한 기능입니다.
다음으로 Optional에 대해서 알아볼까요. 이것도 인수를 넘겨주는 방법중의 하나 입니다.
7.4 Optional 사용하기
말그대로 Optional은 선택사항이라는 말입니다. 함수나 서브루틴을 정의할때 인수도 같이 정의해주게 됩니다. 다음과 같이.
Private Sub AddNum(ByVal num1 As Integer, ByRef num2 As Integer)
여기서 num1, num2는 함수내에서 사용되는 변수가 되겠죠. 그리고 프로시져를 호출할때 변수의 값을 넘겨주는 방식도 역시 정하게 됩니다. 그렇다면 이런 경우도 있지 않을까요. 프로시져에서는 필요한 변수이지만 프로시져를 호출하는 쪽에서는 간혹 변수의 값을 넘겨주지 않을때 말입니다. 또 어떤 상황에서는 넘겨주어야 할 때도 존재하구요. 이렇게 필수가 아닌 선택사항으로 변수를 넘겨주게 될 경우에 변수이름 앞에 Optional이라고 인수를 정의해주게 됩니다. 말이 너무 어렵네요. 예제를 통해서 알아 보죠.
예제 7.4 Optional 사용
음......................예제를 하기전에 실생활에서 Optional을 사용하는 경우를 생각해보죠. 언제 사용할까요? 사용하기는 하나요?
자주 사용하는 개념입니다. 우리가 알아차리지 못해서 그렇죠. 뭐 이런 경우를 생각해볼까요. 어떤 대리점에서 주문을 하는 경우에,
"그릇 20개 주세요....아! 근데 이번에는 네모난 그릇으로 주세요. 이분은 희한하게 네모난 그릇을 원하시네요"
주문시 보통은 그릇 수량만 불러주면 되는데, 왜냐면 보통 원형의 그릇이니까.....그럼 그릇의 형태는 이때 옵션이 되는거죠. 특별한 말이 없으면 원형이고 특별히 네모라고 주문하는 경우도 있고. 이걸 서브루틴으로 나타내 볼까요.
Private Sub 그릇주문(ByVal 그릇수 As Integer, Optional ByVal 그릇모양 As String = "원형")
어.....바로 초기화하네요. 그릇모양을 인수로 주지않을 경우에 대비해서 초기화값을 가지고 있는 겁니다.
그럼 예제를 해볼까요. 입력된 수를 n배로 하는 서브루틴이 있다고 할까요. 보통은 주로 2배를 하는 루틴인데 특별한 경우에는 인수로 multi을 넘기게 됩니다.
Private Sub MultipleNum(ByVal num As Single, Optional ByVal multi As Integer = 2)
디자인은 간단하게 하죠. 입력하는 수가 두개가 있죠. 수와 몇배로 할지 결정하는 거요. 따라서 입력용 텍스트 박스가 두개 필요하고 출력용으로 하나가 더 필요하고 계산버튼이 필요하네요.
자! 그럼 계산버튼을 더블클릭해서 코드를 입력할까요.
보지 못하던 것이 있네요. 바로 Val()함수입니다. 이것은 문자열에 수치가 포함되어 있는 경우에 문자열에 포함된 숫자를 수치로 바꾸어주는 함수입니다. 예를 들면,
Val("이것은 22입니다") = 22
사실 여태껏 사용하지 않고도 잘 작동했죠. 위의 예에서 보면 num = Val(Textbox1.Text)에서 Val()을 생략해도 됩니다. 왜냐면 비베가 알아서 형변환을 시키기 때문입니다. 사실 TextBox1에 입력하는 것은 숫자가 아니라 문자열이죠. 근데 이 문자열을 수치형 변수에 대입할 경우 비베가 알아서 수치로 바꾸었습니다. 근데 지금 아무것도 입력하지 않은 경우를 생각해야 하고 비교구문을 사용하기 위해서 어쩔 수 없이 명시적으로 형변환을 시키고 있습니다. 아무것도 입력하지 않으면 수치형으로 보면 0입니다. 예제를 위한 억지 프로그램인 셈입니다.
결과를 볼까요.
입력값이 없는데도 기본2배가 출력되었습니다.
사실 또다른 인수전달 방법이 있습니다. 바로 ParamArray입니다.
출처 : http://blog.daum.net/shksjy/123
'프로그래밍 > Visual Basic 6.0' 카테고리의 다른 글
SUB와 FUNCTION의 차이 (0) | 2018.07.12 |
---|