d라이브러리









BASIC강좌 마지막회 베이직은 PC 정복의 필요조건

최근 컴퓨터의 발달과 보급으로 인해 컴퓨터문화는 질과 양의 양쪽면에서 변화를 시작하고 있다. 대형컴퓨터의 기능들이 갈수록 퍼스널 컴퓨터에서 많이 이용되고 있어서 컴퓨터의 대중화가 날로 확대되고 있다.
 

초기의 퍼스널컴퓨터에서 사용되었던 BASIC 언어도 이제 그 기능이 다양해져서 개발용으로 시용하여도 큰 무리가 없는 언어가 되었다. 그러나 풍부한 소프트웨어가 사용되는 퍼스널컴퓨터를 보다 효율적으로 활용하기 위해서는 B-ASIC 언어 이외에도 Pascal, C, Prolog, Lisp, Ada… 등의 언어를 공부할 필요가 있다. 다양한 소프트웨어중에서 개발하거나 이용하려는 분야에 맞는 적합한 소프트웨어를 선별해낼 수 있는 안목이 필요하기 때문이다. BASIC 언어에 대한 강좌는 이번호로 마치게 되며 퍼스널컴퓨터를 소프트웨어 개발분야에 효율적으로 활용하고 싶은 분은 C언어를 권하고 싶다.
 

이번 최종회에서는 BASIC 언어로 프로그램을 작성하려고 할 때 고려해야 하는 사항들을 정리해 본다.

 

좋은 프로그램을 작성하려면
 

주어진 문제를 해결하는 프로그램을 작성할 경우, 어떻게 논리가 정연하고 효율적으로 구현되는지 먼저 생각하여야 한다. 좋은 프로그램을 만들기 위해 제안된 이론적 방법을 총칭해서 프로그래밍 기법이라고 한다. Dijkstra, Warni-er, Wirth 등에 의해 많은 프로그래밍 기법들이 제안되었고 경험에 의한 프로그래밍 기법으로부터 논리적이고 획일적인 프로그램을 구성할 수 있게 되었다. 그러나 프로그래밍 기법에 관한 연구기간이 짧아서 세련된 이론적 결실을 얻지 못하고 있기 때문에 아직까지도 추상적이고 경험적 접근방법이 상당히 요구되기도 한다.

좋은 프로그램의 조건을 살펴보자.
 

●신뢰도가 높아야 한다.

예측할 수 없는 상황의 데이타에 대해서도 정상적으로 동작해야 한다.

●보수하기가 편해야 한다.

에러를 없애는 경우 이를 위한 작업이 쉬워야 한다.

●확장성이 있어야 한다.

프로그램을 사용하다가 필요에 따라 기능을 추가하거나 삭제하고 싶은 경우 프로그램의 일부를 수정 편집하기 편해야 한다.

●프로그램의 효율이 좋아야 한다.

실행속도가 빠를 수록 좋다.

 

구조화 BASIC 프로그램의 작성

프로그램을 구조적으로 표현하려면 언어의 제약을 작성할 때 구조적 표현 기법의 숙달이 되어 있어야 한다.
 

BASIC 언어에서는 C나 Pascal 처럼 구조적 표현이 어렵다는 면이 있다. 그러나 IF~THEN~ELSE~, FOR~TO~, WHILE~WEND등 구조적 표현을 위한 기본 구문을 갖추고있다. BAS-IC 언어에서 구조적 표현에 사용할 수 있는 문장들을 나열하면 다음과 같다.
 

BASIC언어에서 구조적 표현에 사용할 수 있는 문장
 

GOTP 없는 프로그램
 

BASIC 프로그램 중에서 FOR문은 자주 사용하지만 WHILE~WEND는 사용빈도가 낮다. 왜냐하면 FOR는 BASIC언어의 기본문이지만 WHILE~WEND는 확장된 기능의 문이어서 일부 BAS-IC 언어에서만 이용가능하다. 그러나 WHILE~WEND를 사용하면 GOTO문을 사용하지 않아도 되는 경우가 많다. 즉 (그림1)과 같은 GOTO문들은 WHI-LE~WEND 구조문으로 바꿀 수 있다.
 

