맨위로가기

줄 번호

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

줄 번호는 프로그래밍 언어에서 코드의 특정 줄을 식별하는 데 사용되는 숫자 또는 레이블이다. 초기 프로그래밍 언어인 포트란과 코볼에서는 줄 번호가 프로그램 제어 흐름을 정의하고 펀치 카드의 정렬을 돕는 데 사용되었다. JOSS와 BASIC과 같은 언어는 모든 문장에 줄 번호를 요구했으며, GOTO 문과 같은 분기문의 대상으로 활용되었다. 그러나 구조적 프로그래밍의 발전과 함께 줄 번호는 GOTO 문 사용으로 인한 스파게티 코드 문제를 야기하며, 현대 언어에서는 줄 레이블로 대체되거나, 컴파일러와 IDE에서 오류 위치를 표시하는 데 활용되는 등 그 역할이 변화했다. 텍스트 편집기와 IDE에서는 행 번호를 통해 코드의 특정 위치를 쉽게 참조하고 오류를 찾아 수정할 수 있으며, 스프레드시트에서도 행과 열을 식별하는 데 사용된다.

더 읽어볼만한 페이지

  • 문서 편집기 기능 - 전문 검색
    전문 검색은 문서 내 특정 단어나 구절을 찾는 정보 검색의 핵심 기술로, 인덱싱, 페이지랭크 알고리즘, 문자열 추출 방법, 문서 필터 기술, 질의 도구 개선 등을 통해 발전해왔으며, 웹 검색, 기업용 검색, 데스크톱 검색 등 다양한 분야에서 활용된다.
  • 문서 편집기 기능 - 맞춤법 검사기
    맞춤법 검사기는 텍스트의 오타와 문법 오류를 검사하여 수정 제안을 제공하는 소프트웨어 도구이며, 1970년대에 처음 등장하여 기술 발전을 거쳐 현재 다양한 플랫폼에서 여러 언어를 지원한다.
  • 소스 코드 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
  • 소스 코드 - 헝가리안 표기법
    헝가리안 표기법은 변수 이름에 데이터 타입이나 목적을 나타내는 접두사를 붙이는 명명 규칙으로, 찰스 시모니가 고안하여 마이크로소프트에서 널리 사용되었으나, 코드 가독성 향상에 대한 유용성 논란과 함께 최신 IDE 환경에서는 불필요하다는 비판도 있다.
줄 번호
기본 정보
"줄 번호 예시"
정의텍스트 파일 내에서 특정 문자열의 순서를 나타내는 식별자
목적오류 보고, 디버깅, 특정 위치 참조
역사
초기 프로그래밍 언어일부 초기 프로그래밍 언어 (예: BASIC)에서 필수적인 요소
현대 프로그래밍대부분의 현대 프로그래밍 언어에서 선택 사항 또는 사용되지 않음
사용 예시
오류 메시지컴파일러 또는 인터프리터가 오류를 발견한 줄 번호 표시
디버깅특정 줄의 코드 실행 추적
코드 참조코드 문서 또는 주석에서 특정 줄 언급
장점
오류 위치 파악오류가 발생한 코드 라인을 신속하게 찾을 수 있도록 도움
코드 유지보수오래된 코드베이스에서 특정 코드 블록 식별 용이
단점
코드 가독성 저하줄 번호 자체가 코드의 가독성을 떨어뜨릴 수 있음
리팩토링 어려움코드 수정 시 줄 번호 변경으로 인한 문제 발생 가능
대안
디버거줄 번호 없이도 코드 실행 단계별 추적 가능
소스 코드 관리변경 사항 추적 및 관리 용이
로깅프로그램 실행 중 발생하는 이벤트 기록
참고 사항
컴파일러 지시문C/C++에서 `#line` 지시문을 사용하여 컴파일러에 특정 파일과 줄 번호 정보 제공 가능

2. 역사

줄 번호는 컴퓨터 프로그래밍 초창기부터 사용된 개념으로, 특히 베이직이나 포트란과 같은 초기의 비구조화 프로그래밍 언어에서 중요한 역할을 수행했다. 이러한 언어들에서는 프로그램의 실행 흐름을 제어하는 분기문을 지정하는 데 줄 번호가 필수적이었다. 예를 들어, `GOTO` 명령어는 특정 줄 번호로 프로그램의 실행 순서를 직접 이동시키는 데 사용되었다. 그러나 이러한 `GOTO` 스타일의 분기 방식은 프로그램의 흐름을 따라가기 어렵게 만들어 소위 스파게티 코드를 유발할 수 있다는 문제점을 안고 있었다.

2. 1. 포트란 (FORTRAN)

