표현식

수십 또는 수백 개의 키프레임을 수동으로 만드는 번잡한 과정을 거치지 않고 복잡한 애니메이션을 간편하게 만들어 연결하려면 표현식을 사용하십시오. 표현식은 소프트웨어의 작은 부분으로 스크립트와 매우 유사하며 특정 시점에 단일 레이어 속성의 단일 값으로 계산됩니다. 스크립트에서는 응용 프로그램의 동작을 지시하지만 표현식에서는 속성을 지정합니다.

표현식을 사용하면 레이어 속성 간에 관계를 만들고 한 속성의 키프레임을 사용하여 다른 레이어에 동적으로 애니메이션을 적용할 수 있습니다. 예를 들어 뚝딱 도구로 패스 속성을 연결해 마스크의 패스를 브러시 선 또는 모양 레이어 개체에서 가져올 수 있습니다.

표현식 언어는 표준 JavaScript 언어에 기반하지만 JavaScript를 알지 못해도 표현식을 사용할 수 있습니다. 표현식은 뚝딱 도구를 사용하거나 간단한 예제를 복사한 후 필요에 맞도록 수정하여 만들 수 있습니다.

참고:

표현식 샘플러 템플릿 프로젝트([파일] > [템플릿 프로젝트 찾아보기]) 및 [동작] 범주의 애니메이션 사전 설정([애니메이션] > [사전 설정 찾아보기])에서 도움이 되는 표현식 예제를 찾아볼 수 있습니다.

애니메이션 사전 설정에는 표현식이 포함되거나 표현식만 포함될 수도 있습니다. 키프레임 대신 표현식을 사용하는 애니메이션 사전 설정을 동작이라고도 합니다.

속성에 표현식을 추가한 후에도 속성의 키프레임을 추가하거나 편집할 수 있습니다. 표현식에서는 키프레임에 의해 결정된 속성 값을 가져와 이 값을 입력으로 사용하여 수정된 새 값을 생성할 수 있습니다. 예를 들어 레이어의 [회전] 속성에 다음 표현식을 사용하면 키프레임 지정된 동작과 함께 [회전] 속성 값에 90도가 추가됩니다.

  value + 90

wiggle 등의 일부 메서드는 키프레임 지정된 속성 값에 직접 작용합니다. 속성 특성 및 메서드(표현식 참조)를 참조하십시오.

레이어의 [위치] 속성에 대해 다음 표현식을 사용하면 레이어의 키프레임 지정된 동작이 유지되어 레이어가 약간 흔들립니다.

  wiggle(10, 10)

참고:

wiggle 표현식은 일반적으로 [흔들기]보다 훨씬 빠르고 쉽게 사용할 수 있습니다.

텍스트에 애니메이션을 적용할 때는 표현식 선택기를 사용하여 [애니메이터] 속성이 각 텍스트 문자에 영향을 주는 정도를 지정할 수 있습니다. [표현식] 선택기는 애니메이터 그룹에 하나 이상 추가할 수 있으며 해당 애니메이터 그룹에는 하나 이상의 속성이 포함될 수 있습니다.

표현식을 사용한 작업

[표현식 언어] 메뉴를 사용하거나 수동으로 입력하여 전체 표현식을 직접 입력할 수 있습니다. 또는 뚝딱 툴을 사용하여 표현식을 만들거나 예제나 다른 속성에서 표현식을 붙여넣을 수도 있습니다.

[타임라인] 패널에서 표현식으로 모든 작업을 수행할 수 있지만 [효과 컨트롤] 패널에서 뚝딱 툴을 속성으로 드래그하는 것이 더 간편한 경우도 있습니다. 표현식은 시간 그래프에 있는 크기 조절 가능한 텍스트 필드인 표현식 필드에서 입력 및 편집합니다. 표현식 필드는 레이어 막대 모드에서 속성 옆에 표시되며 [그래프 편집기] 모드에서는 [그래프 편집기] 맨 아래에 표시됩니다. 텍스트 편집기에서 표현식을 작성한 다음 표현식 필드로 복사할 수 있습니다. 표현식을 레이어 속성에 추가할 때 표현식 필드에 기본 표현식이 표시됩니다. 기본 표현식은 실제적인 작업은 수행하지 않으며, 사용자가 표현식을 직접 쉽게 조정할 수 있도록 속성 값을 자기 자신으로 설정합니다.

레이어 막대 모드에서 타임라인 패널의 표현식 인터페이스
레이어 막대 모드에서 타임라인 패널의 표현식 인터페이스

A. 표현식 사용 스위치 B. 표현식 후 그래프 표시 단추 C. 뚝딱 도구 D. 표현식 언어 메뉴 E. 표현식 필드 

표현식을 편집하는 동안 모든 미리 보기는 일시 정지되며 텍스트 편집 모드를 종료할 때까지 빨간 막대가 패널 아래에 표시됩니다.

표현식을 포함하는 속성 값은 빨강 또는 분홍 유형으로 표시됩니다.

표현식을 처음 사용하여 작업하는 경우에는 뚝딱 도구로 간단한 표현식을 만든 후 다음 테이블에 나열된 간단한 수학 연산을 사용하여 표현식의 동작을 조정하는 것이 좋습니다.

심볼

기능

+

더하기

-

빼기

/

나누기

*

곱하기

*-1

원래 연산의 반대 연산 수행(예: 시계 방향을 반시계 방향으로)

예를 들어 표현식 끝에 *2를 입력하여 결과를 두 배로 만들거나 /2를 입력하여 반으로 나눌 수 있습니다.

표현식 편집에 익숙해지면 이러한 간단한 연산자를 더 많이 조합할 수 있습니다. 예를 들어 표현식 끝에 /360*100을 추가하여 0-360에서 0-100으로 범위를 변경할 수 있습니다. 이와 같이 표현식의 범위를 변경하면 360도 다이얼 값을 백분율로 측정되는 슬라이더로 변환할 때 유용합니다.

[타임라인] 패널의 [표현식 언어] 메뉴에는 표현식에 사용할 수 있는 After Effects 전용 언어 요소가 포함되어 있습니다. 이 메뉴는 유효한 요소 및 올바른 구문을 확인할 때 도움이 됩니다. 사용 가능한 요소에 대한 참조로 이 메뉴를 사용하십시오. 사용자가 이 메뉴에서 개체, 특성 또는 메서드를 선택하면 After Effects에서는 삽입점의 표현식 필드에 이를 자동으로 삽입합니다. 표현식 필드에서 선택한 텍스트는 새 표현식 텍스트로 바뀝니다. 삽입점이 표현식 필드에 없으면 필드의 모든 텍스트가 새 표현식 텍스트로 바뀝니다.