(그림1) GOTO문과 WHILE~WEND문의 관계
 

IF~THEN IF~ 구조는 사용하지 말자 IF A>1 THEN IF B>1 THEN PRINT A ELSE PRINT B
 

위와 같은 문장의 예에서 알 수 있듯이 마지막의 PRINT B가 실행되는 조건을 금방 이해할 수 없다. 일반적으로 IF 문의 THEN 다음에 계속해서 조건을 사용하면 알기 힘들게 되므로 IF를 여러번 사용하는 것은 되도록 피하도록한다.

 

BASIC언어의 변수이름 붙이는 방법
 

변수이름은 기억되는 데이타의 의미를 나타내게 되므로 적당히 붙여서는 안된다. A, B와 같이 한문자로 구성된 변수는 간단한 예제에서 많이 사용하지만 프로그램이 커질수록 또 변수의 개수가 많아질수록 변수이름은 연상이 쉬운 이름을 사용하는 것이 좋다.
 

예를 들면 성적을 기억하는 변수명을 S라 하는 것보다 SCORE라고 하는 쪽이 훨씬 알기 쉽다. 그러나 변수명이 길어지면 프로그램 작성시 타자회수가 많아지기 때문에 그만큼 에러를 유발할 확률이 커진다. 따라서 변수이름으로서 가능한 한 연상하기 쉬운 이름을 사용해야 하겠지만 너무 긴 이름을 사용할 필요는 없다.
 

또한 변수의 사용에 자기 나름대로의 규칙을 정해놓을 필요도 있다. 예를들면 FOR문의 인덱스 변수에는 I J K l M N 등을 사용한다. 이것은 FORTRAN의 DO~CONTINUE 문에서 사용하는 습관을 그대로 적용한 것이다. 꼭 이러한 방법에 얽매일 필요는 없겠지만 어느정도 규칙을 정해둘 필요는 있다.

 

상수적 변수를 일반화시켜라
 

40명의 성적을 처리하는 프로그램중에 다음과 같은 문장을 사용할 수 있을 것이다.

 

상수적 변수의 일반화


만약 학생수가 40이 안되거나 넘어서면 프로그램 상에 학생수를 나타내는 40을 모두 해당 인원수로 변경시켜야 할것이다. 프로그램의 크기가 클 경우 이러한 작업은 에러를 저지르기 쉽다.
 

위와같은 프로그램은

 

상수적 변수


와 같이 작성해두면 문장하나의 변경만으로도 전체적 구성을 변경시킬 수 있다.이러한 종류의 변수를 상수적 변수라 부른다. 상수적 변수를 프로그램의 시작부에 모두 모아 놓으면 프로그램 관리가 쉬워진다.

 

사용 변수의 선언은 확실하게 하라
 

일반적인 고급언어에서는 사용하려는 변수들을 프로그램 서두에 정의해 놓지만 BASIC언어에서는 꼭 그럴 필요가 없다. 사용하려는 변수가 미리 선언되어 있다면 내용을 분석하기 편하고 서로 다른 형태의 데이타를 효율적으로 처리 할 수 있게된다. 짧은 프로그램을 작성하는 경우 BASIC언어에서는 특별한 변수관리를할 필요가 없으나 일단 변수관리를 확실하게 해두는 습관을 길러야 한다.
 

BASIC 언어의 변수 종류는 다음 기호에 의해 구분된다. 각각의 변수 이름 다음에 % ! # $등의 기호를 붙여서 변수를 구분한다.

 

변수의 구분기호


변수에 대해서 생각할 때에 변수의 형(type) 이외에도 변수가 사용되는 구역에 대해 분류를 미리 해두는 것이 좋다. 프로그램 변수의 사용 형태를 크게 나누면 광역적(global)변수, 지역적(local)변수, 인수(parameter)이다. 광역적 변수는 프로그램의 모든 영역에서 공통으로 사용되는 것이며 지역적 변수는 어느 모듈(module) 내에서만 사용되는 것이다. 인수는 모듈과 모듈간의 데이타를 전달하는데 사용한다.
 