포트란은 1956년에 처음 명시되었으며, 베이직과 같은 초기의 비구조화 프로그래밍 언어처럼 줄 번호를 사용하여 프로그램의 흐름을 제어하는 분기문을 지정했다.[3] 예를 들어, GOTO 문을 사용하여 특정 줄 번호로 프로그램 실행 순서를 직접 이동시킬 수 있었다. 하지만 이러한 방식은 코드의 흐름을 이해하기 어렵게 만드는 스파게티 코드를 유발할 수 있다는 문제점이 있다.

포트란에서 줄 번호는 주로 다음과 같은 목적으로 활용되었다.[3]

  • 입출력 형식 정의: `FORMAT` 문에 줄 번호를 부여하고, `READ`나 `PRINT` 같은 입출력 명령문에서 이 번호를 참조하여 데이터 형식을 지정했다.
  • 반복문 범위 지정: `DO` 루프와 같은 반복문의 실행 범위를 나타내는 마지막 문장에 줄 번호를 사용했다.
  • 조건부 분기: `IF` 문(특히 산술 IF)에서 조건의 결과에 따라 이동할 곳을 줄 번호로 명시했다.


다음은 포트란에서 줄 번호가 사용된 예시 코드이다.[3]



DIMENSION ALPHA(25), RHO(25)

1) FORMAT(5F12.4)

2) READ 1, ALPHA, RHO, ARG

SUM = 0.0

DO 3 I=1, 25

IF (ARG-ALPHA(I)) 4,3,3

3) SUM = SUM + ALPHA(I)

4) VALUE = 3.14159*RHO(I-1)

PRINT 1, ARG, SUM, VALUE

GO TO 2



어셈블리어와 마찬가지로 포트란은 모든 코드 줄에 레이블, 즉 줄 번호가 필요하지는 않았다. 프로그램 내 다른 부분에서 참조될 필요가 있는 문장에만 줄 번호를 붙였다. 위 코드 예시에서 줄 번호의 역할은 다음과 같다.

  • 줄 1은 입출력 형식을 지정하며, 줄 2의 READ 명령과 이후 PRINT 명령에서 모두 이 줄 번호를 참조한다.
  • DO 루프는 줄 3의 문장을 반복 실행한다.
  • 산술 IF 구문은 `ARG-ALPHA(I)` 계산 결과가 음수일 경우 줄 4로, 0일 경우 줄 3으로, 양수일 경우 다시 줄 3으로 분기한다.


줄 번호는 반드시 순차적으로 증가할 필요는 없었다. 실제로 초기에 발표된 "완전하지만 단순한 [포트란] 프로그램" 예제에서는 1, 5, 30, 10, 20, 2 와 같이 순서에 상관없이 줄 번호가 사용되었다.[4]

또한, 줄 번호는 이후 버전의 포트란에서 추가된 할당된 GO TO 구문(예: `GO TO n,(n1,n2,...nm)`)과 함께 사용되기도 했다. 이 경우, ASSIGN 명령을 사용하여 특정 줄 번호를 정수 변수에 할당하고(예: `ASSIGN i TO n`), GO TO 문에서 이 변수를 참조하여 해당 줄 번호로 이동할 수 있었다.

2. 2. 코볼 (COBOL)

코볼에서 줄 번호는 펀치 카드의 처음 6개 문자(시퀀스 번호 영역)에 지정되었다. 이는 원래 수동으로 처리한 후 의도한 프로그램 코드 순서를 보장하기 위해 기계적인 카드 정렬을 용이하게 하기 위해 사용되었다. 줄 번호는 실제로 컴파일러에 의해 무시되었다.

2. 3. DOPE (Dartmouth Oversimplified Programming Experiment)

1962년, DOPE (Dartmouth Oversimplified Programming Experiment)는 모든 문장에 줄 번호를 요구하고 줄 번호의 순차적 정렬을 사용하는 최초의 프로그래밍 언어 중 하나였다. 줄 번호는 두 명령어, C (비교 연산, 산술 IF)와 T (이동 연산, GO TO)의 대상으로 지정되었다.

2. 4. JOSS (JOSS)

1963년, JOSS는 프로그램의 모든 명령문에 줄 번호를 독립적으로 부여하고 줄을 순서대로 정렬하도록 의무화했다. JOSS는 대화형 언어이자 프로그램 편집기로 작동하는 단일 명령줄 편집기 개념을 도입했다. 줄 번호 없이 입력된 명령은 JOSS가 "직접 모드"라고 부르는 방식으로 즉시 실행되었다. 반면, 줄 번호가 앞에 붙은 명령은 프로그램 코드 저장 영역에 복사되었으며, JOSS는 이를 "간접 모드"라고 불렀다.