[표현식 언어] 메뉴에는 인수 및 기본값이 나열됩니다. 이러한 규칙이 있기 때문에 표현식을 작성할 때 어떤 요소를 제어할 수 있는지 쉽게 기억할 수 있습니다. 예를 들어 [언어] 메뉴에서 [속성] 범주의 wiggle 메서드는 wiggle(freq, amp, octaves=1, amp_mult=.5, t=time)로 표시됩니다. 그리고 wiggle 뒤의 괄호에는 5개의 인수가 나열됩니다. 마지막 세 개 인수의 =는 해당 인수가 선택적 인수임을 의미합니다. 해당 인수에 값을 지정하지 않으면 기본값인 1, 0.5 및 현재 시간으로 각각 설정됩니다.

참고:

[표현식 언어] 메뉴로 작성한 인수 이름은 실제 값으로 바꾸십시오.

Jeff Almasol은 표현식을 자동으로 처리하여 지정된 변경을 수행하는 스크립트를 제공합니다. 예를 들어 사용되지 않는 표현식을 자동으로 제거하거나 사용할 수 있도록 하는 데 스크립트를 사용할 수 있습니다. 자세한 내용은 Jeff Almasol의 redefinery 웹 사이트를 참조하십시오.

표현식 추가, 사용 안 함, 연결 또는 제거

  • 속성에 표현식을 추가하려면 [타임라인] 패널에서 속성을 선택한 후 [애니메이션] > [표현식 추가]를 선택하거나 Alt+Shift+=(Windows) 또는 Option+Shift+=(Mac OS)를 누릅니다. 또는 [타임라인] 패널이나 [효과 컨트롤] 패널에서 Alt(Windows) 또는 Option(Mac OS) 키를 누른 채 속성 이름 옆의 초시계 단추 를 클릭합니다.
  • 여러 레이어 및 컴포지션에서 속성 집합을 연결하려면 속성 링크를 사용합니다.
    하나의 속성 또는 속성 집합을 선택하고 [편집] > [속성 링크와 함께 복사] 또는 [편집] > [상대 속성 링크와 함께 복사]를 선택한 다음 이러한 속성을 컴포지션의 레이어에 붙여 넣습니다. 붙여 넣은 속성은 속성을 복사한 원본 레이어에 연결된 상태로 유지되므로 원본 속성에 발생한 변경 내용이 붙여 넣은 속성 링크의 모든 인스턴스에 반영됩니다.
    속성 링크와 함께 전체 레이어를 복사한 후 붙여 넣어 복제본을 만들면 원본에 발생한 변경 내용이 반영됩니다.

    [상대 속성 링크와 함께 복사] 명령은 [속성 링크와 함께 복사] 명령과 비슷하게 동작하지만 [상대 속성 링크와 함께 복사] 명령은 이름별로 소스 컴포지션을 참조하지 않는 표현식을 만듭니다. 이 명령은 레이어와 표현식 및 이 레이어를 포함하는 컴포지션 간의 상대 링크를 유지합니다. 예를 들어 표현식 조작 레이어를 컴포지션 간에 이동하되, 이 레이어가 동일한 컴포지션의 컨트롤 레이어만 참조하도록 할 때 이 명령을 유용하게 사용할 수 있습니다. 상대 속성 링크와 함께 복사 명령을 사용하여 만든 표현식은 표현식 뚝딱 도구를 사용하여 만든 표현식과 동일합니다.

    [상대 속성 링크와 함께 복사] 명령을 사용하여 레이어의 위치 속성을 복사한 결과는 다음과 같습니다.

    thisComp.layer("control_layer").transform.position

    [상대 속성 링크와 함께 복사] 명령을 사용하여 레이어의 위치 속성을 복사한 결과, 특히 표현식에서 레이어 소스 컴포지션을 참조한 결과는 다음과 같습니다.

    comp("source_comp").layer("control_layer").transform.position

  • 표현식을 일시적으로 사용하지 않으려면 [표현식 사용] 스위치 를 클릭합니다. 표현식을 사용할 수 없으면 스위치 에 슬래시가 표시됩니다.
  • 속성에서 표현식을 제거하려면 [타임라인] 패널에서 속성을 선택한 후 [애니메이션] > [표현식 제거]를 선택하거나 [타임라인] 패널 또는 [효과 컨트롤] 패널에서 Alt(Windows) 또는 Option(Mac OS) 키를 누른 채 속성 이름 옆의 초시계 단추를 클릭합니다.

뚝딱 도구를 사용하여 표현식 편집

JavaScript 또는 After Effects 표현식 언어에 익숙하지 않은 경우에도 뚝딱 도구를 사용하여 표현식의 기능을 이용할 수 있습니다. 간단히 한 속성에서 다른 속성으로 뚝딱 도구 를 드래그하여 속성과 표현식을 연결하면 표현식 텍스트가 삽입점의 표현식 필드에 입력됩니다. 표현식 필드에서 선택한 텍스트는 새 표현식 텍스트로 바뀝니다. 삽입점이 표현식 필드에 없으면 필드의 모든 텍스트가 새 표현식 텍스트로 바뀝니다.

속성으로 뚝딱 도구 드래그
뚝딱 도구를 속성으로 드래그하여 속성 값에 대한 링크를 만듭니다.

뚝딱 도구는 속성 값의 이름이나 값으로 드래그할 수 있습니다. 속성 이름으로 드래그하면 결과 표현식에는 모든 값이 하나로 표시됩니다. 예를 들어 뚝딱 도구를 [위치] 속성의 이름으로 드래그하는 경우 다음과 같은 표현식이 표시됩니다.

  thisComp.layer("Layer 1").transform.position

뚝딱 도구를 [위치] 속성의 구성 요소 값 중 하나(예: y 값)로 드래그하는 경우 다음과 같은 표현식이 표시되며 속성의 x 및 y 좌표가 모두 [위치] 속성의 y 값에 연결됩니다.

  temp = thisComp.layer("Layer 1").transform.position[1]; 
  [temp, temp]

