d라이브러리









BASIC강좌⑤ 서브루틴의 다양한 활용법

서브루틴(subroutine)은 프로그램을 모듈(module)화 할 수 있는 하나의 프로그램의 단위로서 다른 프로그램에서 여러번 같은 루틴을 활용할 수 있다. 서브루틴을 사용하여 프로그램을 기능단위로 분해할 수 있기 때문에 프로그램 개발 당시뿐만 아니라 나중에 프로그램을 수정 편집하기 편하다. PC교실⑤에서 서브루틴의 의미와 간단한 활용을 알아보았다. 이번 강좌에서는 서브루틴이 어떻게 구성되며 어떻게 활용되는지 좀더 자세하게 살펴본다.

BASIC에서의 서브루틴

BASIC에서 서브루틴은 특별하게 이름을 붙일 수가 없다. 단지 문장번호로 그 기억위치를 확인하고 실행시킨다. 그리고 서브루틴의 종료는 RETURN으로 한다. 서브루틴의 사용에 있어서 서브루틴의 이름이 문장번호로 주어지기 때문에 GOSUB숫자와 같은 형식을 취해 해당 서브루틴을 실행시킨다. GOSUB는 GOTO SUBROUTINE의 약어이다. (그림1)의 프로그램은 키보드로부터 X와 Y의 값을 입력시켜서 평균을 구한뒤 출력시키는 프로그램이다. 실행시켜서 44와 55라는 데이타로부터 평균값 49.5를 출력시키고 있음을 알 수 있다.

 

(그림 1) 두수의 평균을 구하는 프로그램

 

(그림 1) 두수의 평균을 구하는 프로그램
 

(그림 1)로부터 서브루틴을 사용하여 (그림2)와 같은 프로그램으로 변환시켜보자.

30번 문장에 GOSUB 100이 들어가고 100번부터 서브루틴이 기억되도록 하고 있다. 서브루틴의 맨마지막 문장은 RETURN으로 되어 있음을 유의하여야 한다. 즉 모든 서브루틴은 다음과 같은 형식을 갖는다.

서브루틴은 필요에 따라 갯수에 제한없이 프로그램에서 사용할 수 있으며 서브루틴을 실행하는 도중에 또다른 서브루틴을 사용할 수도 있다. (그림 1)의 프로그램으로부터 데이타를 입력하는 부분, 평균값 계산 부분, 계산된 값을 출력하는 부분을 각각 서브루틴으로 변환하여 보자. 그리고 각각의 서브루틴은 100 200 300번 문장부터 시작한다. 따라서 (그림1)과 같은 프로그램은 다음과 같이 구성될 수 있다.

10 GOSUB 100
20 GOSUB 200
30 GOSUB 300
40 END

단, 100 200 300에 해당하는 서브루틴들이 주프로그램에 연결되어 있어야 한다. (그림3)이 변환된 결과이다. 3개의 서브루틴이 하나씩 실행되고 난 후, 제일 마지막으로 출력되는 것은 "END OF PROGRAM"이다.

(그림 2) 서브루틴의 사용예


(그림 2) 서브루틴의 사용예
 

(그림 3) 3개의 서브루틴으로 변환한 예


(그림 3) 3개의 서브루틴으로 변환한 예
 

(그림3)의 프로그램을 예로들어 서브루틴이 어떻게 처리되는지 그과정을 살펴보자. BASIC에서는 프로그램의 처리 과정을 알 수 있도록 트레이스(trace)기능을 갖추고 있다. 트레이스는 현재 실행되는 문장번호가 출력되어 프로그램의 진행과정을 알 수 있다.
IBM-PC의 BASIC에서는 TRON이고 APPLEⅡ BASIC에서는 TRACE이다. 또한 트레이스 기능을 중지시키는 명령으로 각각 TROFF, NOTRACE가 사용된다.

TRON 명령을 사용하여 (그림3)의 프로그램 실행과정을 트레이스시킨 결과가 (그림4)에 나타나 있다. (그림4)에서 실행되는 문장번호는 "["과 "]" 사이에 나타나있다. 10번과 20번 사이에 실행된 문장번호는 100 110과 120번임을 확인할 수 있을 것이다. 또한 20번과 30번 문장사이에 200 210번 문장을 실행시키고 있기 때문에 GOSUB 200 문장이 200번부터 기억된 서브루틴을 실행시키는 명령으로 처리됨을 알 수 있다.

TRON 명령을 입력시킨 뒤 RUN을 계속 실행시키면 매번 화면에 실행과정이 출력되므로 더이상 트레이스를 하고 싶지 않으면 TROFF를 입력시켜 이를 중지시켜야 할 것이다.

(그림4) 그림2의 서브루틴과정을 트레이스한 결과


(그림 4) 그림2의 서브루틴과정을 트레이스한 결과
 

프로그램에서의 위치

