맨위로가기

중복 코드

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

1. 개요

중복 코드는 프로그램 내에서 동일하거나 매우 유사한 코드 블록이 반복되는 현상을 의미한다. 이는 복사-붙여넣기 프로그래밍, 유사한 기능의 독립적인 개발, 자동 코드 생성 등의 다양한 원인으로 발생하며, 학문적 맥락에서는 표절로 간주될 수 있다. 중복 코드는 소프트웨어 개발 속도를 높이거나 특정 상황에서 효율적일 수 있지만, 코드의 길이를 증가시키고 유지보수를 어렵게 만들며, 보안 취약점 전파의 위험성을 증가시키는 단점을 지닌다. 중복 코드를 해결하기 위해 코드 리팩토링, 함수 분리 등의 기법이 사용되며, 다양한 알고리즘과 소프트웨어 도구를 통해 중복 코드를 감지할 수 있다.

더 읽어볼만한 페이지

  • 소프트웨어 메트릭 - 코드 커버리지
    코드 커버리지는 테스트 스위트에 의해 실행된 코드의 비율을 측정하는 기준으로, 최종 제품 인증에 필요한 테스트 수준을 결정하며, 다양한 커버리지 기준 중 안전 필수 애플리케이션에서는 수정 조건/결정 커버리지(MC/DC)와 같은 고급 기준이 사용된다.
  • 소프트웨어 메트릭 - 결합도
    결합도는 소프트웨어 설계에서 모듈 간 상호 의존성을 나타내는 척도로, 유지보수 및 수정 비용을 줄이기 위해 낮은 결합도를 지향하는 것이 중요하며, 내용 결합, 공통 결합, 외부 결합 등 다양한 유형으로 분류된다.
  • 안티패턴 - 기술 부채
    기술 부채는 소프트웨어 개발에서 발생하는 개념으로, 현재의 편의적인 설계가 미래에 추가적인 비용을 발생시키는 것을 의미하며, 다양한 원인으로 발생하여 개발 비용 증가, 프로젝트 지연, 경쟁력 약화 등의 부정적인 결과를 초래할 수 있다.
  • 안티패턴 - 난독화
    난독화는 프로그램 코드의 가독성을 낮춰 이해를 어렵게 하는 기술로, 역공학을 방지하여 보안을 강화하며 소스 코드와 바이너리 난독화로 구분되고, 코드 분석을 어렵게 만들지만 불가능하게 하지는 않아 다른 보안 기술과 함께 사용된다.
  • 소스 코드 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
  • 소스 코드 - 헝가리안 표기법
    헝가리안 표기법은 변수 이름에 데이터 타입이나 목적을 나타내는 접두사를 붙이는 명명 규칙으로, 찰스 시모니가 고안하여 마이크로소프트에서 널리 사용되었으나, 코드 가독성 향상에 대한 유용성 논란과 함께 최신 IDE 환경에서는 불필요하다는 비판도 있다.
중복 코드
개요
이름중복 코드
동의어코드 중복
중복
복사/붙여넣기 프로그래밍
영어Duplicate code
설명
정의소스 코드 내에서 둘 이상의 위치에서 발견되는 소스 코드의 시퀀스
형태정확히 동일한 코드 조각
구문적으로 동일한 코드 조각 (변수 이름, 공백 등의 차이만 존재)
의미적으로 동일한 코드 조각 (다른 구문 구조를 가졌지만 동일한 연산 수행)
원인
일반적인 원인급한 개발 일정으로 인한 복사/붙여넣기
지식 부족으로 인한 유사 코드 재작성
코드 재사용 메커니즘 (함수, 클래스 등)에 대한 이해 부족
문제점
주요 문제점코드 유지보수성 저하 (버그 수정 시 모든 중복 코드 수정 필요)
코드 가독성 저하
프로그램 크기 증가
잠재적 버그 발생 가능성 증가 (일부 중복 코드만 수정하는 경우)
해결 방법
일반적인 해결 방법함수 또는 메서드 추출 (중복 코드 부분을 함수 또는 메서드로 만들어 재사용)
코드 리팩토링 (중복 코드 제거 및 코드 구조 개선)
디자인 패턴 적용 (템플릿 메서드 패턴, 전략 패턴 등)
코드 생성 도구 사용 (자동으로 유사 코드 생성)
탐지
탐지 방법수동 코드 검토
자동 코드 분석 도구 사용 (예: PMD, SonarQube)
자동 탐지 도구PMD
CPD (PMD의 일부)
SonarQube
기타
관련 개념소프트웨어 유지보수
리팩토링
디자인 패턴