특이하게도 BASIC 언어에서는 사용하는 변수들은 광역적변수도 지역적 변수도 인수도 전부 같은 변수로 취급된다. 이것이 BASIC 언어의 결점이지만 설명문에서 이를 정의해주면 프로그램을 설계하는데 도음이 된다.
 

예를 들면

 

BASIC의 설명문인 REM


와 같이 A B가 광역적 변수, C D E가 지역적변수, F가 인수, STUDENT가 전체상수(실제적으로는 변수로 정의된다)라는 뜻을 BASIC의 설명문인 REM으로 나타낼 수 있다.

 

다중문장은 많이 사용하지 말자
 

다중문장을 사용한 IF문은 THEN~과 ELSE~ 부분에 문장을 여러개 포함시킬 수 있어서 불필요한 GOTO 문을 생략할 수 있다. 그러나 다중문장을 과다하게 사용하면 알기 어렵게 되는경우가 많다.
 

예를 들어

FOR K=1 TO 10 : INPUT N, P :

NEXT K
 

라는 문장에서 알 수 있듯이 구문배치상 그 뜻이 명료하게 이해되지 않을 것이다. 그러나 같은 내용이 반복되는 경우에 있어서는 다중문장으로 구성하여도 괜찮은 경우가 있다.
 

A=O : B=O : C=O

과 같은 문장이다.

 

계산오차를 생각하여야 한다.
 

BASIC 프로그램을 작성할 때 상식적인 계산을 프로그램으로 처리하는 경우 예측지 못했던 결과를 받아 볼 수 있다. 다시 말해서 0.01을 1백번 더한다 하더라도 1이 되지 않는다. 일반적인 생각으로는 0.01을 1백번 더하면 당연히 1이 될터인데 BASIC(다른 고급언어에서도 마찬가지이지만)에서는 1이 되지 않는다. 이유는 수자 표현을 2진수로 하기 때문이며 변환오차가 발생하기 때문이다. 다음 프로그램을 실행하면 오차를 확인할 수 있다.

 

오차확인 프로그램


0.01을 1백회 더하면 0.999999의 값을 계산해 낼 것이다.
 

수의 정확도를 요구하는 계산에서는 항상 데이타의 변환 오차를 고려해야 하며 수의 유효자리수로 고려해야 한다.

 

실수형 데이타는 =이나 <>으로 비교해서는 안된다
 

실수형 데이타는 소수점을 표현하므로 앞에서 말한 오차를 표함하고 있다. 따라서 오차를 포함하는 데이타를 서로 비교하는 경우에 오차의 허용 범위를 따져 보아야 한다. 즉 다음 2개의 프로그램을 보면

 

실수형 데이타의 오차의 허용범위를 따지는 프로그램


실행이 종료되지 않는다.
 

이를 해결하려면 각각
 

IF SUM>1 THEN 200

WHILE SUM <= 1
 

로 변경하여야 한다.

 

연산의 우선순위를 이해하라
 

A>B OR B>C AND C>D 라는 논리식(Logical expression)이 있다고 하자. 논리연산자 OR와 AND 우선순위가 있으므로 연산의 순서는 AND부터 먼저한다. 만약 OR와 AND가 동일한 우선순위를 갖게되면 OR부터 연산을 할 것이다. 이때 연산 순위를 확실하게 표현하려면 다음논리식과 같이 괄호(( ))를 이용한다.
 

A>B OR(B>C AND C>D)
 

예를 하나 더 들면 A MOD 7+8 보다는 (A MOD 7)+8이 더욱 의미가 명료해 진다.
 

(그림2)는 BASIC 언어에서 사용되는 연산자와 우선순위를 나타낸 것이다.
 

(그림2) 연산자의 우선순위


BASIC 언어의 논리 상수값을 기억해두자
 