뚝딱 도구를 드래그하는 레이어, 마스크 또는 효과가 로컬 컨텍스트에서 고유 이름을 갖지 않으면 After Effects에서 자동으로 이름을 바꿉니다. 예를 들어 같은 레이어에 이름이 "Mask"인 마스크가 두 개 이상 있는 상태에서 이 중 하나로 뚝딱 도구를 드래그하는 경우 After Effects에서 해당 마스크의 이름이 "Mask 2"로 바뀝니다.

뚝딱 도구로 만드는 표현식의 형식은 [뚝딱 도구로 간단히 식 쓰기] 환경 설정([편집] > [환경 설정] > [일반](Windows) 또는 After Effects > [환경 설정] > [일반](Mac OS))에서 결정됩니다. 뚝딱 도구는 기본적으로 표현식 내에서 속성의 [타임라인] 패널에 표시되는 해당 속성의 이름을 사용하는 간단한 영어 표현식을 만듭니다. 이러한 이름은 응용 프로그램에 코딩되어 변경되지 않으므로 After Effects를 다른 언어로 실행할 때에도 표현식은 작동합니다. 변경할 수 있는 속성 이름은 큰따옴표로 묶인 채 모든 언어에서 동일하게 유지됩니다. 프로젝트를 언어 간에 공유하지 않으려면 이 환경 설정을 선택 해제하면 됩니다. 이 환경 설정은 효과 이름 또는 효과 속성에 적용되지 않습니다.

간단한 식의 예제는 다음과 같습니다.

  thisComp.layer("Layer 1").transform.position

간단한 식은 아니지만 위와 동일한 표현식은 다음과 같습니다.

  thisComp.layer("Layer 1")("Transform")("Position")

참고:

기본적으로 간단한 식이 사용되므로 이 설명서에 나오는 대부분의 예제 및 그림에서는 간단한 식을 사용합니다.

  1. [타임라인] 패널 또는 [효과 컨트롤] 패널의 다른 속성으로 뚝딱 도구를 드래그합니다.
  2. 필요하면 표현식 필드의 기본 표현식을 수정합니다.

참고:

뚝딱 도구를 사용하여 레이어를 참조하는 표현식을 만들 고 해당 레이어가 동일한 컴포지션의 다른 레이어의 이름과 같을 경우 대상 레이어의 이름이 변경됩니다. 새 레이어의 이름은 이전 레이어의 이름에 숫자가 추가됩니다. 이와 같은 변경이 필요한 이유는 표현식이 컴포지션의 단일 레이어를 참조할 때 혼동을 주지 않기 위한 것입니다.

표현식 수동 편집

  1. [표현식] 필드를 클릭하여 텍스트 편집 모드를 설정합니다.

    참고:

    텍스트 편집 모드로 전환하면 전체 표현식이 선택됩니다. 표현식을 추가하려면 표현식 안을 클릭하여 삽입점을 배치합니다. 그렇지 않으면 전체 표현식을 대체하게 됩니다.

  2. 필요하면 [표현식 언어] 메뉴를 사용하여 표현식 필드에 텍스트를 입력하고 편집합니다.

    참고:

    여러 줄로 된 표현식의 내용을 더 많이 보려면 표현식 필드의 위 또는 아래를 드래그하여 크기를 조절합니다.

  3. 텍스트 편집 모드를 종료하고 표현식을 활성화하려면 다음 중 하나를 수행합니다.
    • 숫자 키패드에서 Enter 키를 누릅니다.

    • 표현식 필드 밖을 클릭합니다.

예제: 표현식 언어 참조를 사용하여 표현식 작성

다음 예제를 따라 After Effects 표현식 언어 참조를 사용하여 표현식을 작성하는 방법을 배웁니다. 이 예제에서 만들 표현식에서는 Solid 2의 [위치] 속성을 Solid 1의 [위치] 속성과 연결하고 Solid 2의 이동이 Solid 1의 이동에서 2초만큼 오프셋되도록 지정합니다.

  1. 두 단색 레이어, Solid 1과 Solid 2를 만듭니다.

  2. 키프레임을 사용하여 Solid 1의 [위치] 속성 값에 애니메이션을 적용합니다. 애니메이션, 키프레임 및 표현식을 참조하십시오.

  3. Solid 2의 [위치] 속성을 선택한 후 [애니메이션] > [표현식 추가]를 선택하거나 Alt 키(Windows) 또는 Option 키(Mac OS)를 누른 상태로 속성의 초시계 단추 를 클릭합니다. 기본적으로 다음 표현식이 나타납니다.

      transform.position
  4. transform.position 바로 위에 다음을 입력합니다.

      thisComp
  5. thisComp 요소는 전역 특성이며 이 특성의 값은 현재 컴포지션을 나타내는 Comp 개체입니다. 표현식에서 thisComp 뒤에 올 수 있는 값을 확인하려면 전역 개체, 특성 및 메서드(표현식 참조) 아래에서 thisComp의 반환 값을 찾아봅니다.

    thisComp에서는 Comp 개체를 반환합니다. 그런 다음 Comp 특성 및 메서드(표현식 참조)를 검색하여 Comp 개체에 사용할 수 있는 특성 및 메서드를 확인합니다. 사용 가능한 옵션 중 하나는 layer(index)입니다. 괄호 내의 인덱스(숫자)는 사용하려는 레이어를 지정합니다. 이 예제에서는 Solid 1을 컴포지션의 첫 번째 레이어로 가정합니다. 활성 컴포지션의 첫 번째 레이어에서 값을 검색하려면 다음과 같이 표현식 끝에 .layer(1)을 입력합니다.

      thisComp.layer(1)
  6. 표현식 요소 참조를 검색하여 layer(index)에서 Layer 개체를 반환하는지 다시 확인합니다. Layer 일반 특성 및 메서드(표현식 참조)를 검색하여 사용할 요소를 찾습니다. 예를 들어 레이어의 [위치] 속성 값을 가져오려면 다음과 같이 표현식 끝에 .position을 입력합니다.

      thisComp.layer(1).position
  7. Layer 일반 특성 및 메서드(표현식 참조)에서 position 특성이 속성을 반환함을 알 수 있습니다. 속성 특성 및 메서드(표현식 참조)를 검색하여 표현식에 시간 요소를 추가할 수 있음을 확인합니다. 특정 시간(예: 현재 시간 더하기 2초)을 추가하려면 다음과 같이 표현식 끝에 .valueAtTime(time+2)를 입력합니다.

      thisComp.layer(1).position.valueAtTime(time+2)
  8. 속성 특성 및 메서드(표현식 참조)에서 valueAtTime 메서드의 반환 값이 숫자 또는 배열임을 알 수 있습니다. 표현식에서 숫자, 배열 또는 부울(true 또는 false)을 반환하는 경우 표현식에 특성 또는 메서드를 더 추가할 수 없습니다. 그러나 +, -, */ 등의 산술 연산자는 필요에 따라 추가할 수 있습니다.