이전의 FORTRAN이나 이후의 BASIC과 달리, JOSS의 줄 번호는 마침표로 구분된 두 자리 정수 쌍(예: 1.1)으로 구성된 고정 소수점 숫자여야 했다. 마침표 왼쪽의 숫자는 "페이지" 또는 "부분"이라 불렸고, 오른쪽 숫자는 "줄"이라고 불렸다. 예를 들어, 줄 번호 10.12는 페이지 10, 줄 12를 의미한다. 프로그램 분기는 페이지 전체 또는 페이지 내 특정 줄을 대상으로 할 수 있었다. 페이지와 줄을 함께 지정하는 형식을 사용할 때 이를 "단계"라고 불렀다.

페이지는 서브루틴을 정의하는 데 사용되었다. 서브루틴 실행 중 다음 줄이 다른 페이지에 있으면 원래 호출 위치로 돌아왔다. 예를 들어, 숫자의 제곱근을 계산하는 서브루틴이 페이지 3에 있고, 3.1, 3.2, 3.3 세 줄의 코드로 구성되어 있다면, Do part 3. 명령으로 호출할 수 있었다. 코드가 다른 페이지(예: 4.1)의 다음 줄에 도달하면, Do 명령 다음의 문장으로 돌아왔다. 서브루틴 끝에 명시적인 반환 명령(예: RETURN)은 필요하지 않았지만, Done 명령을 사용하여 중간에 반환할 수 있었다.

  • 예시: 사용자에게 양수 값을 요청하고 값을 얻을 때까지 반복하는 루틴

01.10 Ask for X "Please enter a positive value greater than 0".
01.20 Done if X>0.
01.30 Go to step 1.1.

2. 5. 베이직 (BASIC)

베이직(BASIC)과 포트란(FORTRAN)과 같은 초기의 비구조화 프로그래밍 언어에서는 줄 번호가 분기문을 지정하는 데 중요한 역할을 했다. 예를 들어, ''GOTO'' 명령은 특정 줄 번호로 프로그램의 실행 흐름을 직접 이동시키는 데 사용되었다.



10 X=0

20 IF X = 42 THEN GOTO 50

30 X = X + 1

40 GOTO 20

50 PRINT "X is finally 42!"



하지만 이러한 ''GOTO'' 스타일의 분기는 코드를 이해하고 유지보수하기 어려운 스파게티 코드를 만들 수 있다는 비판을 받기도 했다.

1964년에 소개된 다트머스 BASIC은 JOSS 언어처럼 줄 번호를 필수로 사용하도록 했지만, 포트란처럼 정수형으로 만들었다. 초기의 베이직 명세에서는 ''GOTO''와 ''GOSUB''(서브루틴으로 이동 후 원래 위치로 돌아오는 명령)에만 줄 번호를 사용했다. 일부 타이니 BASIC 구현에서는 상수가 아닌 숫자 표현식을 줄 번호로 사용할 수 있도록 지원하기도 했으며, 다양한 베이직 방언에서는 ''ON GOTO'', ''ON GOSUB'', ''ON ERROR GOTO''와 같은 스위치 문 형태도 존재했다.

줄 번호는 주로 분기문에 사용되었지만, 다른 용도로도 쓰였다. 예를 들어 ''DATA'' 문에 나열된 데이터를 읽어 들일 때 사용하는 내부 포인터의 위치를 ''RESTORE'' 명령과 특정 줄 번호를 사용하여 재설정할 수 있었다.



10 REM RESTORE 예시: 월 이름 출력

20 DIM M$(12) : REM 월 이름을 저장할 문자열 배열

30 FOR I = 1 TO 12 : READ M$(I) : NEXT I

40 INPUT "월 번호 (1-12)?"; M

50 IF M < 1 OR M > 12 THEN PRINT "잘못된 번호" : GOTO 40

60 RESTORE 100 + (M-1)*10 : REM 해당 월 데이터 줄로 이동

70 READ MonthName$ : PRINT MonthName$

80 GOTO 40

100 DATA "1월"

110 DATA "2월"

120 DATA "3월"

130 DATA "4월"

140 DATA "5월"

150 DATA "6월"

170 DATA "7월"

180 DATA "8월"

190 DATA "9월"

200 DATA "10월"

210 DATA "11월"

220 DATA "12월"



다트머스 BASIC의 초기 버전에서는 ''IF'' 문의 ''THEN'' 뒤에는 다른 명령문이 올 수 없고 오직 줄 번호만 올 수 있었다. 이는 '암시적 GOTO' 역할을 했다. 이후의 베이직 구현에서는 ''THEN'' 뒤에 바로 실행할 명령문을 쓸 수 있게 되었다.

사용 가능한 줄 번호의 범위는 베이직 구현마다 크게 달랐다. 이는 줄 번호를 저장하는 데 사용되는 메모리 크기(예: 1바이트 또는 2바이트)와 방식(부호 있는 정수 또는 부호 없는 정수)에 따라 결정되었다. 다트머스 BASIC은 1부터 99999까지 지원했지만, 당시 마이크로컴퓨터에서 흔히 사용되던 베이직 구현들은 보통 1부터 32767까지(부호 있는 16비트 정수 범위)를 지원했다.