2. 중복 코드 발생 원인

복사해서 붙여넣기 프로그래밍, 코드 긁어모으기, 독립적인 코드 작성, 자동 코드 생성 등은 중복 코드가 발생하는 주된 원인이다.


  • 복사 및 붙여넣기 프로그래밍: 학문적인 환경에서 표절로 간주될 수 있으며, 코드가 작동하기 때문에 복사되는 경우가 많다.
  • 코드 긁어모으기: "작동하기 때문에" 코드의 일부분을 복사하는 것이다.
  • 독립적인 코드 작성: 프로그램의 다른 부분과 매우 유사한 기능이 필요할 때, 개발자가 기존 코드와 매우 유사한 코드를 독립적으로 작성하는 것이다.
  • 자동 코드 생성: 개발 속도나 용이성을 높이기 위해 코드를 자동으로 생성하는 것이다.


이러한 문제를 해결하려면 중복되는 코드를 서브루틴 등으로 묶어 중복을 해소해야 한다.

2. 1. 복사 및 붙여넣기 프로그래밍

복사해서 붙여넣기 프로그래밍은 중복 코드가 발생하는 이유 중 하나이다. 학문적인 환경에서는 표절로 간주될 수 있으며, 코드가 작동하기 때문에 복사되는 경우가 많다. 대부분 변수 이름을 변경하거나 코드를 추가/삭제하는 등 사소한 수정이 이루어진다. 프로그래밍 언어는 코드의 한 복사본을 여러 목적으로 사용할 수 있는 기능을 제공하지만, 프로그래머가 언어를 잘 모르거나, 시간이 부족하거나, 소프트웨어 부후증을 고려하지 않아 복사본이 만들어진다.

프로그램의 다른 부분과 매우 비슷한 기능이 필요한 경우, 개발자가 다른 곳에 이미 존재하는 코드와 매우 유사한 코드를 독립적으로 작성하기도 한다. 여러 연구에 따르면 이렇게 독립적으로 작성된 코드는 일반적으로 문법적으로 유사하지 않다.[17][18][2]

자동 생성되는 코드의 경우, 개발 속도나 용이성을 높이기 위해 복제 코드가 생성되기도 한다. 이때 실제 생성기는 소스 코드에 중복을 포함하지 않고, 출력에만 영향을 미친다.

2. 2. 코드 긁어모으기

"작동하기 때문에" 코드의 일부분을 복사하는 경우에도 중복 코드가 발생한다. 프로그래머가 사용 언어를 제대로 이해하지 못하거나, 적절한 처리를 할 시간이 부족하거나, 소프트웨어 부후증 증가에 대한 고려 부족 등의 이유로 발생할 수 있다.[17][18]

2. 3. 독립적인 코드 작성

프로그램의 다른 부분과 매우 유사한 기능을 포함하는 경우, 개발자가 기존 코드와 매우 유사한 코드를 독립적으로 작성하면서 중복이 발생할 수 있다. 여러 연구에 따르면 이렇게 독립적으로 작성된 코드는 일반적으로 문법적으로 유사하지 않다.[17][18][2]

2. 4. 자동 코드 생성

개발 속도나 용이성을 높이기 위해 코드를 자동으로 생성하는 경우에도 중복이 발생할 수 있다. 실제 생성기는 소스 코드에 중복을 포함하지 않고, 만들어내는 출력에만 영향을 미친다.[17][18]

3. 중복 코드의 장단점

코드 중복은 양면성을 지닌다. 소프트웨어 취약점이 있는 코드가 복사될 때, 개발자가 이를 알지 못하면 복사된 코드에도 취약점이 남는다.[19] 코드 중복은 컴파일 시간 단축, 인지 부하 감소, 인적 오류 감소, 코드 누락 방지 등의 장점이 있지만, 모든 코드 중복을 리팩터링할 수 있는 것은 아니다.[20] 동시 편집 같은 사용자 인터페이스 기술이 지원되는 프로그래밍 언어에서는 복제가 효율적인 해결책일 수 있으며, 리팩터링 시 코드 분리가 유지보수 이점보다 중요할 수 있다.[21] 중복 코드가 오류가 더 많은 경향을 보이지는 않는다.[22]