표현식 및 표현식 그래프 표시

[그래프 편집기] 모드에서는 단일 표현식 필드가 [그래프 편집기] 아래에 크기 조절 가능한 상자로 나타나며 이 표현식 필드에는 선택된 속성에 대한 표현식만 표시됩니다. 여러 표현식 필드를 동시에 표시하려면 [타임라인] 패널이 레이어 막대 모드에 있어야 합니다.

참고:

레이어 막대 모드 및 [그래프 편집기] 모드 간에 전환하려면 Shift+F3을 누릅니다.

  • 표현식에 속성만 표시하려면 레이어를 하나 이상 선택한 다음 EE를 누릅니다.
  • [그래프 편집기]에 표현식 필드를 표시하려면 [그래프 편집기] 아래의 [그래프 유형 및 옵션 선택] 메뉴 에서 [표현식 편집기 표시]를 선택합니다. 속성에 표현식을 추가하면 이 설정과 상관없이 표현식 편집기가 표시됩니다.

참고:

표현식 필드의 크기를 조절하려면 아래쪽 가장자리를 위 또는 아래로 드래그합니다.

  • 표현식에서 값 또는 속도 그래프를 변경하는 방법을 보려면 [그래프 편집기]에 값 또는 속도 그래프를 표시하는 동안 [표현식 후 그래프 표시] 버튼 을 클릭합니다.

    흐린 색상의 그래프는 표현식이 적용되기 전의 값 또는 속도를 표시하며 밝은 색상의 그래프는 표현식이 적용된 후의 값 또는 속도를 표시합니다. [위치] 속성의 그래프 오버레이를 켜면 [컴포지션] 패널의 동작 패스 표시도 변경되므로 패스에 표현식이 적용된 것을 확인할 수 있습니다.

참고:

[타임라인] 패널의 검색 필드를 사용하여 표현식 외에 속성의 다른 구성 요소를 검색할 수 있습니다. 검색 문자열이 표현식에 표시되면 속성 및 포함된 속성 그룹 및 레이어가 검색 결과의 필터링 집합에 표시됩니다.

소스 텍스트의 표현식 쓰기

텍스트 레이어의 [소스 텍스트] 속성은 표현식에서 JavaScript 문자열로 해석됩니다. 뚝딱 도구를 사용하여 다른 텍스트 레이어에서 소스 텍스트를 가져올 수 있지만 이 경우 대상 레이어의 첫 번째 문자 스타일만 사용됩니다.

JavaScript 문자열 개체에 대한 자세한 내용은 JavaScript 참조 리소스를 참조하십시오.

문자열 표현식에 "\r"를 사용하여 새로운 텍스트 줄을 시작할 수 있습니다. 예를 들어 원본 텍스트를 한 레이어에서 같은 레이어로 복사하고 해당 텍스트를 모두 대문자로 변환하여 새 줄에 나타내려면 다음 표현식을 사용합니다.

  text.sourceText + "\r" + text.sourceText.toUpperCase()

컴포지션에 텍스트 레이어를 추가하고 [원본 텍스트] 속성에 표현식을 추가하는 것은 다른 레이어의 속성 값을 검사할 수 있는 좋은 방법입니다. 예를 들어 [소스 텍스트] 속성의 다음 표현식은 레이어 겹침 순서상의 다음 레이어에 대해 [불투명도] 속성의 이름 및 값을 보고합니다.

  thisComp.layer(index + 1).name + "\rOpacity = " + thisComp.layer(index + 1).opacity.value

다음 예제에서는 현재의 겹침 순서에서 맨 위에 있고 비디오 스위치 세트가 설정되어 있는 이미지 레이어의 소스로 사용되는 푸티지 항목의 이름을 보고합니다.

  source_footage_name = ""; 
  for (i = 1; i <= thisComp.numLayers; i++){ 
      if (i == index) continue; 
      my_layer = thisComp.layer(i); 
      if (! (my_layer.hasVideo && my_layer.active)) continue; 
      if (time >= my_layer.inPoint && time < my_layer.outPoint){ 
          try{ 
              source_footage_name = my_layer.source.name; 
          }catch(err1){ 
              source_footage_name = my_layer.name 
          } 
          break; 
      } 
  } 
  source_footage_name

Aharon Rabinowitz는 Red Giant TV에서 소스 텍스트 속성 및 슬라이더 효과(표현식 컨트롤 효과)를 사용하여 비디오 게임 스코어를 애니메이션을 적용하는 방법을 보여 주는 비디오 자습서 및 예제 표현식을 제공합니다.

 

표현식에 주석 추가

복잡한 표현식을 작성한 경우 나중에 자신 또는 다른 사용자가 사용할 수 있도록 하려면 표현식의 기능 및 각 부분의 동작 방법을 설명하는 주석을 추가해야 합니다.

  • 주석의 시작 위치에 //를 입력합니다. //와 줄 끝 사이의 텍스트는 모두 무시됩니다. 예를 들면 다음과 같습니다.  // This is a comment.

    이러한 유형의 주석에 대한 예제를 보려면 표현식 예제: 카메라로부터의 거리에 따라 3D 레이어의 불투명도 페이드를 참조하십시오.

  • 주석의 시작 위치에 /*를 입력하고 주석의 끝에 */를 입력합니다. /**/ 사이의 텍스트는 모두 무시됩니다. 예를 들면 다음과 같습니다.  /*  This is a         multiline comment. */

    이러한 유형의 주석에 대한 예제를 보려면 표현식 저장 및 다시 사용을 참조하십시오.

표현식 저장 및 다시 사용

표현식을 작성한 후 복사하여 텍스트 편집 응용 프로그램에 붙여넣거나 애니메이션 사전 설정 또는 템플릿 프로젝트에 저장하여 나중에 사용할 수 있습니다. 그러나 표현식이 프로젝트의 다른 레이어와 관련되어 작성되고 특정 레이어 이름을 사용할 수 있으므로 표현식을 수정하여 프로젝트 간에 전송해야 하는 경우도 있습니다.