초기 BASIC 구현별 유효 줄 번호 범위
범위방언
1 ~ 254MINOL
1 ~ 255Tiny BASIC Design Note
2 ~ 255Denver Tiny BASIC
0 ~ 999UIUC BASIC
1 ~ 2045DEC BASIC-8
0 ~ 32767LLL BASIC, NIBL
1 ~ 32767Apple I BASIC, Level I BASIC, Palo Alto Tiny BASIC
0 ~ 65529GW-BASIC, IBM BASIC
1 ~ 65535Altair 4K BASIC, MICRO BASIC 1.3, 6800 Tiny BASIC, Tiny BASIC Extended
1 ~ 99999Dartmouth BASIC
1 ~ 999999SCELBAL
0 ~ 1*10^40-1QBASIC1)

1) QBASIC은 구조적 프로그래밍을 지원하여 줄 번호가 필수는 아니지만, 호환성을 위해 줄 번호가 있는 코드 실행을 지원한다.

줄 번호는 goto 문과 같은 점프 명령에서 레이블 대신 사용되기도 했다. 원래 포트란의 줄 번호는 레이블 용도였으며 모든 줄에 번호를 붙일 필요는 없었다. 베이직이 교육용 언어로 시작했기 때문에, 명령이 순차적으로 실행되는 모습을 명확히 보여주기 위해 모든 줄에 번호를 붙이는 형태가 된 것으로 보인다. 이러한 줄 번호 의존성은 "베이직 최대의 설계 실수"라는 비판을 받기도 했으며, 이후 등장한 구조화된 베이직(예: Visual Basic, Visual Basic .NET)에서는 사용되지 않게 되었다.

초기 베이직 환경에서는 명령문을 입력하고 줄 바꿈을 하면 자동으로 다음 줄 번호(보통 10씩 증가)가 매겨지는 기능(''AUTO'' 명령)을 제공하는 경우가 많았다. 기존 코드 사이에 새로운 명령문을 추가하려면, 해당 위치의 중간 번호(예: 10번 줄과 20번 줄 사이에 15번 줄)를 직접 입력해야 했다.

또한, 스크린 에디터 기능이 부족했던 초기 컴퓨터 환경에서 베이직의 줄 번호는 프로그램 내용을 특정 줄 단위로 표시하거나 편집하는 라인 에디터 방식의 인터페이스 역할도 했다. ''LIST'' 명령으로 특정 범위의 줄을 화면에 표시하고, ''RENUM'' 명령으로 줄 번호를 일정한 간격으로 다시 매기는 기능 등이 이를 지원했다. 예를 들어, 20번 줄의 내용을 ''B=3''에서 ''B=4''로 수정하려면, ''LIST 20''으로 해당 줄을 표시한 뒤, 화면에 나타난 ''20 B=3'' 내용을 직접 수정하고 엔터 키를 누르는 방식으로 작업했다. 현대에는 스크린 에디터가 보편화되면서 이러한 방식은 거의 사용되지 않는다.

한국에서는 1980년대 개인용 컴퓨터가 보급되면서 베이직이 프로그래밍 입문 언어로 널리 사용되었고, 이 과정에서 줄 번호는 프로그래밍의 기본적인 요소로 많은 사람들에게 인식되었다.

3. 프로그래밍 언어에서의 행 번호

초기 프로그래밍 언어, 특히 베이직(BASIC)이나 포트란(FORTRAN)과 같은 비구조화 언어에서는 줄 번호가 프로그램 실행 흐름을 제어하는 데 중요한 역할을 수행했다. 주로 GOTO 문과 같은 분기문의 목적지를 지정하는 데 사용되었으며[3], 때로는 입출력 형식이나 반복문의 범위를 나타내는 데 쓰이기도 했다. 일부 언어에서는 모든 코드 줄에 번호를 붙여야 했지만(다트머스 BASIC), 다른 언어에서는 특정 구문에서 참조될 필요가 있는 줄에만 번호를 붙이기도 했다(포트란).

그러나 줄 번호와 GOTO 문에 크게 의존하는 방식은 프로그램의 논리 구조를 따라가기 어렵게 만드는 스파게티 코드를 양산할 수 있다는 문제점을 안고 있었다. 이러한 한계는 이후 구조적 프로그래밍 개념의 발전으로 이어졌고, 많은 언어에서 줄 번호 대신 레이블이나 명시적인 제어 구조(예: 반복문, 조건문)를 사용하는 방식으로 변화하게 된다. 초기의 라인 에디터 환경에서는 특정 줄을 찾아 편집하는 용도로 줄 번호가 활용되기도 했다.

3. 1. 구조화되지 않은 프로그래밍 언어

