WIPIVERSE

서브루틴

서브루틴(subroutine)은 컴퓨터 프로그래밍에서 특정 작업을 수행하도록 설계된 일련의 명령어들을 하나의 단위로 묶은 것을 가리키는 용어이다. 함수(function), 프로시저(procedure), 루틴(routine), 메서드(method), 서브프로그램(subprogram) 등으로도 불리며, 프로그램 내에서 여러 번 호출되어 재사용될 수 있는 호출 가능 단위(callable unit)의 한 형태로 분류된다.

정의 및 기본 개념

서브루틴은 프로그램 실행 중 특정 지점에서 호출되어 해당 작업을 수행한 뒤, 다시 호출된 지점의 다음 명령으로 제어를 되돌리는 독립적인 코드 블록이다. 한국정보통신기술협회(TTA) 정보통신용어사전에 따르면 서브루틴은 "완전한 프로그램과 상호 관계를 가질 수 있는 한 프로그램의 독립적인 부분들"로 정의되며, 주 프로그램의 임의 지점에서 진입하고, 서브루틴 수행이 끝나면 분기점 바로 다음 명령으로 되돌아간다.

서브루틴의 주요 목적은 복잡한 문제를 단순한 단계로 분해하고, 중복 코드를 줄이며, 여러 프로그램 간에 코드 재사용을 가능하게 하는 데 있다. 이를 통해 프로그램의 규모를 축소하고 가독성과 유지보수성을 향상시키는 효과가 있다.

역사

서브루틴 개념의 기원은 초기 컴퓨터 개발 시기로 거슬러 올라간다. 1945년 앨런 튜링(Alan Turing)은 NPL ACE 설계 제안서에서 서브루틴의 개념을 논의하고 복귀 주소 스택(return address stack)의 개념을 최초로 고안하였다. 1947년 1월 존 모클리(John Mauchly)는 하버드 대학에서 열린 심포지엄에서 ENIAC 작업 중 구상된 서브루틴 개념을 발표하였다. 모리스 윌크스(Maurice Wilkes), 데이비드 휠러(David Wheeler), 스탠리 길(Stanley Gill)은 이 개념을 공식적으로 정립하고 "폐쇄형 서브루틴(closed sub-routine)"이라는 용어를 사용하기 시작한 것으로 알려져 있다.

서브루틴에 대한 언어 수준의 지원은 1958년 발표된 IBM FORTRAN II 컴파일러가 프로그래머가 직접 작성한 서브루틴과 함수를 지원한 최초의 사례로 꼽힌다. 이후 ALGOL 58 등 초기 프로그래밍 언어들도 절차적 프로그래밍을 지원하며 서브루틴 개념을 채택하였다.

구현 방식

초기 컴퓨터들은 서브루틴 호출을 위한 전용 명령어가 없었으며, 각 호출 지점마다 일련의 명령 시퀀스를 작성해야 했다. 이후 복귀 주소를 저장하는 다양한 방식이 발전하였는데, 복귀 주소를 서브루틴의 첫 번째 메모리 위치에 저장하는 방식, 특정 레지스터에 저장하는 방식, 스택(stack)에 저장하는 방식 등이 사용되었다.

현대의 대부분의 프로그래밍 언어와 하드웨어는 호출 스택(call stack)을 사용하여 서브루틴 호출과 복귀를 구현한다. 각 호출은 스택 프레임(stack frame)을 생성하여 매개변수, 지역 변수, 복귀 주소 등의 정보를 저장하며, 이를 통해 재귀 호출과 중첩 호출을 지원할 수 있다.

용어의 차이

프로그래밍 언어에 따라 서브루틴을 지칭하는 용어에는 차이가 있다. COBOL과 BASIC 등 일부 언어에서는 값을 반환하는 것을 "함수", 반환하지 않는 것을 "서브루틴" 또는 "프로시저"로 구분한다. C, C++, Rust 등에서는 값의 반환 여부와 관계없이 "함수"라는 용어를 사용한다. 객체 지향 언어인 Java와 C#에서는 클래스 내부에 정의된 함수를 "메서드"라고 부른다. 이러한 차이는 언어적 관례의 차이일 뿐, 근본적인 개념은 동일하게 "특정 작업을 수행하는 독립적인 코드 단위"라는 점에 있다.

활용 및 장점

서브루틴의 활용은 다음과 같은 이점을 제공한다. 첫째, 동일한 코드를 중복 작성할 필요 없이 여러 위치에서 호출하여 사용할 수 있어 메모리를 절약한다. 둘째, 복잡한 작업을 더 작은 단계로 분해하여 프로그램의 구조를 단순화한다. 셋째, 구현 세부 사항을 숨김으로써 코드의 가독성과 추적성을 향상시킨다. 넷째, 검증된 서브루틴을 재사용함으로써 프로그램 개발 시간을 단축하고 신뢰성을 높일 수 있다.

서브루틴은 소프트웨어 개발에서 구조적 프로그래밍(structured programming)의 핵심 요소 중 하나로, 데이터 구조와 함께 복잡한 프로그래밍 작업을 분해하는 두 가지 주요 도구로 간주된다.

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기