
Control Flow - 오른쪽에서 왼쪽으로
Max의 실행 순서 규칙과 Hot/Cold Inlet의 차이, 실행 순서 문제를 해결하는 방법을 배웁니다.
이 에피소드에서 배우는 것
- Max의 실행 순서 규칙 (Right to Left)
- 실행 순서가 결과에 미치는 영향
- 실행 순서 문제를 디버깅하는 방법
사전 지식
- EP02: 첫 번째 패치 만들기
가장 중요한 규칙: 오른쪽에서 왼쪽으로
Max에서 하나의 출력이 여러 오브젝트에 동시에 연결되어 있을 때, 어떤 오브젝트가 먼저 실행될까? 답은 “화면에서 가장 오른쪽에 있는 오브젝트가 먼저 실행된다”이다.
이것은 Max 프로그래밍에서 가장 자주 실수를 유발하는 규칙이기도 하다. 겉보기에는 “동시에” 실행되는 것처럼 보이지만, 실제로는 오른쪽부터 왼쪽으로 순차적으로 처리된다. 이 미세한 순서 차이가 프로그램의 결과를 완전히 바꿀 수 있다.
예를 들어, 하나의 bang이 네 개의 오브젝트에 동시에 연결되어 있다고 하자. 이 경우 가장 오른쪽에 위치한 오브젝트부터 실행되어 왼쪽으로 진행된다. 만약 이 순서가 중요한 연산이라면, 오브젝트의 물리적 위치를 신중하게 배치해야 한다.
왜 이 규칙이 존재하는가
Max는 화면에 보이는 그래픽 요소들을 내부적으로 순서대로 처리해야 한다. 여러 연결이 동시에 존재할 때, 어떤 기준으로 우선순위를 정할지 규칙이 필요했다. Max는 이를 화면상의 물리적 위치(오른쪽→왼쪽)로 결정하는 방식을 채택했다.
이 규칙은 특히 오브젝트의 왼쪽 Inlet에 데이터를 보내기 전에 오른쪽 Inlet의 값을 먼저 설정해야 하는 상황에서 중요해진다. 대부분의 Max 오브젝트에서 왼쪽 Inlet은 “핫(hot)” Inlet으로, 데이터가 들어오면 즉시 연산이 실행된다. 반면 오른쪽 Inlet은 “콜드(cold)” Inlet으로, 데이터가 들어와도 연산이 바로 실행되지 않고 저장만 된다.
따라서 올바른 결과를 얻으려면:
- 오른쪽 Inlet(콜드)에 값을 먼저 설정하고
- 왼쪽 Inlet(핫)에 마지막으로 값을 보내야 한다
이것이 “오른쪽에서 왼쪽으로”라는 규칙의 실질적인 의미이다.
퀴즈
다음 패치에서 결과를 예측해보자.
A: bang 하나를 3개의 print에 동시에 보낼 때 — print가 오른쪽에서 왼쪽 순서로 실행된다
B: bangbang 3을 사용 — 오른쪽 outlet부터 순차적으로 bang 출력
C: 35를 가장 오른쪽 → 가운데 → 왼쪽 numberbox로 순차 입력 — 순서 보장
D: trigger i i i — 왼쪽 outlet부터 명시적 순서 지정 (trigger는 예외적으로 왼→오른쪽)
정답은 실습 파일에서 직접 확인해보자.
실행 순서 문제 해결하기
실행 순서 문제를 피하려면, 순서가 명시적으로 중요한 곳에서는 오브젝트의 물리적 위치에 의존하지 말고, [trigger](줄여서 [t]) 오브젝트를 사용하는 것이 좋다. trigger는 다음 에피소드에서 더 자세히 다루지만, 핵심은 “실행 순서를 프로그래머가 명확하게 지정할 수 있게 해주는 오브젝트”라는 점이다.
핵심 정리
| 규칙 | 설명 |
|---|---|
| 실행 순서 | 오른쪽에서 왼쪽으로 |
| Hot Inlet | 왼쪽 Inlet - 데이터 입력 시 즉시 연산 실행 |
| Cold Inlet | 오른쪽 Inlet - 데이터 저장만, 연산 실행하지 않음 |
| 해결책 | [trigger] 오브젝트로 명시적 순서 지정 |
직접 해보기
RightToLeft.maxpat를 열어서 각 경우의 출력 순서를 확인하자- 두 개의 numberbox를
[+ ]에 연결할 때, 연결 순서를 바꿔보면서 결과가 달라지는지 관찰하자 - print 오브젝트를 여러 개 연결한 뒤, 위치를 옮겨보면서 출력 순서가 변하는 것을 확인하자
다음 에피소드 예고
다음 에피소드에서는 Max에서 시간을 다루는 방법을 배운다. metro로 일정한 박자를 만들고, counter로 숫자를 세고, clocker로 경과 시간을 측정하는 방법을 알아본다.
자주 묻는 질문
Hot Inlet과 Cold Inlet은 어떻게 구분하나요?
거의 모든 Max 오브젝트에서 가장 왼쪽 Inlet이 Hot Inlet이며, 데이터가 들어오면 즉시 연산이 실행되고 결과가 출력됩니다. 나머지 Inlet은 Cold Inlet으로 값을 받아도 내부에 저장만 되고 출력이 일어나지 않습니다. Max에서 [+] 같은 오브젝트에 마우스를 올리면 Hot Inlet은 빨간 테두리, Cold Inlet은 파란 테두리로 시각적으로 표시됩니다. 따라서 "오른쪽 Inlet에 값을 먼저, 왼쪽 Inlet에 마지막에"는 "Cold에 값을 채우고 Hot으로 실행"이라는 뜻입니다.
실행 순서가 정말 중요한가요? 어차피 같은 데이터가 흐르는데?
매우 중요합니다. 예를 들어 [+] 오브젝트의 왼쪽(Hot)에 5를 먼저 보내고 오른쪽(Cold)에 3을 보내면 결과가 나오지 않거나 의도한 8 대신 이전 값과의 합이 나옵니다. 반대로 오른쪽에 3을 먼저, 왼쪽에 5를 보내면 정확히 8이 출력됩니다. 시퀀서에서 인덱스가 갱신되기 전에 데이터를 읽어버리거나, pack에 값이 채워지기 전에 출력이 발사되는 등 실행 순서 버그는 가장 흔한 Max 오류 유형입니다.
오브젝트의 위치를 옮기지 않고 실행 순서를 강제할 수 있나요?
[trigger] 오브젝트(줄여서 [t])를 사용합니다. [t b b b]처럼 인자를 주면 Outlet 개수가 정해지고, 입력이 들어왔을 때 가장 오른쪽 Outlet부터 왼쪽 순서로 데이터가 출력됩니다. 이 순서는 화면상 오브젝트의 물리적 위치와 무관하게 항상 보장됩니다. 인자에는 b(bang), i(int), f(float), s(symbol), l(list)을 쓸 수 있어 출력 데이터 타입까지 함께 지정할 수 있습니다. 패치가 복잡해지면 trigger를 적극적으로 쓰는 것이 디버깅 시간을 가장 크게 줄여줍니다.
[trigger]는 왜 오른쪽에서 왼쪽으로 실행되나요?
Max의 일반적인 "오른쪽 → 왼쪽" 실행 규칙과 일관성을 맞춘 설계입니다. 거의 모든 오브젝트에서 데이터를 보낼 때 오른쪽(Cold) Inlet을 먼저 채우고 왼쪽(Hot) Inlet으로 트리거하는 패턴을 쓰기 때문에, [t] 역시 오른쪽 Outlet부터 보내는 것이 자연스럽습니다. 단, [bangbang]은 예외적으로 왼쪽부터 오른쪽 순서로 bang을 출력하므로 두 오브젝트의 동작 방향을 헷갈리지 않도록 주의하세요.
이 에피소드가 도움이 됐다면 눌러주세요.
실습 패치 다운로드
Max 8 이상에서 열어주세요. 파일을 Max로 드래그하거나 더블클릭하면 실행됩니다.
공식 문서 참조
YouTube
채널에서 더 많은 Max/MSP 예제를 이어서 보세요
튜토리얼의 흐름을 끊지 않고, 실제 영상 데모와 채널 콘텐츠를 연속해서 확인할 수 있습니다.