반면, 중복 코드는 지원이 더 어렵다. 코드가 길어지고, 업데이트 시 한 곳만 업데이트될 위험이 있다. 코드 복사본이 다른 목적으로 사용되고 문서화되지 않은 경우, 한 목적의 업데이트가 다른 목적에 부적절할 수 있다. 과거에는 메모리 공간 제약이 있었지만, 현재는 큰 문제가 되지 않는다.

3. 1. 장점

코드 중복을 사용하면 컴파일 시간을 단축시키고, 인지 부하를 줄이며, 인적 오류를 감소시킨다. 또한 코드를 잊거나 간과하는 것을 방지할 수 있다.[19] 그러나 모든 코드 중복이 리팩터링될 수 있는 것은 아니다.[20] 동시 편집과 같은 사용자 인터페이스 기법과 함께 지원되는 프로그래밍 언어의 경우, 복제 자체가 가장 효율적인 해결책이 될 수 있다. 게다가 리팩터링할 때 코드를 분리하는 것이 유지보수적 이익보다 더 중요할 수 있다.[21] 중복 코드가 중복되지 않은 코드보다 상당히 더 오류가 있는 경향이 있는 것으로 보이지는 않는다.[22]

3. 2. 단점

소프트웨어 취약점이 있는 코드가 복사되면 개발자가 이를 알지 못하는 경우, 해당 취약점은 복사된 코드에 계속 남아있게 된다.[19] 리팩토링을 통해 코드 라인 수, 사이클로매틱 복잡도, 결합도 등 소프트웨어 메트릭을 향상시킬 수 있다. 이는 컴파일 시간 단축, 인지 부하 감소, 인적 오류 감소, 코드 누락 방지 등의 효과를 가져온다. 그러나 모든 코드 중복을 리팩토링할 수 있는 것은 아니다.[4]

중복 코드는 다음과 같은 이유로 지원이 더 어렵다.

  • 코드가 더 길어진다.
  • 업데이트 시, 다른 중복 코드를 확인하지 않고 한 곳만 업데이트될 위험이 있다.


과거에는 메모리 공간 제약으로 인해 중복 코드가 더 많은 공간을 차지하는 단점이 있었지만, 현재는 큰 문제가 되지 않는다.

소프트웨어 취약점이 복사될 경우, 개발자가 인지하지 못하면 복사된 코드에 취약점이 그대로 존재하게 된다.[3]

Wagner, Abdulkhaleq, 및 Kaya의 연구에 따르면, 중복 코드를 동기화 상태로 유지하기 위해 추가 작업이 필요하지만, 프로그래머가 중복 코드를 인지하고 있다면 중복되지 않은 코드보다 오류 발생률이 더 높지는 않다.[6]

중복 코드는 소프트웨어 유지보수를 어렵게 만든다. 코드 수정 시 모든 중복 코드를 검토해야 하기 때문이다. 예를 들어, 버그 발견 시 모든 중복 코드에서 버그 유무를 확인해야 한다. 대규모 소프트웨어에서는 중복 코드가 많을 가능성이 높아 유지보수 작업에 큰 문제가 될 수 있다.

이러한 문제를 해결하기 위해 중복 코드를 서브루틴 등으로 묶어 중복을 제거해야 한다.

4. 중복 코드 해결 방법

중복 코드는 소프트웨어 유지보수를 어렵게 만드는 요인 중 하나이다. 어떤 코드를 수정했을 때, 해당 코드와 중복되는 모든 코드에 대해 수정 검토를 해야 하기 때문이다. 예를 들어, 어떤 코드에서 버그가 발견된 경우, 해당 코드와 중복되는 모든 코드에 대해 버그 유무를 확인해야 한다. 특히 대규모 소프트웨어는 중복 코드의 수가 많을 가능성이 높기 때문에, 유지보수 작업에서 중복 코드가 큰 문제가 되기 쉽다.