베이직(BASIC)과 포트란(FORTRAN) 같은 비구조화 프로그래밍 언어에서 줄 번호는 분기문의 대상을 지정하는 데 주로 사용되었다. 예를 들어 베이직에서는 다음과 같이 사용될 수 있다.



1 X=0

2 IF X = 42 GOTO 5

3 X += 1

4 GOTO 2

5 PRINT "X is finally 42!"



이러한 GOTO 문을 사용한 분기 방식은 코드를 이해하고 유지보수하기 어렵게 만드는 스파게티 코드를 양산할 수 있다는 비판을 받았다.

포트란에서는 1956년 처음 명시된 규격부터 줄 번호가 입출력 형식 지정, 반복문 범위 지정, 조건부 분기 등에 사용되었다.[3] 하지만 포트란은 초기의 어셈블리어처럼 모든 줄에 레이블(줄 번호)을 요구하지는 않았고, 다른 구문에서 참조되는 줄에만 번호를 붙이면 되었다.



DIMENSION ALPHA(25), RHO(25)

1) FORMAT(5F12.4)

2) READ 1, ALPHA, RHO, ARG

SUM = 0.0

DO 3 I=1, 25

IF (ARG-ALPHA(I)) 4,3,3

3) SUM = SUM + ALPHA(I)

4) VALUE = 3.14159*RHO(I-1)

PRINT 1, ARG, SUM, VALUE

GO TO 2



위 예시에서 줄 번호 1은 입출력 형식을 정의하며, 줄 2의 ''READ'' 명령과 이후 ''PRINT'' 명령에서 참조된다. ''DO'' 루프는 줄 3까지 실행되며, 산술 IF 구문은 계산 결과 값에 따라 줄 4 또는 줄 3으로 분기한다. 줄 번호는 반드시 순차적일 필요는 없었다.[4] 포트란에서는 또한 ''ASSIGN'' 문을 사용하여 줄 번호를 정수 변수에 할당하고, 계산된 ''GO TO'' 문에서 이를 참조할 수도 있었다.

코볼(COBOL)에서는 펀치 카드의 첫 6개 문자 위치(시퀀스 번호 영역)에 줄 번호를 사용했다. 이는 원래 카드를 물리적으로 정렬하여 프로그램 코드 순서를 맞추기 위한 목적이었으며, 컴파일러 자체는 이 번호를 무시했다.

1962년 개발된 DOPE(Dartmouth Oversimplified Programming Experiment)는 모든 문장에 줄 번호를 요구하고 순차적 정렬을 사용한 초기 언어 중 하나였다. 줄 번호는 비교 연산(C)과 이동 연산(T, GOTO와 유사)의 대상으로 사용되었다.

1963년 JOSS는 프로그램의 모든 문장에 줄 번호를 의무화하고 순차적으로 정렬했다. JOSS는 명령줄 인터페이스에서 대화형 언어와 프로그램 편집기 기능을 통합했는데, 줄 번호 없이 입력된 명령은 즉시 실행(직접 모드)되었고, 줄 번호와 함께 입력된 명령은 프로그램 코드 저장 영역에 저장(간접 모드)되었다. JOSS의 줄 번호는 마침표로 구분된 두 부분으로 구성된 고정 소수점 숫자(예: 1.1, 10.12) 형태를 가졌다. 앞부분은 "페이지" 또는 "부분", 뒷부분은 "줄"이라 불렀다. 페이지는 서브루틴 정의에 사용될 수 있었고, ''Do part 3.''와 같이 호출되었다.

1964년 소개된 다트머스 BASIC은 JOSS처럼 필수적인 줄 번호를 채택했지만, 포트란과 같이 정수 형태를 사용했다. 초기 BASIC에서는 ''GOTO''와 ''GOSUB''(서브루틴 호출) 문에서만 줄 번호를 사용했다. 일부 타이니 BASIC 구현에서는 상수 대신 숫자 표현식을 줄 번호 대상으로 지원하기도 했고, 다양한 방언에서 ''ON GOTO'', ''ON GOSUB'', ''ON ERROR GOTO'' 같은 스위치 문 형태도 존재했다. 예외적으로 ''READ'' 문이 ''DATA'' 문을 읽는 위치를 지정하는 포인터를 ''RESTORE'' 명령을 통해 특정 줄 번호로 설정하는 데 사용되기도 했다.



1 REM RESTORE는 BASIC에 문자열 배열이 없을 경우 사용될 수 있음

2 DIM M$(9): REM 길이 9자의 문자열 정의

5 INPUT "월 번호?"; M: IF M<1 OR M>12 THEN 5

7 RESTORE 10*M: READ M$: PRINT M$

10 DATA "1월"

20 DATA "2월"

30 DATA "3월"

...



