네스팅 (컴퓨팅)

전산학 및 정보과학에서 **네스팅**(nesting)은 정보가 계층적으로 구성되거나 객체가 다른 유사한 객체를 포함하는 것을 의미한다. 이는 거의 항상 어떤 의미에서 자기유사성 또는 재귀적 구조를 나타낸다.

## 용어
네스팅은 다음을 의미할 수 있다.
* 중첩 호출:
** 여러 수준의 서브루틴 사용
** 재귀 호출
* 산술식에서 괄호의 중첩 수준
* 중첩된 if-절, while-절, repeat-until 절 등과 같은 명령형 소스 코드의 중첩 블록
* 정보 은닉:
** 중첩 함수 정의 및 어휘적 변수 영역
** 레코드, 객체, 클래스 등과 같은 중첩된 자료 구조
* 중첩 가상화, 또는 재귀 가상화: 다른 가상 머신 내에서 가상 머신 실행

## 스프레드시트에서
스프레드시트에서 함수는 서로 중첩될 수 있어 복잡한 수식을 만들 수 있다. 오픈오피스 Calc 애플리케이션의 함수 마법사는 여러 수준의 네스팅을 탐색할 수 있게 하여, 사용자가 각 함수를 개별적으로 편집(및 필요에 따라 수정)할 수 있도록 한다.

예시:

 =IF(SUM(C8:G8)=0,"Y","N")

이 마이크로소프트 엑셀 수식에서 SUM 함수는 IF 함수 안에 중첩되어 있다. 먼저, 수식은 C8에서 G8 셀까지의 숫자의 합을 계산한다. 그런 다음 합이 0인지 여부를 결정하고, 합이 0이면 문자 Y를 표시하고, 그렇지 않으면 문자 N을 표시한다.

당연히 이러한 연결된(또는 더 정확히 말하면: 중첩된) 수식의 수학적 해법을 허용하려면 내부 표현식이 먼저 평가되어야 하며, 내부 함수가 반환하는 결과가 외부 함수의 입력 데이터로 임시로 사용되기 때문에 이 바깥쪽 방향이 필수적이다.

단 하나의 코드 줄에 괄호가 잠재적으로 축적될 수 있기 때문에 편집 및 오류 감지(또는 디버그)가 다소 불편해질 수 있다. 이것이 현대 프로그래밍 환경과 스프레드시트 프로그램이 현재 편집 위치에 해당하는 괄호 쌍을 굵은 글씨로 강조하는 이유이다. 여는 괄호와 닫는 괄호의 (자동) 균형 제어는 괄호 짝 맞추기 검사로 알려져 있다.

## 프로그래밍에서

### 제어 구조
구조적 프로그래밍 언어에서 네스팅은 제어 구조를 서로 감싸는 것과 관련이 있으며, 일반적으로 소스 코드 내에서 다른 들여쓰기 수준을 통해 표시된다. 이 간단한 베이직 함수에서 볼 수 있다:


```
function LookupCode(sCode as string) as integer
  dim iReturnValue as integer
  dim sLine, sPath as string

  sPath="C:\Test.dsv"
  if FileExists(sPath) then
    open sPath for input as #1
    do while not EOF(1)
      line input #1, sLine
      if sCode=left(sLine, 3) then
        'Action(s) to be carried out
      End if
    loop
    close #1
  End if
  LookupCode=iReturnValue
end function
```


이 작고 간단한 예시에서 조건 블록 "if... then... end if"는 "do while... loop" 안에 중첩되어 있다.

파스칼 및 에이다와 같은 일부 언어는 네스팅 수준에 따른 선언에 제한이 없으며, 정확히 중첩된 서브 프로그램 또는 중첩된 패키지(에이다)를 허용한다. 다음은 두 가지 예시이다(실제 사례에서 단순화됨):


```
-- Getting rid of the global variables issue (cannot be used in parallel)
-- from a set of old sources, without the need to change that code's
-- logic or structure.
--
procedure Nesting_example_1 is

  type Buffer_type is array(Integer range <>) of Integer;

  procedure Decompress(
    compressed  :  in Buffer_type;
    decompressed: out Buffer_type
  )
  is
    -- Here are the legacy sources, translated:
    package X_Globals is
      index_in, index_out: Integer;
      -- *** ^ These variables are local to Decompress.
      -- ***   Now Decompress is task-safe.
    end X_Globals;
    -- Methods 1,2,3,... (specifications)
    package X_Method_1 is
      procedure Decompress_1;
    end X_Method_1;
    -- Methods 1,2,3,... (code)
    package body X_Method_1 is
      use X_Globals;
      procedure Decompress_1 is
      begin
        index_in:= compressed'First;
        -- Here, the decompression code, method 1
      end Decompress_1;
    end X_Method_1;
    -- End of the legacy sources
  begin
    X_Method_1.Decompress_1;
  end Decompress;

  test_in, test_out: Buffer_type(1..10_000);

begin
  Decompress(test_in, test_out);
end Nesting_example_1;
```


### 자료 구조
중첩된 자료 구조 또한 프로그래밍에서 흔히 볼 수 있다.

#### 리스프
함수형 프로그래밍 언어인 리스프에서는 **[[Lisp (programming language)#Lists|목록]]** 자료 구조와 더 간단한 **[[Lisp (programming language)#Atoms|원자]]** 자료 구조가 존재한다.
***단순 목록**은 원자만 포함한다.

```
( A T O M S )
```

목록의 원자는 A, T, O, M, S이다.
***중첩 목록**은 원자와 다른 목록을 모두 포함한다.

```
( ( ( N E S T E D ) L I S T S ) ( C A N ) ( B E ) U N N E C E S S A R I L Y ( C O M P L E X ) )
```


## 같이 보기
* 흐름 제어
* For 루프
* 의사코드
* 구조적 프로그래밍

## 각주

분류:컴퓨터 데이터
분류:컴퓨터 프로그래밍