일반적으로 자주 사용되는 서브루틴은 프로그램의 앞 부분에 놓여지도록 재배치하고 있으나, 그다지 큰 프로그램이 아닐 때는 별로 고려하지 않아도 된다. 자주 사용되는 서브루틴을 프로그램의 앞부분에(즉 문장번호가 낮은 것으로 작성되도록) 위치하는 경우를 위해 (그림5)에 그 방법을 제시하였다. 출력결과는 (그림3)과 똑같다. 단지 기억위치만 다를 뿐이다.

(그림5) 서브루틴 위치를 변경시킨 프로그램 구성


(그림 5)서브루틴 위치를 변경시킨 프로그램 구성
 

단독으로는 실행 불가능

모든 서브루틴은 단독적으로 실행이 불가능하며 주프로그램에서 그 사용이 가능해진다. 만약 서브루틴이 단독으로 실행되면 서브루틴의 마지막 문장인 RETURN에 의해 처리할 문장이 없게되므로 에러를 발생시킨다.

(그림6)은 3개의 서브루틴을 만들어 놓고 주프로그램에서 이를 활용하도록 프로그램이 작성되어 있다. 출력부분을 살펴보면 주프로그램에서 출력한 것은 20번 40번 60번문에 의한 출력이다. 나머지는 모두 해당 서브루틴에서 처리한 것이다. 즉 이름을 입력하는 첫번째 서브루틴, 나이를 입력하는 두번째 서브루틴, 마지막으로 "OH! BASIC"을 출력하는 서브루틴에 의한 결과이다.(그림6)의 프로그램에서 서브루틴의 마지막에 모두 RETURN이 들어가 있음을 확인하라. 만약 120번과 220번에 있는 RETURN이 없다면 어떠한 결과가 예측되는지 생각해보기 바란다. (그림7)과 같은 결과가 나온다. 실행과정을 따라가면서 서브루틴의 실행이 문장번호에 의존하고 있음을 확인할 수 있다.

(그림 6) 서브루틴의 활용예


(그림 6) 서브루틴의 활용예
 

(그림 7) 서브루틴의 실행예(그림 6의 프로그램에서 120, 220번 RETURN문을 뺀 경우)


(그림 7) 서브루틴의 실행예(그림 6의 프로그램에서 120, 220번 RETURN문을 뺀 경우)
 

또다른 서브루틴 호출

(그림6)의 프로그램에서 주프로그램에 해당하는 10번부터 70번까지를 또하나의 서브루틴으로 변환시켜보는 예제를 들어 서브루틴에서 또다른 서브루틴을 호출할 수 있음을 설명한다.

(그림 8) 또다른 서브루틴을 부르는 예


(그림 8) 또다른 서브루틴을 부르는 예
 

(그림 9) 서브루틴에서 또다른 서브루틴을 부르는 프로그램의 실행예


(그림 9) 서브루틴에서 또다른 서브루틴을 부르는 프로그램의 실행예
 

(그림8)의 OK와 LIST 사이에 입력하는 새로운 문장들은 프로그램 편집을 위해 입력한 것들이다. LIST에 의해 출력된 프로그램이 변경된 프로그램이다. 모든 문장번호가 일정한 증가분을 갖지 않고 있으므로 이 문장번호를 일정한 증가분에 따라 정리하는 명령인 RENUM을 입력시켜 놓은 것이 (그림9)이다. (그림9)의 프로그램에서의 주프로그램은 다음과 같다.

10 GOSUB 30
20 END

그리고 한가지 주의할 점은 RETURN의 갯수와 서브루틴의 갯수가 일치하지 않는다는 것이다. 서브루틴내에서 필요한 경우 RETURN문은 여러번 사용될 수 있다. 그러나 서브루틴 실행과정에서는 오로지 하나의 RETURN만 처리된다.

RETURN의 사용법

앞서 말했듯이 서브루틴내에서 RETURN문을 여러번 사용할 수 있다. 단 실행과정에서 오로지 하나의 RETURN만 선택된다. (그림10)의 프로그램에서는 100번부터 140번 까지가 서브루틴이다. 서브루틴내에서 RETURN이 3번 사용되고 있다. 여기서 쉽게 알 수 있듯이 서브루틴의 갯수와 RETURN의 갯수가 일치하지 않을 수 있다.

서브루틴에서는 X라는 데이타를 입력하여 입력된 수의 범위를 출력시킨다. 단 입력 X의값은 0부터 29까지의 정수로 가정한다. 서브루틴에서 사용한 ON~GOTO~문은 조건적 GOTO문으로 ON 다음에 나온 식의 값에 따라서 조건적으로 GOTO하는 문이다. 즉 ON N GOTO 10 20 30문이라면 N=2에 대해 GOTO 20으로 처리된다 여기서 N은 양의 정수이다. 만약 N=4가 입력되면 ON N GOTO 10 20 30문 바로 다음 문을 실행한다.

(그림10) RETURN물을 여러번 사용한 서브루틴의 예


(그림 10) RETURN물을 여러번 사용한 서브루틴의 예
 

서브루틴에서 처리하는 ON INT(X/10)+1 GOTO 120 130 140문에 의해 실행되는 문장은 120 130 140번 문장 중에서 하나가 된다. 따라서 3개의 RETURN이 동시에 실행되지 않고 하나만 선택적으로 실행됨을 알 수 있다. (그림10)의 프로그램 실행 결과를 가지고 서브루틴에서 RETURN이 선택적으로 실행됨을 확인하여 보라.