초기 다트머스 BASIC의 ''IF...THEN'' 문에서는 ''THEN'' 뒤에 줄 번호만 올 수 있었고(암시적 GOTO), 이후 구현처럼 다른 명령문이 올 수는 없었다.

유효한 줄 번호의 범위는 구현마다 크게 달랐는데, 이는 줄 번호를 저장하는 데 사용된 메모리 크기(1바이트 또는 2바이트, 부호 유무 등)에 따라 결정되었다. 다트머스 BASIC은 1부터 99999까지 지원했지만, 당시 마이크로컴퓨터에서는 1부터 32767까지(부호 있는 16비트 정수) 지원하는 경우가 많았다.

초기 BASIC 구현별 유효 줄 번호 범위
범위방언
1 ~ 254MINOL
1 ~ 255Tiny BASIC Design Note
2 ~ 255Denver Tiny BASIC
0 ~ 999UIUC BASIC
1 ~ 2045DEC BASIC-8
0 ~ 32767LLL BASIC, NIBL
1 ~ 32767Apple I BASIC, Level I BASIC, Palo Alto Tiny BASIC
0 ~ 65529GW-BASIC, IBM BASIC
1 ~ 65535Altair 4K BASIC, MICRO BASIC 1.3, 6800 Tiny BASIC, Tiny BASIC Extended
1 ~ 99999Dartmouth BASIC
1 ~ 999999SCELBAL
0 ~ 1*10^40-1QBASIC1)



1) QBASIC은 구조적 프로그래밍을 지원하여 줄 번호가 필수는 아니지만, 줄 번호가 있는 코드 실행은 가능하다.

이러한 언어에서는 프로그래밍 작성 시 줄 번호 사이에 간격을 두는 것이 일반적인 관행이었다. 예를 들어 (1, 2, 3, ...) 대신 (10, 20, 30, ...)과 같이 10 단위로 번호를 매겼다. 이는 나중에 프로그램 코드를 수정하거나 추가할 때 새로운 코드를 기존 코드 사이에 쉽게 삽입하기 위함이었다. 만약 20번과 30번 줄 사이에 코드를 추가해야 할 경우, 25번과 같은 중간 번호를 사용하여 새 줄을 삽입할 수 있었다. 간격 없이 번호를 매겼다면, 새로운 줄을 삽입하기 위해 그 뒤의 모든 줄 번호를 수정해야 하는 번거로움이 있었다. 일부 BASIC 구현에서는 ''RENUM'' 명령어를 제공하여 프로그램 전체 또는 일부의 줄 번호를 일정한 간격으로 다시 매기고, 관련된 모든 참조 번호도 자동으로 수정해주었다.

규모가 큰 프로그램에서는 각 서브루틴을 구분하고 향후 확장을 위한 공간을 확보하기 위해 10000, 20000 등과 같이 큰 번호 단위로 시작하는 관행도 있었다.

줄 번호에 의존하는 ''GOTO'' 문은 스파게티 코드를 유발하여 프로그램의 가독성과 유지보수성을 떨어뜨린다는 비판을 받았다. (관련 문서: Considered harmful, 구조적 프로그래밍) 이 때문에 줄 번호를 여전히 사용하는 일부 최신 버전의 BASIC에서도 가능한 경우 ''GOTO'' 대신 for 루프나 while 루프와 같은 구조적 프로그래밍 구문을 사용하는 것이 권장된다.

CC++를 포함한 많은 현대 프로그래밍 언어에도 GOTO 문이 존재하지만, 이들 언어에서는 줄 번호 대신 레이블을 사용하여 분기 대상을 지정한다.

초기 BASIC에서 모든 줄에 번호를 붙이도록 한 것은 교육용 언어로서 명령이 순차적으로 실행되는 과정을 명확히 보여주려는 의도였을 수 있으나, 이는 종종 "BASIC 최대의 설계 실수"로 비판받기도 한다. 이후 등장한 "구조화 BASIC"에서는 이러한 줄 번호 강제 방식이 폐지되었다. (비주얼 베이직(VB)이나 VB.NET 등이 구조화 BASIC의 후속 언어에 해당한다.)

초기 컴퓨터 환경에서는 스크린 에디터 기능이 부족했기 때문에, BASIC의 줄 번호는 특정 줄을 지정하여 내용을 표시하거나 수정하는 라인 에디터 방식의 인터페이스 역할도 했다. ''LIST'' (지정된 범위의 코드 표시), ''RENUM'' (줄 번호 재정렬)과 같은 명령어가 이러한 목적을 위해 존재했다. 예를 들어, 특정 줄(예: 20번 줄)의 내용을 수정하려면 ''LIST 20''으로 해당 줄을 표시하고, 표시된 내용을 직접 편집한 후 엔터 키를 눌러 메모리의 내용을 변경하는 방식으로 작업했다. 오늘날에는 스크린 에디터가 보편화되어 이러한 목적으로 줄 번호를 사용하는 경우는 거의 없어졌다.