이러한 문제를 해결하기 위한 다양한 방법이 존재한다. 중복되는 코드를 함수나 서브루틴 등으로 묶어 중복을 해소하는 것이 한 가지 방법이다.

4. 1. 코드 리팩토링

중복 코드는 일반적으로 코드를 함수 또는 모듈과 같은 자체 단위로 옮기고, 원래 사용했던 모든 위치에서 해당 단위를 호출하여 수정한다. 구성 요소가 중앙 집중식 위치에 있는 보다 개방형 소스 스타일의 개발을 사용하는 것도 중복 해결에 도움이 될 수 있다.[1]

이러한 문제를 해결하기 위해서는 중복되는 코드를 서브루틴 등으로 묶어 중복을 해소해야 한다.[1]

4. 2. 기능적 중복 코드 예시

정수 배열평균을 계산하는 다음의 코드 스니펫이 있다고 가정하자.



extern int array_a[];

extern int array_b[];

int sum_a = 0;

for (int i = 0; i < 4; i++)

sum_a += array_a[i];

int average_a = sum_a / 4;

int sum_b = 0;

for (int i = 0; i < 4; i++)

sum_b += array_b[i];

int average_b = sum_b / 4;



이 코드에서 두 개의 for 루프는 배열 `array_a`와 `array_b`의 각 요소를 더하여 총합을 구하고, 그 총합을 4로 나누어 평균을 계산하는 동일한 기능을 수행한다. 이러한 중복은 다음과 같이 함수를 사용하여 제거할 수 있다.



int calc_average_of_four(int* array) {

int sum = 0;

for (int i = 0; i < 4; i++)

sum += array[i];

return sum / 4;

}



위 함수를 사용하면 루프 중복이 없는 소스 코드를 얻을 수 있다.



extern int array1[];

extern int array2[];

int average1 = calc_average_of_four(array1);

int average2 = calc_average_of_four(array2);



이 경우, 컴파일러는 두 함수 호출을 인라인 확장하여 최적화할 수 있다. 함수가 인라인되지 않으면 함수 호출의 추가 오버헤드로 인해 실행 시간이 더 오래 걸릴 수 있다.

중복된 코드를 메서드로 대체하여 수정된 코드의 예

4. 3. 컴파일러 최적화

정수 배열평균을 계산하는 다음의 코드 스니펫을 보자.



extern int array_a[];

extern int array_b[];

int sum_a = 0;

for (int i = 0; i < 4; i++)

sum_a += array_a[i];

int average_a = sum_a / 4;

int sum_b = 0;

for (int i = 0; i < 4; i++)

sum_b += array_b[i];

int average_b = sum_b / 4;



두 개의 루프는 다음의 단일 함수로 다시 작성할 수 있다.



int calc_average_of_four(int* array) {

int sum = 0;

for (int i = 0; i < 4; i++)

sum += array[i];

return sum / 4;

}



위의 함수를 사용하면 루프 중복이 없는 소스 코드가 생성된다.



extern int array1[];

extern int array2[];

int average1 = calc_average_of_four(array1);

int average2 = calc_average_of_four(array2);



이 경우, 컴파일러는 두 함수 호출을 인라인 확장하여 결과 기계 코드가 중복 예제와 중복되지 않은 예제 모두에 대해 동일하도록 선택할 수 있다. 함수가 인라인되지 않으면 함수 호출의 추가 오버헤드로 인해 실행 시간이 더 오래 걸릴 수 있다(대부분의 고성능 언어의 경우 약 10개의 프로세서 명령어). 이론적으로 이 추가 실행 시간은 중요할 수 있다.

5. 중복 코드 감지

1990년대 후반부터 소프트웨어 공학의 일환으로 중복 코드를 검출하는 기법에 대한 연구가 활발하게 이루어지고 있다.[13] 소프트웨어 공학 분야에서는 중복 코드를 주로 코드 클론이라고 부른다.

5. 1. 알고리즘