일반 JavaScript 함수 구문을 사용하여 표현식 내에 자신의 함수를 정의할 수 있습니다. 이 예제에서는 두 값의 평균을 계산하는 함수를 정의하고 마지막 줄에서 이 함수를 사용합니다.

  function average(a, b) 
  { 
    return (a + b) / 2; 
  } 
  average(position, thisComp.layer(1).position);

참고:

각 함수는 사용되는 각 표현식 내에서 완전히 정의해야 합니다. 함수를 추가할 수 있는 전역 함수 라이브러리는 없습니다.

표현식을 저장하여 다른 프로젝트에 사용하려면 표현식에 주석을 추가해야 합니다. 표현식에 주석 추가를 참조하십시오. 또한 변수를 사용하여 여러 곳에서 값을 변경하지 않고 한 곳에서 변경할 수 있도록 해야 합니다.

예를 들어 이 표현식의 시작 위치에는 표현식의 기능을 설명하는 여러 줄의 주석이 있고 변수가 선언되고 초기화된 다음에는 변수의 기능을 설명하는 짧은 주석이 있습니다.

  /*  This expression on a Source Text property reports the name 
      of a layer and the value of its Opacity property. */  
    
  var myLayerIndex = 1; // layer to inspect, initialized to 1, for top layer  
    
  thisComp.layer(myLayerIndex).name + ": \rOpacity = " +   thisComp.layer(myLayerIndex).opacity.value

표현식에서 다른 프로젝트에 없는 속성을 참조하지 않으면 표현식을 포함한 애니메이션 사전 설정을 저장하여 다른 프로젝트에 다시 사용할 수 있습니다. 속성에 표현식만 있고 키프레임이 없는 사전 설정을 저장하면 표현식만 저장됩니다. 속성에 키프레임이 하나 이상 있는 경우 저장된 사전 설정에는 모든 키프레임 값과 표현식이 함께 포함됩니다.

속성의 키프레임과 상관없이 레이어의 속성에서 표현식을 복사할 수 있습니다.

  • 한 속성에서 다른 속성으로 표현식 및 키프레임을 복사하려면 [타임라인] 패널의 소스 레이어 속성을 선택한 후 레이어 속성을 복사한 다음 대상 레이어 속성을 선택한 후 붙여넣습니다.
  • 키프레임을 제외하고 한 속성에서 다른 속성으로 표현식을 복사하려면 소스 속성을 선택한 후 [편집] > [표현식만 복사]를 선택한 다음 대상 속성을 선택한 후 붙여넣습니다.

참고:

키프레임이 없는 표현식을 복사하면 여러 표현식을 동시에 복사하여 하나 이상의 새 레이어에 붙여넣거나 한 표현식을 복사하여 둘 이상의 레이어에 붙여넣을 때 유용합니다.

참고:

키프레임 및 다른 항목을 붙여넣을 때 자주 그러듯이 항목을 대상 레이어에 붙여넣기만 하고 어떤 속성에 붙여넣을지는 After Effects에서 결정하도록 할 수 있습니다. 이 방법은 한 레이어에서 다른 레이어로 [위치] 속성을 복사할 때는 사용할 수 있지만 [위치] 속성에서 [비율] 속성으로 표현식을 붙여넣는 경우에는 사용할 수 없습니다. 이 경우에는 대상 속성을 직접 선택해야 합니다.

Paul Tuersley는 표현식 관리 및 편집에 사용할 수 있는 pt_ExpressEdit 스크립트를 제공합니다.

표현식 컨트롤 효과

표현식 컨트롤 효과를 사용하면 표현식을 통해 속성을 컨트롤에 연결하여 여러 속성의 값을 조작할 수 있는 컨트롤을 추가할 수 있습니다. 단일 컨트롤을 동시에 여러 속성에 적용할 수 있습니다.

표현식 컨트롤 효과의 이름은 어떤 종류의 속성 컨트롤을 제공하는지를 나타냅니다. 예를 들어 각도 컨트롤, 확인란 컨트롤, 색상 컨트롤, 레이어 컨트롤, 지점 컨트롤, 슬라이더 컨트롤 등의 이름이 사용됩니다. 또한 After Effects CS5.5 이상에는 3D 지점 컨트롤이 포함되어 있습니다.

참고:

[애니메이션 사전 설정] > [모양] > [배경] 범주에 속한 애니메이션 사전 설정을 적용하면 [효과 컨트롤] 패널에서 사용자 정의 [애니메이션 모양 컨트롤] 효과를 확인할 수 있습니다. 이 사용자 정의 효과는 특별히 이러한 애니메이션 사전 설정을 위해 만든 특수한 표현식 컨트롤 효과입니다. 이 효과를 복사하여 다른 레이어에 붙여넣을 수도 있고 그 자체를 애니메이션 사전 설정으로 저장하여 다른 곳에 적용할 수도 있습니다.

표현식 컨트롤 효과는 다른 효과를 적용하는 것과 같은 방법으로 레이어에 적용하며 [효과 및 사전 설정] 패널에서 효과를 레이어로 드래그합니다.

표현식 컨트롤 효과는 모든 레이어에 적용할 수 있지만 Null 레이어에 적용하는 것이 유용합니다. Null 레이어는 간단하게 컨트롤 레이어로 사용할 수 있기 때문입니다. 그런 다음 다른 레이어의 속성에 표현식을 추가하여 해당 컨트롤에서 입력을 받습니다. 예를 들어 슬라이더 컨트롤 효과를 Null 레이어(Null 1)에 추가한 다음 여러 레이어의 [위치] 속성에 이 표현식을 적용할 수 있습니다.

  position+[0,10*(index-1)*thisComp.layer("Null 1").effect("Slider Control")("Slider")]

이 예제에서는 슬라이더를 드래그하면 이 표현식이 적용된 각 레이어가 이동합니다. 인덱스 번호가 큰 레이어([타임라인] 패널의 아래쪽 레이어)가 인덱스 번호가 작은 레이어보다 10픽셀 간격만큼 더 이동합니다. Null 레이어의 슬라이더에 키프레임을 설정할 수 있습니다. 이렇게 하면 다른 모든 레이어에 애니메이션이 적용됩니다.