3. 2. 구조적 프로그래밍 언어

줄 번호와 goto 문을 사용하는 방식의 프로그래밍은 프로그램 규모가 커지고 goto 문이 복잡하게 얽히면 코드의 흐름을 파악하기 어렵게 만드는 스파게티 코드 문제를 야기할 수 있었다.

이러한 문제점을 해결하기 위해 파스칼이나 C 언어와 같은 후대의 프로그래밍 언어들은 문장의 구분, 복합 문장 블록, 서브루틴 등의 개념을 도입하고 개선했다. 이를 통해 조건 분기, 반복문, 서브루틴 호출 등에서 줄 번호나 goto 문 대신 명확한 구조를 가진 전용 구문을 사용하게 되었다. 그 결과, 프로그래머는 알고리즘 자체에 더 집중하여 제어 구조를 명확하게 기술할 수 있게 되었고, 프로그램의 가독성과 유지보수성을 크게 향상시키는 구조적 프로그래밍이 가능해졌다.

구조적 프로그래밍을 지원하는 현대의 BASIC (예: Visual Basic, Visual Basic .NET)은 더 이상 줄 번호를 필수로 요구하지 않는 언어 사양을 갖추고 있다. 일부 오래된 BASIC 방언의 영향을 받아 줄 번호 사용이 가능한 경우에도, 줄 번호와 GOTO를 이용한 제어 흐름보다는 for 루프나 while 루프와 같은 구조화된 제어 구문을 사용하는 것이 권장된다.

한편, CC++를 포함한 여러 현대 프로그래밍 언어에도 GOTO 문 자체는 존재하지만, 이때 GOTO의 대상은 줄 번호가 아닌 줄 레이블을 사용한다.

3. 3. 현대 프로그래밍 언어

과거 BASIC이나 FORTRAN 같은 초기 프로그래밍 언어에서는 줄 번호를 사용하여 GOTO 문과 같은 분기문의 목적지를 지정했다. 그러나 이러한 방식은 프로그램 흐름을 파악하기 어려운 스파게티 코드를 야기할 수 있다는 비판을 받았다.

CC++를 포함한 많은 현대 프로그래밍 언어는 여전히 GOTO 문을 지원하기도 하지만, 분기 대상으로 줄 번호 대신 줄 레이블을 사용한다. 이는 코드 가독성을 높이고 구조적 프로그래밍을 장려하기 위한 변화이다. 현대 프로그래밍에서는 for 루프나 while 루프와 같은 제어 구조를 사용하는 것이 일반적이며, GOTO 문의 사용은 지양하는 추세이다. Visual Basic이나 Visual Basic .NET처럼 현대화된 BASIC 계열 언어에서도 과거의 줄 번호 기반 제어 방식은 거의 사용되지 않는다.

현대 프로그래밍 환경에서 줄 번호는 주로 다른 목적으로 활용된다. 코드에 구문 오류나 논리적 오류가 있을 때, 컴파일러인터프리터는 오류가 발생한 정확한 코드 줄 번호를 표시하여 프로그래머가 문제 위치를 빠르게 찾고 수정할 수 있도록 돕는다. 과거 텍스트 에디터가 발달하지 않았던 시절에는 줄 번호를 이용해 특정 코드를 편집하기도 했으나, 현대적인 개발 환경에서는 이러한 방식은 사용되지 않는다.

4. 텍스트 편집기와 행 번호

텍스트 편집기에서 행 번호는 텍스트 내의 특정 줄을 쉽게 식별하고 참조하기 위한 중요한 기능이다. 일반적으로 개행 문자를 기준으로 구분되는 논리적 행 번호가 사용되며, 이를 통해 사용자는 문서의 특정 위치로 빠르게 이동하거나 프로그래밍 오류 메시지 등에서 지시하는 정확한 코드 라인을 찾을 수 있다. 일부 편집기에서는 화면 표시 방식에 따라 겉보기 행 번호를 제공하기도 한다. 텍스트 편집기는 이러한 행 번호를 화면에 표시하여 편집 작업의 효율성을 높이는 데 도움을 준다.

4. 1. 일반 텍스트 편집기

일반 텍스트 파일의 경우, 일반적으로 개행 문자(LF나 CR+LF 등)마다 행이 구분된다. 텍스트 편집기에서는 이 구분을 기준으로 0 또는 1부터 시작하는 행 번호(논리 행 번호)가 내부적으로 할당된다. 대부분의 텍스트 편집기는 화면 왼쪽에 행 번호를 표시할 수 있으며, 표시 여부를 전환할 수도 있다. 커서 위치의 행 번호와 열 번호는 상태 표시줄 등에 표시된다.

