코드 재사용

코드 재사용(code 再使用) 또는 소프트웨어 재사용(software 再使用)은 기존의 소프트웨어 또는 소프트웨어 지식을 활용해, 새로운 소프트웨어를 구축하는 일이다. 단순한 재사용은 프로그래밍의 여명기로부터 행해져 왔다. 프로그래머는 템플릿, 함수, 프로시저와 같이 항상 코드의 일부를 재사용하고 있다. 소프트웨어 재사용은 소프트웨어 공학의 연구 대상으로 여겨져 1968년에 벨 연구소의 더글러스 맥일로이(Douglas McIlroy)가 재사용가능한 콤포넌트에 기반한 소프트웨어 산업을 제창한 것이 시초이다.

개요 
재사용가능한 소프트웨어나 소프트웨어 지식은 재사용가능한 자산이다. 자산에는 설계, 요구명세, 검사, 아키텍처 등도 포함된다.

아마 가장 잘 알려져 있는 재사용 가능 자산은 코드이다. 코드 재사용은 어떤 시점에 쓰여진 프로그램의 일부 또는 전부를 이후의 다른 프로그램을 만들 때 사용하는 것이다. 코드의 재사용은 장황한 작업에 소비하는 시간과 에너지를 절약하는 전형적 기법이다.

라이브러리는 추상화가 좋은 예이다. 프로그래머는 프로그램의 일부를 재사용가능하게 하기 위해서 내부에 추상화 포인트를 작성하거나 자기 부담으로 사용하기 위해서 커스텀 라이브러리를 만들거나 한다. 소프트웨어를 보다 재사용하기 쉽게 하는 특성을 모듈성, 저결합도, 고응집도, 캡슐화, 관심의 분리 등으로 부른다.

기존 코드를 사용하여 새로운 코드를 만드는 경우, 하등의 인터페이스 혹은 액세스 수단이 정의되어 있지 않으면 안 된다. 이것에는 서브루틴 호출, 오브젝트, 클래스, 프로토 타입 등이 포함되는 것이 일반적이다. 기업에서는 이것들을 정식화, 표준화해두는 것이 일반적이다.

어떤 프로그램의 이전 버전을 출발점으로 하여 다음의 버전을 개발하는 작업도 일종의 코드 재사용이다.

코드 재사용의 한 형태로서 기존의 프로그램으로부터 코드를 일부 또는 전부 뽑아내 새로운 프로그램에 복사해넣는 일이 있다. 기업은 개발을 빠르기 하기 위해서 이 방법을 쓰기도 하지만, 이렇게 복사와 붙여넣기를 많이 하면, 차후에 중복 코드로 문제가 될 수 있다.

재사용을 빠르고 용이하게 하기 위해 프로그래밍 정식 절차의 일부로서 보다 체계적으로 실시할 수 있도록 하는 연구가 많이 이루어져 왔다. 객체지향 프로그래밍도 그러한 목적에서 만들어진 것으로 정식화된 재사용기법으로서 일반화되었다. 같은 목적으로 후에 개발된 것으로서 제네릭프로그래밍이 있다.

한층 더 새로운 수단으로서 자동 프로그래밍이 있다. 이것은 프로그램이 사용자가 설정한 일련의 변수에 근거하여 어떤 종류의 프로그램을 생성하는 것이다.유사한 개념으로 메타 프로그래밍도 있다.

재사용의 형태 
 편의적 재사용(opportunistic reuse)
 프로젝트를 시작할 때 재사용가능한 콤포넌트가 있는지를 찾아보고 재사용한다.
 계획적 재사용(planned reuse)
 컴퍼넌트를 차후에 재사용가능하도록 전략적으로 설계해 나간다.

편의적 재사용은 다음으로 더 세분화할 수 있다.
 내부 재사용(internal reuse)
 팀내에서 만든 콤포넌트를 재사용한다. 어디까지나 편의상이며 계획적인 것이 아니기 때문에, 인터페이스의 조정 등에 추가적인 비용이 발생할 수 있다.
 외부 재사용(external reuse)
 서드파티에서 만든 콤포넌트를 구하여 사용한다. 유상인 경우, 조달비용을 자신이 직접 개발할 때 드는 비용의 20% 이하로 잡는 것이 일반적이다. 또, 조달한 콤포넌트를 학습하여 활용하는데 걸리는 시간도 고려해야 한다.

예시 
소프트웨어 라이브러리
코드 재사용의 매우 일반적인 예로서 라이브러리를 사용하는 것이다. 각종 형식으로 정보의 변환, 외부기억장치 액세스, 외부 프로그램과의 인터페이스, 정보(수, 단어, 이름, 위치, 날짜 등)의 조작이라고 한 일반적인 조작은, 많은 프로그램으로 필요하게 된다. 새로운 프로그램을 쓸 때, 라이브러리의 코드를 사용해 그것들 작업을 실행하도록 할 수 있어 차바퀴의 재발명과 같이 같은 조작을 실행하는 프로그램을 또 만들어 쓸 필요는 없다. 라이브러리의 실장은 특수한 사례도 포함하여 자주 평가되고 있다고 하는 이점이 있다. 결점은, 성능 향상이나 출력 형식을 바꾸고자 할 때 세부사항을 조절할 수 없는 점과 라이브러리를 취득·학습·설정하는 데에 시간과 비용이 든다는 점이다.

디자인 패턴
디자인 패턴은 비슷한 문제를 풀기 위한 범용적인 해법이다. 디자인 패턴은 개념적이고, 개별 문제의 필요에 따라서 수정 가능하다. 추상 클래스와 인터페이스는 특정의 패턴의 실장에 재사용 가능하다.

 체제

서드파티 응용 프로그램이나 체제를 통해 소프트웨어의 큰 부분을 재사용하는 것도 많다. 다만 체제는 통상 특정 영역에 고유한 것으로, 광범위하게 응용하기는 어렵다.

같이 보기 
 Don't repeat yourself
 상속
 수속형 프로그래밍
 다형성
 가상 상속
 소프트웨어 콤포넌트
 차바퀴의 재발명
 NIH 증후군

소프트웨어 공학