표현식 컨트롤 효과의 각 인스턴스 이름을 변경하여 용도를 나타내면 유용합니다. 예를 들어 색상 컨트롤 효과의 인스턴스 이름을 하늘색으로 변경하면 효과를 통해 제어하는 것이 무엇인지 쉽게 알 수 있습니다. 표현식 컨트롤 효과의 각 인스턴스 이름은 다른 효과의 이름을 변경하는 것과 같은 방법으로 변경합니다. [타임라인] 패널 또는 [효과 컨트롤] 패널에서 인스턴스를 선택한 후 Enter(Windows) 또는 Return(Mac OS)을 누릅니다.

참고:

컨트롤의 범위를 수정하려면 컨트롤의 밑줄이 있는 속성 값을 마우스 오른쪽 단추로 클릭(Windows)하거나 Control 키를 누른 상태로 클릭(Mac OS)한 후 문맥 메뉴에서 [값 편집]을 선택합니다.

표현식 컨트롤 효과 관련 추가 리소스

Jerzy Drozda, Jr.(Maltaannon)는 Maltaannon이 Motionworks 웹 사이트를 통해 일반적인 각도 컨트롤 효과 및 표현식 컨트롤 효과에 대한 간단한 설명과 데모를 제공합니다.

Todd Kopriva는 색상 교정 중에 sampleImage 메서드 및 지점 컨트롤 효과를 사용하여 지정된 지점에 대해 색상을 모니터링하기 위한 지침을 자신의After Effects Region of Interest 블로그에서 제공합니다.

표현식을 키프레임으로 변환

경우에 따라서는 표현식을 키프레임으로 변환하는 것이 유용할 수 있습니다. 예를 들어 표현식의 값을 고정하려는 경우 표현식을 키프레임으로 변환한 다음 해당 키프레임을 조정할 수 있습니다. 표현식 계산에 시간이 오래 걸리는 경우에는 표현식을 키프레임으로 변환하여 더 빠르게 렌더링되도록 할 수 있습니다. 표현식을 키프레임으로 변환하면 After Effects에서는 표현식을 계산하여 모든 프레임에서 키프레임을 만든 후 표현식을 사용할 수 없도록 합니다.

  1. [타임라인] 패널에서 표현식이 작성된 속성을 선택한 후 [애니메이션] > [키프레임 도우미] > [표현식을 키프레임으로 변환]을 선택합니다.

표현식 언어

After Effects 표현식 언어는 JavaScript 1.2를 따르며 기본 개체의 확장 세트를 포함하고 있습니다. After Effects에서는 코어 표준 JavaScript 1.2 언어만을 사용하며 웹 브라우저별 확장은 사용하지 않습니다. After Effects에는 Layer, Comp, Footage 및 Camera 등의 자체 확장 개체 세트가 포함되어 있습니다. 이러한 확장 개체 세트는 After Effects 프로젝트에 포함된 대부분의 값을 가져오는 데 사용할 수 있습니다.

표현식 언어는 스크립팅 언어를 따르지만 스크립트와 표현식 간에는 미묘하지만 중요한 차이가 있습니다. 즉, 스크립트에서는 응용 프로그램의 동작을 지시하지만 표현식에서는 속성을 지정합니다.

JavaScript에 대한 자세한 내용은 JavaScript 참조 리소스를 참조하십시오.

표현식을 만들 때는 다음 사항에 유의하십시오.

  • 표현식의 값은 마지막으로 계산된 문장의 값입니다.

  • JavaScript는 대소문자를 구분하는 언어입니다.

  • 문장 또는 줄을 분리할 때 세미콜론을 사용해야 합니다.

  • 단어 간 공백은 무시하지만 문자열 내에서는 무시하지 않습니다.

JavaScript에서는 개체에 저장된 값을 속성이라고 합니다. 그러나 After Effects에서 속성이라는 용어는 [타임라인] 패널에 정의된 레이어 구성 요소를 의미합니다. 따라서 After Effects에서는 JavaScript 속성을 메서드 또는 특성이라고 부릅니다. 일반적으로 메서드특성 간의 차이점은 메서드는 주로 특정 작업을 수행하여 출력(반환) 값을 생성하는 반면, 특성은 단지 기존 값을 참조하여 출력(반환) 값을 결정한다는 것입니다. 메서드의 경우 메서드 이름 뒤에 입력 인수를 감싸는 괄호가 사용되므로 괄호가 있는지 확인하면 메서드와 특성을 쉽게 구별할 수 있습니다.

개체는 다른 개체, 특성 및 메서드를 포함할 수 있는 항목입니다. 컴포지션, 레이어 및 푸티지 항목 등이 개체에 해당합니다. 특히 컴포지션, 레이어 및 푸티지 항목은 전역 개체입니다. 따라서 더 높은 레벨의 개체를 참조하지 않아도 모든 컨텍스트에서 참조될 수 있습니다.

특성 및 메서드 액세스

표현식 언어를 사용하여 레이어 속성의 특성 및 메서드에 액세스합니다. 값에 액세스하려면 마침표() 연산자로 분리된 개체 참조의 체인을 사용합니다. 레이어 레벨을 넘어 개체 참조를 체인으로 연결하려는 경우(예: 효과 속성, 마스크 또는 텍스트 애니메이터 참조) 괄호도 사용할 수 있습니다. 예를 들어 Layer A의 [불투명도] 속성을 Layer B에 적용된 가우시안 흐림 효과의 [흐림] 속성에 연결하려면 Layer A의 [불투명도] 속성 표현식 필드에 다음 표현식을 입력합니다.

  thisComp.layer("Layer B").effect("Gaussian Blur")("Blurriness")

이 표현식을 왼쪽에서 오른쪽으로 읽으면 개체를 포함하는 높은 레벨에서 시작하여 특정 속성으로 내려가는 것을 알 수 있습니다.

  • thisComp: 사용된 전역 개체는 현재 컴포지션을 참조합니다.

  • layer("Layer B"): 컴포지션 내의 특정 레이어 개체는 이름으로 참조됩니다.

  • effect("Gaussian Blur"): 레이어 내의 특정 효과 개체는 이름으로 참조됩니다.

  • ("Blurriness"): 효과 내의 특정 효과 속성은 이름으로 참조됩니다.

효과 조절점의 y 구성 요소와 같이 다차원 속성의 n번째 구성 요소의 경우 다음과 같이 끝에 [n]을 추가합니다.

  thisComp.layer("Layer B").effect("Advanced Lightning")("Origin")[1]