프로그래밍 언어소스 코드는 일반 텍스트로 작성되지만, 언어 처리계(컴파일러인터프리터)는 오류 및 경고 메시지를 출력할 때 해당 위치의 행 번호와 열 번호를 포함하는 형태로 알려준다. 또한 디버거 등이 참조하는 심볼 정보는 오브젝트 코드와 소스 코드를 대응시킬 때 소스 코드의 행 번호를 이용한다. 통합 개발 환경(IDE)에 탑재된 코드 편집기도 행 번호를 표시하거나[5], 지정된 행 위치로 이동하는 기능을 갖추고 있다[6].

하지만 창의 너비에 따라 자동으로 줄 바꿈 표시를 할 때, 설정에 따라 겉보기 행 번호(표시 행 번호)를 화면 왼쪽에 표시할 수 있는 편집기도 존재한다[7]. 이러한 행 줄 바꿈 기능과 겉보기 행 번호를 최초로 탑재한 것은 일본 메가소프트의 텍스트 편집기 MIFES였다. 이 기능들은 일본어 문서를 워드 프로세서처럼 작성할 때 편리하여, 일본어 텍스트 편집기에서는 필수적인 기능으로 자리 잡았고 프로그래밍 용도 외에도 인기를 얻었다[8]. Microsoft Word 등에도 줄 바꿈이 아닌 문서의 너비에 따른 줄 바꿈을 기반으로 행 번호를 문서 내에 표시할 수 있는 기능이 탑재되어 있다[9].

4. 2. 자동 줄 바꿈과 겉보기 행 번호

창 너비에 따라 자동으로 줄 바꿈을 표시할 때, 설정에 따라 겉보기 행 번호(표시 행 번호)를 화면 왼쪽에 표시하는 기능을 가진 텍스트 편집기도 있다[7]。 이러한 자동 줄 바꿈과 겉보기 행 번호 기능은 일본 메가소프트사의 텍스트 편집기인 MIFES에서 처음 도입되었다. 이 기능들은 일본어 원고를 워드 프로세서처럼 작성할 때 편리하여, 일본의 텍스트 편집기에서 필수 기능으로 자리 잡았고 프로그래밍 외의 목적으로도 널리 사용되었다[8]Microsoft Word와 같은 워드 프로세서에도 실제 개행 문자가 아닌, 문서 너비에 따른 줄 바꿈을 기준으로 행 번호를 표시하는 기능이 있다[9]

5. 통합 개발 환경 (IDE)과 행 번호

프로그래머가 프로그램 코드에 구문 오류를 포함시키면, 컴파일러나 인터프리터는 컴파일 또는 실행 과정에서 해당 오류가 발생한 줄 번호를 알려준다. 이를 통해 프로그래머는 오류를 더 쉽게 찾아 수정할 수 있다.

현대의 프로그래밍 도구에서도 오류 위치를 명확히 하기 위해 줄 번호를 사용하는 것이 표준으로 자리 잡았다. 프로그램은 소스 파일의 줄 바꿈을 계산하여 자동으로 줄 번호를 생성하고 오류 위치를 표시하는 것을 간단하게 처리할 수 있다. 특히 IDE에서는 컴파일러가 텍스트 편집기와 통합되어 있는 경우가 많다. 예를 들어 Microsoft Visual Studio, Eclipse, Xcode와 같은 IDE에서는 사용자가 오류 메시지를 더블 클릭하면 해당 오류가 포함된 코드로 즉시 이동할 수 있는 편리한 기능을 제공한다.

참조

[1] 웹사이트 6.10.4 Line control http://c0x.coding-gu[...] 2008-01-30
[2] 웹사이트 Differences Between GW-BASIC and QBasic http://support.micro[...] 2003-05-12
[3] 서적 The FORTRAN Automatic Coding System for the IBM 704 EDPM: Preliminary Operator's Manual http://www.softwarep[...] 1957-04-08
[4] 서적 The FORTRAN Automatic Coding System for the IBM 704 EDPM: Programmer's Reference Manual http://archive.compu[...] Applied Science Division and Programming Research Department, [[International Business Machines Corporation]] 2022-07-04
[5] Microsoft Learn コードの行番号を表示する - Visual Studio (Windows) https://learn.micros[...]
[6] Microsoft Learn '[指定行へのジャンプ] - Visual Studio (Windows)' https://learn.micros[...]
[7] 웹사이트 その他編 #4 TIPS質問箱-テキストエディタ MIFES Ver.7.0 TIPS https://www.megasoft[...]
[8] 뉴스 【元麻布春男の週刊PCホットライン】価格とライセンスが見直された新MIFESを試す - PC Watch https://pc.watch.imp[...]
[9] Microsoft サポート 行番号を追加または削除する - Microsoft サポート https://support.micr[...]
[10] 웹인용 Differences Between GW-BASIC and QBasic http://support.micro[...] 2003-05-12



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com