BASIC 언어에서는 특별하게 논리적 변수가 없다. 따라서 값이 '참이다' 거짓이다'를 수자로 판정하고 있다. 어떤 조건식이 거짓이라면 그 조건식의 값은 0이며 참이면 값이 -1이다.
 

PRINT 8<20을 실행시키면 결과는 -1이 출력될 것이다. 이것은 8<20이 참이기 때문이다. 따라서 다음 문장은 PRINT "SEOUL"을 실행하는 것과 똑같다.
 

IF-1 THEN PRINT "SEOUL"

 

배열의 크기는 너무 크게 잡지 말자
 

배열의 크기는 배열의 첨자의 크기에 의해 결정되며 선언되는 배열에 기억되는 데이타의형에 따라 실제적인 메모리의 크기가 결정된다.

DIM A(50, 50)
 

라는 2차원 배열을 선언하면 단정도 실수 데이타를 기억하게 되므로 하나의 데이타는 4바이트를 차지하게 된다. 따라서 소요되는 메모리 량은 51×51×4=2601 Bytes이다.
 

변수의 형에 따라 차지하는 메모리 바이트 수는 (그림3)에 표시한다.
 

변수의 형에 따라 차지하는 메모리 바이트 수


변수형에 따라 처리 속도가 달라진다
 

정수형 단정도실수형 배정도실수형의 데이타는 메모리 상에서 각각 2바이트 4바이트 8바이트를 차지하므로 바이트수가 많이 잡히는 데이타일수록 계산 시간이 더 많이 소요된다. 따라서 처리속도는 다음과 같이 차이가 난다.
 

정수형<단정도 실수형<배정도 실수형
 

이 때문에 정수만으로 주어지고 정수형 연산만으로도 족한 프로그램의 변수는 정수형으로 선언하여 사용하는 것이 메모리 면에서나 실행속도 면에서 훨씬 유리하다.

 

루프내에서 반복계산되는 식은 미리 계산하여 활용하라
 

일단 다음 2개의 프로그램을 비교해 보자.

 

루프속에서 반복계산 되는 식


첫번째 프로그램에서는 루프속에서 연산을 계속 반복하게 되므로 동일연산이 반복실행되는 시간이 있어서 비효율적 이다. 이러한 경우 루프내에서는 가능한 한 연산의 회수를 줄이는 것이 바람직하다.

 

문자열을 취급하는 프로그램의 가베지컬렉션(Garbagee Collection)시간을 고려해야 한다.
 

BASIC에서 확보한 문자열 영역에서는 문자열을 처리하는 과정에서 가베지 컬렉션이 발생하는데, 메모리의 사용효율을 높일 뿐 아니라 쓰지 않는 문자열 영역을 재사용하기 위해서도 꼭 필요한 작업이다. 다음 프로그램이 실행되면 가베지 컬렉션이 수행된다.

 

가베지컬렉션


50번 문에 의해 Start를 출력한 뒤 한 참만에 100번문에 의해 B$의 문자열이 출력된다.

80번 문에 의해 B$의 문자열을 새롭게 만들어 기억시키는 과정에서 이미 확보된 문자열 영역에서 더이상 새로운 문자열을 기억할 수 없는 경우 지금까지 중간 과정에서 사용했던 B$의 내용들이 모두 지워져야 한다. 이러한 과정에 소요되는 시간이 많아서 100번 문의 실행이 늦어진다.
 

만일 위의 예제 프로그램에서 A$(20000)의 문자열영역을 사용하지 않은 경우는 가베지 컬렉션이 발생하지 않는다. 따라서 실행속도에 영향을 미치는 가베지 컬렉션 문제를 큰 문자열 배열 변수를 사용할 경우는 꼭 고려해야 한다.
 

프로그램을 작성하는 경우 고려할 사항이 많지만 전문적인 책을 구입하여 보다 더 좋은 프로그램을 구성하기 위한 방법들을 보시기 바라며 여기서 지금까지 다루어 온 BASIC언어의 명령들을 총정리해보았다.
 

BASIC 명령의 구분
 

1987년 08월 과학동아 정보

  • 조동섭 교수

🎓️ 진로 추천

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