RETURN문이 여러번 사용되면 프로그램 분석에 혼동을 초래할 수 있으므로 서브루틴에 꼭 하나의 RETURN이 나타나도록 바꾸어 본 프로그램이 (그림11)에 나타나 있다. (그림11)에서 140번 문장에 들어있는 GOTO 150은 무의미하기 때문에 생략할 수 있다. (그림12)는 RETURN문을 하나만 갖도록 변경된 서브루틴을 보여주고 있다. (그림12)의 EDIT라는 명령은 행단위로 프로그램을 편집수정하는 명령으로 키보드에서 편집용 명령들을 입력시켜 원하는 수정작업을 할 수 있다.

(그림 11) RETURN의 처리를 보여주는 예


(그림 11) RETURN의 처리를 보여주는 예
 

(그림 12) EDIT명령을 사용한 프로그램 수정의 예


(그림 12) EDIT명령을 사용한 프로그램 수정의 예
 

서브루틴의 중복 실행

주프로그램에서 서브루틴을 호출할 때 계속 여러번 호출할 수 있다. 쉬운 예를 보이기 위해 FOR~NEXT문을 사용하여 5회반복 호출을 시켜보자. 100번 문장의 REM은 주석문으로 100번부터 서브루틴이 시작됨을 나타내고 있다. (그림13)의 서브루틴은 "SEOUL"을 10칸째부터 5회 출력시킨다. "SEOUL"이 10회 출력되지만 처음 5개의 "SEOUL"만이 서브루틴에 의해 출력된 것이다. 다음에 "SEOUL"을 5회 출력시키는 부분을 또하나의 서브루틴으로 구성하여 본 예가 (그림14)에 있다. 즉 서브루틴에서 또다른 서브루틴을 실행시키는 것이다. 실행결과는 (그림13)과 (그림14)가 똑같다. 80번문에 END가 빠지게 되면 주프로그램의 마지막을 나타낼 길이 없게된다. 서브루틴을 사용할 때는 주프로그램의 마지막을 확실하게 나타내 주어야 한다.

(그림13) 주프로그램에서 서브루틴중복 실행예


(그림 13) 주프로그램에서의 서브루틴중복 실행예
 

(그림14) 중복실행부분을 서브루틴으로 처리한 예


(그림 14) 중복실행부분을 서브루틴으로 처리한 예
 

ON~GOSUB~문을 사용한 메뉴작성

ON~GOTO~문과 같은 방식으로 사용되나 GOTO부분에 GOSUB이 들어가 있기 때문에 각 경우에 따라 처리한 서브루틴을 선택하게 된다. 만약 ON~GOSUB~문이 ON N GOSUB 100 200 300과 같이 주어지면 N=1일때 GOSUB100, N=2일때 GOSUB200, N=3일때 GOSUB300으로 처리된다. ON~GOSUB~문은 메뉴로 부터 원하는 기능들을 선택하는 경우에 유용하며 프로그램을 구조적으로 설계해나가는데 있어 편리하게 사용할 수 있다.

(그림 15) 메뉴처리를 위한 프로그램의 예


(그림 15) 메뉴처리를 위한 프로그램의 예
 

(그림 16) CLS를 사용한 메뉴처리 프로그램 예


(그림 16) CLS를 사용한 메뉴처리 프로그램 예
 

(그림15)는 화면에 메뉴를 표시한 뒤 해당번호를 선택하면 원하는 서브루틴이 실행되는 프로그램이다. (그림15)에서 각각의 선택번호에 따른 출력을 보여주고 있다.

(그림16)에서는 메뉴를 화면에 표시할 때 전체화면을 지우고 난 후에 메뉴만을 나타내고자 첫번째 문에 CLS라는 화면 지우는 명령을 사용하고 있다. CLS는 화면을 지우고 난 후에 커서를 좌측 상단으로 옮긴다. 따라서 CLS를 한 후에 PRINT문에 의해 출력되는 문자열들은 첫 행부터 찍혀나온다. (그림16)의 프로그램을 입력시키고 실행시켜 보자. 메뉴가 화면 상단에 나타날 것이다.

APPLEⅡ에서는 화면을 지우는 명령으로 HOME이 사용된다. 메뉴가 화면에 출력된 후에 번호를 선택하게 되면 해당 서브루틴으로 가서 서브루틴을 실행한 뒤 다시 110번 문장으로 빠져나오면 GOTO10에 의해 다시 메뉴가 화면에 나타나도록 프로그램이 작성되어 있다.

이 기사의 내용이 궁금하신가요?

기사 전문을 보시려면500(500원)이 필요합니다.

1987년 01월 과학동아 정보

  • 조동섭 교수

🎓️ 진로 추천

  • 컴퓨터공학
  • 소프트웨어공학
  • 정보·통신공학
이 기사를 읽은 분이 본
다른 인기기사는?