중복 코드를 찾기 위해 여러 알고리즘들이 제안되었다. 예를 들면 다음과 같다.

  • 베이커 알고리즘.[23]
  • 라빈-카프 문자열 검색 알고리즘
  • 추상 구문 트리를 사용.[24]
  • 시각적 클론 감지(Visual clone detection).[25]
  • 카운트 매트릭스 클론 감지(Count Matrix Clone Detection).[26][27]
  • 지역 민감 해싱

5. 2. 소프트웨어 도구

산업기술종합연구소의 카미야 토시히로가 개발한 CCFinderX[14]는 2009년 8월 기준으로 무상 공개되었으며, http://www.ccfinder.net/ 에서 내려받을 수 있다. 오사카 대학의 이노우에 카츠로 교수가 이끄는 소프트웨어 공학 강좌에서는 통합 코드 클론 분석 환경 ICCA를 개발하고 있다.[15]

6. 중복 코드와 소프트웨어 유지보수 (일본어 위키 내용)

중복 코드는 소프트웨어 유지보수를 어렵게 만드는 요인 중 하나이다. 그 이유는 어떤 코드를 수정했을 때, 해당 코드의 중복 코드 모두에 대해 수정 검토를 해야 하기 때문이다. 예를 들어, 어떤 코드에서 버그가 발견된 경우, 해당 코드의 중복 코드 모두에 대해 버그 유무를 확인해야 한다. 특히 대규모 소프트웨어는 중복 코드의 수가 많을 가능성이 높기 때문에, 유지보수 작업에서 중복 코드가 큰 문제가 되기 쉽다.

이러한 문제를 해결하기 위해서는, 중복되는 코드를 서브루틴 등으로 묶어 중복을 해소해야 한다.

참조

[1] 웹사이트 The Bad Code Spotter's Guide http://www.informit.[...] InformIT.com 2008-06-06
[2] 문서 Code similarities beyond copy & paste https://www.cqse.eu/[...]
[3] 논문 CLORIFI: software vulnerability discovery using code clone verification 2016-04-25
[4] 논문 Software Clone Detection and Refactoring https://boa.unimib.i[...] 2013
[5] 간행물 '"Cloning Considered Harmful" Considered Harmful' http://plg2.cs.uwate[...] 2006-10
[6] 서적 2016 IEEE 23rd International Conference on Software Analysis, Evolution, and Reengineering (SANER) 2016
[7] 문서 A Program for Identifying Duplicated Code 1992
[8] 문서 Clone Detection Using Abstract Syntax Trees http://www.semanticd[...]
[9] 문서 Visual Detection of Duplicated Code http://www.iam.unibe[...]
[10] 문서 CMCD: Count Matrix Based Code Clone Detection IEEE 2011-12
[11] 문서 A Replication and Reproduction of Code Clone Detection Studies http://www.qualitasc[...] 2014
[12] 문서 Duplicate code detection using anti-unification https://cyberleninka[...] 2008
[13] 문서 コードクローン検出とその関連技術 2008-06
[14] 웹사이트 CCFinder http://www.ccfinder.[...]
[15] 웹사이트 iCCA http://sel.ics.es.os[...]
[16] 웹인용 The Bad Code Spotter's Guide http://www.informit.[...] InformIT.com 2008-06-06
[17] 문서 Code similarities beyond copy & paste https://www.cqse.eu/[...]
[18] 문서 How are functionally similar code clones syntactically different? An empirical study and a benchmark https://peerj.com/ar[...]
[19] 저널 인용 CLORIFI: software vulnerability discovery using code clone verification 2017-04-05
[20] 저널 인용 Software Clone Detection and Refactoring 2017-04-05
[21] 간행물 '"Cloning Considered Harmful" Considered Harmful' http://plg2.cs.uwate[...] 2006-10
[22] 저널 인용 On the relationship of inconsistent software clones and faults: an empirical study http://elib.uni-stut[...] 2016
[23] 문서 A Program for Identifying Duplicated Code 1992
[24] 문서 Clone Detection Using Abstract Syntax Trees http://www.semanticd[...]
[25] 문서 Visual Detection of Duplicated Code http://www.iam.unibe[...]
[26] 문서 CMCD: Count Matrix Based Code Clone Detection IEEE 2011-12
[27] 문서 A Replication and Reproduction of Code Clone Detection Studies http://www.qualitasc[...] 2014



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

문의하기 : help@durumis.com