표현식의 기본 개체는 표현식이 작성된 속성이고 기본 개체 뒤에는 해당 표현식을 포함하는 레이어가 오므로 속성을 지정할 필요는 없습니다. 예를 들어 레이어의 [위치] 속성에 대해 작성한 wiggle 표현식은 다음 둘 중 하나일 수 있습니다.

  wiggle(5, 10) 
  position.wiggle(5, 10)

표현식이 작성된 레이어 및 속성 외부에서 레이어와 속성을 검색하는 경우 해당 레이어와 속성을 포함해야 합니다. 예를 들어 Layer B의 [불투명도] 속성에 대해 작성했으며 이 속성을 Layer A의 [회전] 속성에 연결하는 표현식은 다음과 같습니다.

  thisComp.layer("Layer A").rotation

참고:

표현식의 작동 방식에 대한 다른 예제를 더 보려면 뚝딱 툴을 사용하여 한 레이어 속성을 다른 속성으로 연결한 후 작성된 표현식을 살펴봅니다.

Jeff Almasol은 redefinery 웹 사이트에서 표현식에서 속성을 참조하는 방법을 결정할 수 있는 스크립트를 제공합니다.

배열 및 다차원 속성

배열은 순서 있는 숫자 세트를 저장하는 개체 유형입니다. 배열은 다음 예처럼 쉼표로 구분되고 대괄호로 묶인 숫자의 목록으로 나타냅니다.

  [10, 23]

배열 개체를 변수에 할당하면 표현식의 다른 영역에서 배열 값을 쉽게 참조할 수 있습니다. 예를 들면 다음과 같습니다.

  myArray = [10, 23]

배열 개체의 차원은 배열에 있는 요소의 숫자입니다. myArray의 차원은 2입니다. After Effects의 서로 다른 속성은 포함하는 값 인수의 수에 따라 서로 다른 차원을 가집니다. 표현식 언어에서 속성 값은 단일 값(숫자 개체)이거나 배열(배열 개체)입니다.

다음 표에서는 일부 속성 및 해당 차원의 예를 보여 줍니다.

차원

속성

1

회전 °

불투명도 %

2

비율[x=폭, y=높이]

위치[x, y]

기준점[x, y]

오디오 레벨[왼쪽, 오른쪽]

3

비율[폭, 높이, 깊이]

3D 위치[x, y, z]

3D 기준점[x, y, z]

방향[x, y, z]

4

색상[빨강, 녹색, 파랑, 알파]

대괄호 및 인덱스 번호로 원하는 요소를 지정하여 배열 개체의 개별 요소에 액세스할 수 있습니다. 배열 개체의 요소에 대한 인덱싱은 0에서 시작합니다. 이전 예제에서 myArray[0]10이고 myArray[1]23입니다.

다음 두 표현식은 동일합니다.

  [myArray[0], 5] 
  [10, 5]

[위치] 속성 배열은 다음과 같이 인덱싱됩니다.

  • position[0]은 위치의 x 좌표입니다.

  • position[1]은 위치의 y 좌표입니다.

  • position[2]는 위치의 z 좌표입니다.

색상은 4차원 배열[red, green, blue, alpha]로 표시됩니다. 색상 심도가 8bpc 또는 16bpc인 프로젝트에서 색상 배열의 각 값은 0(검정)에서 1(흰색)까지의 범위를 가집니다. 예를 들어 red는 0(색상 없음)에서 1(빨강)까지의 범위를 가질 수 있습니다. 따라서 [0,0,0,0]은 투명한 검정을 나타내고 [1,1,1,1]은 불투명한 흰색을 나타냅니다. 색상 심도가 32bpc인 프로젝트에서는 0보다 작거나 1보다 큰 값을 사용할 수 있습니다.

배열 개체에 있는 가장 차원이 높은 구성 요소의 인덱스보다 큰 인덱스를 사용하는 경우 After Effects에서는 오류를 반환합니다. 예를 들어 myArray[2]는 오류를 유발하지만 position[2]는 위치의 z 좌표를 반환합니다.

After Effects 표현식 언어의 많은 속성 및 메서드에서는 배열 개체를 인수로 받거나 값으로 반환합니다. 예를 들어 thisLayer.position은 레이어가 2D인지 아니면 3D인지에 따라 2차원 배열이 되거나 3차원 배열이 되는 개체입니다.

위치 애니메이션의 y 값을 유지하고 x 값을 9로 고정하는 표현식을 작성하려면 다음을 사용합니다.

  y = position[1]; 
  [9,y]

다음과 같이 더욱 간결한 표현식을 사용할 수도 있습니다.

  [9, position[1]]

이는 표현식 사용에서 중요한 점이므로 예제를 하나 더 살펴보도록 합니다. Layer A의 x 위치 값과 Layer B의 y 위치 값을 결합하려면 다음을 사용합니다.

  x = thisComp.layer("Layer A").position[0];  
  y = thisComp.layer("Layer B").position[1];  
  [x,y]

2D 또는 3D 속성의 배열 내에 있는 값 하나만 참조하는 표현식을 만들 수 있습니다. 달리 지정하지 않으면 기본적으로 첫 번째 값이 사용됩니다. 예를 들어 뚝딱 도구를 Layer A의 [회전] 속성에서 Layer B의 [비율] 속성으로 드래그하면 다음 표현식이 표시됩니다.

  thisComp.layer("Layer B").scale[0]

기본적으로 위 표현식에서는 [비율] 속성의 첫 번째 값인 폭을 사용합니다. 높이 값을 대신 사용하려면 뚝딱 도구를 속성 이름 대신 두 번째 값으로 바로 드래그하거나 다음과 같이 표현식을 변경합니다.

  thisComp.layer("Layer B").scale[1]

반대로 Layer B의 [비율] 속성에서 Layer A의 [회전] 속성으로 뚝딱 도구를 드래그하면 After Effects에서는 변수를 자동으로 만들고 1차원 [회전] 속성 값을 할당한 다음 [비율] 속성의 두 차원에 대해 해당 변수를 사용합니다.

  temp = thisComp.layer(1).transform.rotation; 
  [temp, temp]

벡터

After Effects의 여러 속성과 메서드에서는 벡터를 받거나 반환합니다. After Effects에서는 배열이 공간의 점 또는 방향을 나타내는 경우 배열을 벡터로 참조합니다. 예를 들어 After Effects에서는 위치를 벡터 반환으로 설명합니다.

