맨위로가기

코드 폴딩

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

1. 개요

코드 폴딩은 텍스트 편집기에서 코드의 특정 부분을 숨겨 코드 구조를 파악하고, 더 중요한 정보에 집중할 수 있도록 하는 기능이다. 이 기능은 1970년대 초 NLS에서 처음 등장했으며, IBM SPF 편집기가 널리 사용되면서 발전했다. 코드 폴딩은 코드 구조 파악, 보일러플레이트 코드 숨김, 메타데이터 및 주석 축약, 구조적 프로그래밍에서 코드 구조 표시, 코드 그룹화, 레거시 코드 숨김 등 다양한 용도로 사용된다. 구현 방식에는 구문 의존적 폴딩, 들여쓰기 기반 폴딩, 토큰 기반 폴딩, 사용자 지정 폴딩이 있으며, 다양한 텍스트 편집기와 IDE에서 지원된다.

더 읽어볼만한 페이지

  • 문서 편집기 기능 - 전문 검색
    전문 검색은 문서 내 특정 단어나 구절을 찾는 정보 검색의 핵심 기술로, 인덱싱, 페이지랭크 알고리즘, 문자열 추출 방법, 문서 필터 기술, 질의 도구 개선 등을 통해 발전해왔으며, 웹 검색, 기업용 검색, 데스크톱 검색 등 다양한 분야에서 활용된다.
  • 문서 편집기 기능 - 맞춤법 검사기
    맞춤법 검사기는 텍스트의 오타와 문법 오류를 검사하여 수정 제안을 제공하는 소프트웨어 도구이며, 1970년대에 처음 등장하여 기술 발전을 거쳐 현재 다양한 플랫폼에서 여러 언어를 지원한다.
  • 소스 코드 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
  • 소스 코드 - 헝가리안 표기법
    헝가리안 표기법은 변수 이름에 데이터 타입이나 목적을 나타내는 접두사를 붙이는 명명 규칙으로, 찰스 시모니가 고안하여 마이크로소프트에서 널리 사용되었으나, 코드 가독성 향상에 대한 유용성 논란과 함께 최신 IDE 환경에서는 불필요하다는 비판도 있다.
코드 폴딩
개요
정의코드의 특정 섹션을 숨기거나 표시하여 가독성을 높이는 기능.
다른 이름아웃라인, 영역 감추기, 코드 축소, 코드 숨김.
목적
가독성 향상복잡한 코드 블록을 관리하고, 중요한 부분에 집중할 수 있도록 도움.
구조 파악코드의 전체 구조를 빠르게 파악하고, 필요한 부분만 펼쳐서 볼 수 있도록 함.
지원 환경
텍스트 편집기이맥스
Vim
EmEditor
Sublime Text
텍스트메이트
Notepad++
HxD
jEdit
통합 개발 환경 (IDE)이클립스
NetBeans
Xcode
Visual Studio Code
Visual Studio
IntelliJ IDEA
Android Studio
기타웹 브라우저 (개발자 도구)
워드 프로세서
아웃라이너
작동 방식
접기/펼치기코드 블록의 시작과 끝을 표시하여, 해당 영역을 접거나 펼칠 수 있도록 함.
표시접힌 코드는 일반적으로 요약된 형태로 표시됨 (예: "...").
코드 블록 식별들여쓰기, 주석, 특정 키워드 등을 사용하여 코드 블록을 식별함.
장점
생산성 향상불필요한 코드 숨김으로써 코드 검토 및 편집 시간 단축.
효율적인 탐색큰 파일에서 특정 섹션으로 빠르게 이동 가능.
시각적 단순화복잡한 코드를 더 작고 관리하기 쉬운 조각으로 분할하여 보여줌.
단점
과도한 사용코드의 흐름을 이해하기 어렵게 만들 수 있음.
편집기의 성능매우 큰 파일에서 코드 폴딩 기능이 편집기 성능에 영향을 줄 수 있음.
기타
관련 용어코드 아웃라인
코드 축소
영역 감추기
주의사항
정보데이터 폴딩과는 다른 개념임. 데이터 폴딩은 데이터 구조 내의 중복된 부분을 압축하는 기술.

2. 역사

편집기에서 코드 폴딩의 가장 초창기 예는 NLS에 있었다.[3][11] 최초로 널리 사용된 폴딩 편집기는 1974년 IBM 370 메인프레임용 구조적 프로그래밍 시설(SPF) 편집기였다. 이 편집기는 들여쓰기를 기반으로 코드 줄을 숨길 수 있었으며, 문자 매핑된 3270 터미널에 표시되었다.[4][12] 이러한 기능은 특히 COBOL과 같이 장황한 언어에서 매우 유용했다. SPF 편집기는 이후 대화형 시스템 생산성 시설(ISPF)로 발전했다.

3. 사용

코드 폴딩은 코드를 정리하거나 덜 유용한 정보를 숨겨 더 중요한 정보에 집중할 수 있도록 하는 등 다양한 사용 패턴을 가지고 있다.

3. 1. 코드 구조 파악 (Outlining)

가장 기본적인 형태로, 애플리케이션은 코드 폴딩을 사용하여 소스 코드윤곽을 표시하고, 각 블록을 한 줄로 축약한다. 이는 함수나 클래스 같은 최상위 블록, 중첩된 함수나 메서드 같은 중첩 블록, 또는 제어 흐름 블록을 포함한 모든 블록에 적용될 수 있다. 이를 통해 코드의 전체적인 구조를 파악하고, 코드를 쉽게 탐색하고 재정렬할 수 있으며, 다른 코드에 방해받지 않고 필요한 부분에 집중하여 더 자세히 살펴볼 수 있다. 시각적으로는 모든 함수의 목록(본문 내용 제외)을 빠르게 확인할 수 있고, 탐색 측면에서는 긴 함수를 일일이 넘기거나 특정 부분을 검색하는 대신 다음 함수로 바로 이동할 수 있어 편리하다.

3. 2. 보일러플레이트 코드 숨김

일부 프로그래밍 언어 또는 라이브러리는 많은 양의 보일러플레이트 코드를 요구하는 경우가 있다. 이로 인해 코드가 길어져 핵심 내용을 파악하기 어려워지고, 중요한 로직이 상대적으로 덜 중요한 코드 사이에 묻힐 위험이 있다.

예를 들어, 자바에서 비공개(private) 필드 하나에 대한 접근자(getter)와 설정자(setter) 메서드를 작성하는 경우, 가장 간결하게 작성해도 최소 3줄의 코드가 필요하다.



private String name = null;

public String getName() { return name; }

public void setName(String name) { this.name = name; }



여기에 일반적인 코딩 컨벤션에 따라 줄 바꿈과 공백을 추가하면 코드는 10줄로 늘어난다.



private String name = null;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}



만약 Javadoc 주석까지 추가하면 코드는 20줄까지 길어진다.