그러나 audioLevels와 같은 함수는 2차원 값(왼쪽 및 오른쪽 채널 레벨)을 반환하지만 점 또는 방향을 나타내지 않으므로 벡터라고 하지 않습니다. After Effects의 일부 함수에서 벡터 인수를 받아들이지만 벡터 인수는 일반적으로 전달된 값이 방향을 나타낼 때만 유용합니다. 예를 들어 cross(vec1, vec2)에서는 입력 벡터의 오른쪽 각도에 있는 세 번째 벡터를 계산합니다. 외적은 vec1vec2가 공간의 방향을 나타내는 두 벡터인 경우에는 유용하지만 임의의 숫자 모음 두 개를 나타낼 때는 유용하지 않습니다.

인덱스 및 레이블

After Effects의 레이어, 효과 및 마스크 요소에 대한 인덱싱은 1에서부터 시작됩니다. 예를 들어 [타임라인] 패널의 첫 번째 레이어는 layer(1)입니다.

일반적으로 레이어, 효과 또는 마스크를 이동하거나 제품 업데이트 및 업그레이드 과정에서 인수가 변경되는 경우에는 숫자 대신 레이어, 효과 또는 마스크의 이름을 사용하여 혼동과 실수를 피하는 것이 좋습니다. 이름을 사용하는 경우 항상 곧은 따옴표로 묶도록 합니다. 예를 들어 아래의 첫 번째 표현식이 두 번째 표현식보다 이해하기 쉬우며 첫 번째 표현식은 효과의 순서를 바꿔도 작동합니다.

  effect("Colorama").param("Get Phase From")  
  effect(1).param(2)

표현식 시간

표현식 내의 시간은 항상 레이어 시간이 아닌 컴포지션 시간이며 초 단위로 측정됩니다. 모든 표현식의 기본 시간은 표현식이 계산되는 현재 컴포지션 시간입니다. 다음 표현식에서는 모두 기본 컴포지션 시간을 사용하고 같은 값을 반환합니다.

  thisComp.layer(1).position 
  thisComp.layer(1).position.valueAtTime(time)

상대 시간을 사용하려면 time 인수에 증분된 시간 값을 더합니다. 예를 들어 현재 시간 5초 전의 위치 값을 구하려면 다음 표현식을 사용합니다.

  thisComp.layer(1).position.valueAtTime(time-5)

중첩된 컴포지션에 있는 속성의 기본 시간 참조에서는 다시 매핑된 시간이 아닌 원본 기본 컴포지션 시간을 사용합니다. 그러나 source 함수를 사용하여 속성을 가져오는 경우 다시 매핑된 시간이 사용됩니다.

예를 들어 포함하는 컴포지션의 레이어 소스가 중첩된 컴포지션이고 포함하는 컴포지션에 다시 매핑된 시간이 있는 경우 다음 표현식을 사용하여 중첩된 컴포지션에 있는 레이어의 위치 값을 가져오면 위치 값에 컴포지션의 기본 시간이 사용됩니다.

  comp("nested composition").layer(1).position

그러나 source 함수로 layer 1에 액세스하면 위치 값에 다시 매핑된 시간이 사용됩니다.

  thisComp.layer("nested composition").source.layer(1).position

참고:

표현식에 특정 시간을 사용하는 경우 After Effects에서는 다시 매핑된 시간을 무시합니다.

표현식에서는 프레임이 아닌 초 단위 시간으로 연산하므로 프레임 단위로 연산을 수행하려면 시간 변환 메서드로 시간 값을 변환해야 할 수도 있습니다. 자세한 내용은 시간 변환 메서드(표현식 참조)를 참조하십시오.

표현식 오류

표현식이 평가에 실패하는 경우 대화 상자 대신 [컴포지션] 및 [레이어] 패널의 맨 아래에서 경고 배너에 표현식 오류가 나타납니다. After Effects는 표현식을 비활성화하지 않지만 계속 평가합니다. 표현식이 평가에 실패하는 동안에는, 다시 말해서 표현식을 수정하거나 직접 비활성화할 때까지 경고 배너가 표시됩니다.

다음은 표현식 오류 경고 배너의 예입니다.

표현식 오류 예
표현식 오류 예

A. 왼쪽 또는 오른쪽 화살표 단추 B. 표현식 표시 C. 경고 확장/축소 
  • 여러 개의 표현식이 평가에 실패한 경우 왼쪽 또는 오른쪽 화살표 단추를 클릭하면 이전 또는 다음 표현식 오류가 표시됩니다.
  • [표현식 표시](돋보기) 버튼은 오류가 발생하는 표현식이 있는 속성을 [타임라인] 패널에 표시합니다. 표현식이 다른 컴포지션에 있는 경우 해당 컴포지션이 열립니다.
  • [경고 확장/축소](위쪽/아래쪽 화살표) 단추는 오류 텍스트를 표시하거나 숨깁니다.

표현식 오류 텍스트는 한 줄로만 표시되고 [컴포지션] 패널의 폭에 맞게 잘립니다.

전체 표현식 오류 텍스트를 보려면

표현식 옆의 를 클릭합니다. 전체 오류가 대화 상자에 나타납니다.

경고 배너를 숨기려면

After Effects CC(Mac OS) 또는 [편집](Windows) > [환경 설정] > [일반]을 선택하고 [프로젝트에 표현식 오류가 있으면 경고 배너 표시]를 비활성화합니다.

이 옵션이 비활성화되면 새 표현식 오류가 발생하더라도 경고 배너가 숨겨진 상태로 유지됩니다.

표현식 오류를 표시하려면 이 옵션을 다시 활성화합니다.

온라인 리소스

이 섹션의 여러 예제는 Dan Ebberts가 제공한 예제를 기반으로 작성되었습니다. 또한 Dan Ebberts는 Motionscript 웹 사이트에서 표현식을 사용한 작업 방법을 학습하기 위한 뛰어난 자습서 및 표현식 예제 모음을 제공합니다.

AE Enhancers 포럼에서는 표현식뿐 아니라 스크립트 및 애니메이션 사전 설정에 대한 많은 예제와 정보를 제공합니다.

이 작업에는 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License의 라이센스가 부여되었습니다.  Twitter™ 및 Facebook 게시물은 Creative Commons 약관을 적용받지 않습니다.

법적 고지 사항   |   온라인 개인 정보 보호 정책