/**

  • Property name readable/writable.
  • /

private String name = null;

/**

  • Getter for property name
  • /

public String getName() {

return name;

}

/**

  • Setter for property name.
  • @param name
  • /

public void setName(String name) {

this.name = name;

}



이러한 필드가 여러 개 존재할 경우, 실제 핵심 로직은 적음에도 불구하고 코드는 수백 줄에 달할 수 있다. 코드 폴딩 기능을 사용하면 이러한 보일러플레이트 코드를 필드당 한 줄, 혹은 모든 필드를 합쳐 한 줄로 접어서 간결하게 표시할 수 있다. 특히, 단순한 값 반환이나 할당과 같은 정형적인(routine) 코드는 접어두고, 특별한 로직이 포함된 비정형적인(non-routine) 코드만 펼쳐둠으로써 중요한 부분에 더 쉽게 집중할 수 있게 돕는다.

3. 3. 메타데이터 축약

메타데이터는 길어질 수 있으며, 일반적으로 설명하는 데이터보다 덜 중요할 수 있다. 메타데이터 축약은 사용자가 메타데이터가 아닌 실제 코드 내용에 먼저 집중할 수 있도록 돕는다. 예를 들어, C#에서 긴 속성 목록은 다음과 같이 `#region` 지시문을 사용하여 수동으로 축약할 수 있다.[5][13]

'''축약 전 코드:'''



#region 속성

[Browsable(false)]

[MergableProperty(false)]

[DefaultValue(null)]

[PersistenceMode(PersistenceMode.InnerProperty)]

[TemplateContainer(typeof(MyType))]

[TemplateInstance(TemplateInstance.Single)]

#endregion

public ITemplate ContentTemplate { get; set; }



'''축약 후 표시:'''



속성

public ITemplate ContentTemplate { get; set; }



이렇게 하면 속성 목록이 "속성"이라는 한 줄로 접혀서 표시되므로, 프로그래머는 `public ITemplate ContentTemplate`과 같은 주요 코드에 더 집중할 수 있다.

3. 4. 주석 축약

주석은 사람이 읽을 수 있는 형태의 메타데이터이며, 긴 주석은 코드의 흐름을 방해하고 가독성을 떨어뜨릴 수 있다. 예를 들어, 코드의 짧은 부분을 설명하기 위해 여러 줄에 걸쳐 작성된 긴 주석이나, 자바독(Javadoc) 또는 XML 문서와 같은 문서 생성기를 위한 주석 등이 해당된다. 코드 폴딩 기능을 사용하면 이러한 긴 주석을 평소에는 접어두었다가 필요할 때만 펼쳐서 볼 수 있다. 파이썬(Python)의 독스트링(docstrings)처럼 긴 주석에 한 줄 요약 정보가 포함된 경우, 주석 섹션이 접혔을 때 해당 요약 내용만 표시되어 요약/상세 보기 형태로 편리하게 활용할 수도 있다.

3. 5. 구조적 프로그래밍에서 구조 표시

구조적 프로그래밍은 중첩된 코드 블록으로 이루어지는데, 긴 코드 블록(예를 들어 긴 switch 문) 때문에 전체 구조를 한눈에 파악하기 어려울 수 있다.[1] 코드 폴딩 기능을 사용하면, 코드의 전체 구조를 먼저 확인하고 필요한 부분만 펼쳐 세부 내용을 볼 수 있게 한다.[1]

특히, 단일 함수 종료 지점 규칙 등을 따르는 엄격한 구조적 프로그래밍에서는 코드가 길게 펼쳐져 있으면 특정 패턴을 파악하기 어려울 수 있다. 예를 들어, 자원 관리 패턴에서는 보통 '자원 획득 → 자원 사용 → 자원 해제' 순서로 코드가 진행된다. 이때 자원 사용 중간 코드 블록이 매우 길면, 자원 획득과 해제 부분이 서로 멀리 떨어져 있어 한눈에 파악하기 어렵다. 하지만 중간 블록을 접으면(폴딩하면) 자원 획득과 해제 쌍을 쉽게 확인할 수 있다.[1] 마찬가지로, `if...then...else` 같은 조건문에서도 `else` 블록이 `if` 조건문과 멀리 떨어져 있을 수 있는데, 코드 폴딩은 이런 구조 파악에도 유용하다.[1]

3. 6. 코드 그룹화

코드 폴딩 그룹은 코드를 논리적인 단위로 묶어 관리하는 데 사용될 수 있다. 그룹화 방식에는 크게 명시적 그룹화와 암시적 그룹화가 있다.

  • 명시적 그룹화: 개발자가 직접 코드의 특정 부분을 그룹으로 지정하는 방식이다. 예를 들어, 주석 블록을 사용하여 모듈 내의 코드를 여러 섹션으로 나누거나, 클래스의 멤버 변수나 메서드를 기능별로 묶는 경우가 이에 해당한다.
  • 암시적 그룹화: 개발 도구나 편집기가 코드의 구조를 분석하여 자동으로 그룹을 만드는 방식이다. 예를 들어, 클래스의 멤버들을 접근 제어자(public, private 등)에 따라 자동으로 그룹화하는 기능이 대표적이다.

3. 7. 레거시 코드 숨김

레거시 코드 또는 개발자가 특정 시점에 보거나 변경하고 싶지 않은 모든 코드는 접어서 프로그래머가 현재 작업 중인 코드에 집중할 수 있도록 돕는다.

4. 구현 방식

코드 폴딩 기능을 지원하려면 텍스트 편집기는 텍스트 파일 안에서 '폴딩 지점'(접을 수 있는 코드 영역의 시작과 끝)을 찾아내는 방법을 갖추어야 한다. 어떤 편집기는 자동으로 폴딩 지점을 찾아주기도 하고, 또 어떤 편집기는 기본적인 설정을 제공하면서 사용자가 직접 폴딩 방식을 바꾸거나 추가할 수 있게 한다.

폴딩 지점을 찾는 방법은 크게 자동 방식과 수동 방식으로 나뉘며, 여러 가지 구체적인 구현 메커니즘이 존재한다. 각 메커니즘은 저마다의 장단점을 가지며, 어떤 방식을 사용할지는 텍스트 편집기 개발자가 결정하게 된다. 여러 폴딩 메커니즘을 지원하는 편집기의 경우, 사용자는 현재 작업 중인 파일의 특성에 가장 잘 맞는 것을 선택하여 사용할 수 있다.

4. 1. 구문 의존적 폴딩

구문 의존적 폴딩 지점은 특정 폴딩 영역이 시작하고 종료되는 위치를 정하기 위해 편집 중인 파일의 내용 자체에 의존하는 방식이다. 주로 사용 중인 마크업 언어나 프로그래밍 언어의 표준적인 하위 기능(예: 함수, 클래스, 블록 등)을 기준으로 폴딩 지점이 정의된다. 이 방식은 자동으로 폴딩 지점을 찾아주고 코드의 실제 구조와 일치한다는 장점이 있다. 하지만 편집기가 해당 언어의 구문을 분석해야 하므로 구현하기가 상대적으로 복잡하고, 파일을 편집할 때 폴딩 지점을 계산하는 데 시간이 소요될 수 있다는 단점도 있다.

4. 2. 들여쓰기 기반 폴딩

들여쓰기 기반 폴딩(접기) 지점은 일반적으로 텍스트 안에서 탭이나 공백처럼 눈에 보이지 않는 문자의 위치와 순서로 정해진다. 들여쓰기 스타일을 사용하는 구조적 프로그래밍 언어에서는 들여쓰기가 코드의 중첩 수준을 나타내는 경우가 많기 때문에, 이는 가장 간단한 형태의 구문 기반 폴딩 방식으로 사용될 수 있다.

이 방식은 특히 오프사이드 규칙을 따르는 구문에 유용하다. 오프사이드 규칙에서는 코드 구조가 들여쓰기와 밀접하게 연관되기 때문이다. 대표적인 예시로는 파이썬이 있으며, 자체 규칙으로 들여쓰기를 요구하는 텍스트 파일에서도 사용될 수 있다. 하지만 줄 연속과 같이 코드 구조가 들여쓰기와 항상 정확히 일치하지 않는 경우도 있기 때문에, 실제로는 구문 자체의 구조에 의존하는 폴딩 방식이 더 선호되기도 한다.

4. 3. 토큰 기반 폴딩

토큰 기반 폴딩 지점은 폴딩 지점의 경계를 식별하는 것 외에는 텍스트에서 다른 용도로 사용되지 않는 특수한 구분 기호를 사용하여 지정된다. 가장 일반적인 구분 기호 토큰은 접힌 섹션을 시작하는 }이다.

또 다른 주목할만한 토큰은 Microsoft Visual Studio 코드 편집기에서 사용되는 #region (C# 지시문), #Region (Visual Basic 지시문)이다. 이는 컴파일러 지시어로 구문적으로 처리되지만 컴파일에는 영향을 미치지 않는다.

수동 방법으로서 토큰 기반 폴딩은 구문 분석으로는 추론할 수 없는 "주어진 작업과 관련된 함수"와 같은 임의의 기준에 따라 코드를 그룹화할 수 있는 재량권을 허용한다.

토큰 기반 폴딩은 대역 내 신호(in-band signaling)가 필요하며, 폴딩 토큰은 본질적으로 구조화된 주석과 같다. 다른 폴딩 방법과 달리 소스 코드 내에 직접 존재하며 다른 프로그래머에게도 보인다. 이를 통해 폴딩 정보를 공유할 수 있다는 장점이 있지만, 특정 파일에서 작업하는 모든 프로그래머가 해당 토큰의 사용 또는 보존을 따라야 하므로 마찰을 일으키거나 유지 관리 부담을 증가시킬 수 있다.

4. 4. 사용자 지정 폴딩

사용자 지정 코드 폴딩은 사용자가 텍스트 편집기에서 특정 텍스트 영역을 선택하여 접을 수 있게 하는 기능이다. 이 방식은 소스 코드 자체를 변경하지 않고(대역외, out-of-band) 편집기 내에서만 적용된다.[1] 예를 들어, 프로그래머는 코드의 특정 줄들을 선택하여 접도록 지정할 수 있다. 이렇게 접힌 텍스트 영역은 이름을 지정하거나 익명으로 둘 수 있으며, 편집 세션이 종료된 후에도 유지되거나 삭제될 수 있다.[1]

토큰 기반 폴딩 방식과는 다르게, 사용자 지정 폴딩은 소스 텍스트를 수정하지 않기 때문에 해당 파일을 편집하는 다른 사용자와 폴딩 정보가 공유되지 않으며, 코드 자체에는 접힌 부분이 표시되지 않는다.[1]

5. 코드 폴딩을 지원하는 소프트웨어

편집기에서 코드 폴딩의 가장 초창기 예는 NLS에서 찾아볼 수 있다.[3] 널리 사용된 최초의 폴딩 편집기는 1974년 IBM 370 메인프레임용 구조적 프로그래밍 시설(SPF) 편집기로 추정되며, 이 편집기는 들여쓰기를 기반으로 줄을 숨길 수 있었다. 이는 문자 매핑된 3270 터미널에 표시되었고,[4] COBOL처럼 코드가 긴 언어에 매우 유용했다. 이 편집기는 이후 대화형 시스템 생산성 시설(ISPF)로 발전했다.

또 다른 초기 폴딩 편집기로는 1977년 마이크 카울리쇼가 VM/CMS 운영 체제용으로 작성한 STET가 있다. STET은 줄 블록을 기반으로 파일을 폴딩하는 텍스트 편집기로, 모든 줄 블록은 폴딩되어 이름 줄로 대체될 수 있었고, 이 이름 줄 역시 다시 폴딩될 수 있는 블록의 일부가 될 수 있었다.

폴딩 편집기는 1983년경 오컴 IDE인 Inmos Transputer Development System (TDS)에도 등장했다.[6],[7] 아래 목록의 "f" 편집기는 이러한 초기 작업의 영향을 받은 것으로 보인다.

매킨토시 컴퓨터에서도 역사적으로 "공개 삼각형"을 통해 코드 일부를 폴딩하는 여러 소스 코드 편집기가 있었다. UserLand Software의 Frontier는 이러한 기능을 갖춘 스크립팅 환경이었다.[8]

오늘날 폴딩 기능은 많은 최신 텍스트 편집기에서 제공되며, 구문 기반 또는 의미 기반 폴딩은 다수의 소프트웨어 개발 환경의 기본 요소가 되었다. 코드 폴딩을 지원하는 편집기는 다음과 같다.

이름토큰들여쓰기구문사용자 정의
ABAP 편집기지원확인 필요지원확인 필요
AkelPad확인 필요확인 필요지원확인 필요
Anjuta IDE확인 필요지원지원확인 필요
Atom확인 필요지원확인 필요지원
BBEdit확인 필요확인 필요지원확인 필요
Brackets플러그인지원지원미지원
Codeanywhere지원지원지원확인 필요
Codenvy지원지원지원확인 필요
Code::Blocks IDE지원지원지원지원
Cubic IDE지원지원지원지원
CudaText확인 필요확인 필요확인 필요확인 필요
Delphi IDE지원확인 필요지원확인 필요
Dreamweaver확인 필요확인 필요확인 필요지원
이클립스확인 필요확인 필요지원확인 필요
EditPlus미지원지원미지원미지원
Emacs지원확인 필요지원지원
EmEditor Professional확인 필요지원지원확인 필요
FlashDevelop IDE확인 필요확인 필요지원확인 필요
geany확인 필요지원지원확인 필요
gedit지원지원지원확인 필요
ISPF확인 필요지원확인 필요지원
JED지원지원확인 필요미지원
jEdit지원지원지원지원
Kate지원지원지원지원
MATLAB미지원미지원지원미지원
MS Visual Studio지원지원지원지원
NetBeans IDE지원지원지원지원
Notepad++확인 필요지원지원지원
NuSphere PHPEd확인 필요확인 필요지원지원
Qt Creator확인 필요확인 필요지원확인 필요
SciTE지원지원지원확인 필요
STET확인 필요확인 필요확인 필요확인 필요
TextMate지원지원지원지원
UltraEdit미지원미지원지원지원
Vim지원지원지원지원
Visual Expert확인 필요확인 필요지원확인 필요
Visual Studio Code지원지원지원미지원
Xcode지원지원지원지원
Zend Studio확인 필요확인 필요확인 필요확인 필요



이 외에도 다음 소프트웨어들이 코드 폴딩을 지원한다.


  • aoeui, 드보락에 최적화된 편집기
  • Author-it 엔터프라이즈 저작 및 컴포넌트 콘텐츠 관리 소프트웨어
  • f (별칭 xf, Winf, Winf32)
  • 폴딩 텍스트 에디터
  • GFA BASIC
  • GridinSoft 메모장
  • IntelliJ IDEA (및 기타 JetBrains IDE)
  • 키노트
  • 코모도 에디트
  • Kwrite
  • 레오
  • LEXX/LPEX (OED용 편집기)[9]
  • 모노디벨롭
  • NoteTab Pro
  • Padre
  • RJ 텍스트 에디터
  • 스물트론
  • The Hessling Editor
  • 비주얼 스튜디오
  • WinShell (버전 3.30부터)
  • XEDIT (스크립트를 통해 폴딩 지원)
  • Zeus

참조

[1] 논문 "Transparency, holophrasting, and automatic layout applied to control structures for visual dataflow programming languages" 2006
[2] 웹사이트 HxD - Freeware Hex Editor and Disk Editor http://mh-nexus.de/h[...] 2007-04-30
[3] Youtube The Mother of All Demos, presented by Douglas Engelbart (1968) https://www.youtube.[...] 2012-07-09
[4] 웹사이트 ISPF history http://planetmvs.com[...] 1998-06-25
[5] 웹사이트 Now, this is interesting, because I tend to use #region more to HIDE THE CRAP (XML documentation etc, long list of attributes etc.) making it easier to see the important code… http://discourse.cod[...] Coding Horror Discussion 2014-03-19
[6] 서적 Transputer research and applications, 2 : NATUG-2, proceedings of the Second Conference of the North American Transputer Users Group, October 18-19, 1989, Durham, NC IOS Press 1990
[7] 웹사이트 INMOS Technical Note 03 - Getting started with the TDS http://www.transpute[...] 1986
[8] 웹사이트 Outliners.com http://www.outliners[...]
[9] 간행물 LEXX – A programmable structured editor IBM Journal of Research and Development 1987
[10] 웹사이트 Data folding in HxD hex editor (listed as feature of RAM-Editor) http://mh-nexus.de/h[...]
[11] Youtube The Mother of All Demos, presented by Douglas Engelbart (1968) https://www.youtube.[...]
[12] 웹사이트 History of ISPF http://planetmvs.com[...]
[13] 블로그 Post #31 http://discourse.cod[...] 2008-07



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

문의하기 : help@durumis.com