Season 01 · EP04 데이터 타입 완전정복 - Int, Float, Symbol, List, Signal 썸네일
← 튜토리얼Season 01 · EP04 · Max/MSP 입문

데이터 타입 완전정복 - Int, Float, Symbol, List, Signal

Max에서 사용하는 6가지 주요 데이터 타입과 정수/소수의 함정, 리스트와 시그널의 차이를 알아봅니다.

난이도: 초급 예상 시간:

이 에피소드에서 배우는 것

  • Max에서 사용하는 6가지 주요 데이터 타입
  • 정수와 소수의 차이가 만드는 함정
  • 리스트의 개념과 활용
  • Control Rate 데이터와 Audio Rate 데이터의 차이

사전 지식

  • EP02: 첫 번째 패치 만들기

왜 데이터 타입을 알아야 하는가

Max로 프로그래밍을 하다 보면, 분명히 같은 연산인데 결과가 다르게 나오는 경우를 만나게 된다. 예를 들어 [/ 3] 오브젝트에 10을 보내면 결과가 3이 나온다. 3.333…이 아니라 3이다. 이유는 Max가 입력된 숫자를 정수(Integer)로 해석했기 때문이다. 이렇게 데이터 타입을 정확히 이해하지 못하면 의도하지 않은 결과가 나올 수 있다.

정수 (Integer)와 부동소수점 (Float)

Max는 숫자를 **정수(Int)**와 소수(Float) 두 가지로만 구분한다.

**정수(Int)**는 소수점이 없는 숫자이다. 32비트 부호 있는 정수로, -2,147,483,648에서 2,147,483,647까지의 범위를 가진다. [numberbox]의 기본 모드가 정수이다.

**부동소수점(Float)**은 소수점이 있는 숫자이다. 32비트 부동소수점으로, 대략 ±3.4×10^38까지의 범위를 표현할 수 있다.

여기서 중요한 함정이 있다. 정수형 numberbox에 소수를 보내면, 소수점 이하가 잘려나간다(Truncated). 반올림이 아니라 무조건 내림이다. 3.9를 보내도 3이 된다.

사칙연산 오브젝트에서 소수점 결과를 얻으려면, 오브젝트 이름 뒤에 소수점을 붙여야 한다. [/ 3]은 정수 나누기이지만 [/ 3.]은 소수 나누기이다. 이 작은 점 하나가 결과를 완전히 바꾸므로 항상 주의하자.

기본 사칙연산 오브젝트 + 0 - 0 * 0 / 0 왼쪽은 [/] (정수 나누기)로 12.75 / 2.5 = 6, 오른쪽은 [/ 1.] (소수 나누기)로 12.75 / 2.5 = 5.1 — 소수점 한 칸의 차이

같은 원리가 + 오브젝트에도 적용된다:

[+ 0] (왼쪽)은 결과를 정수로 잘라서 18로 출력, [+ 0.] (오른쪽)은 소수를 유지해 18.74로 출력

Symbol (문자열)

Symbol은 텍스트 데이터이다. 오브젝트의 이름이나 명령어, 파일 경로 등을 전달할 때 사용된다. 예를 들어 [sfplay~]open 명령을 보내면 파일 선택 대화상자가 열리는데, 이 open이 바로 Symbol이다.

List (리스트)

List는 여러 개의 데이터를 하나로 묶은 것이다. 정수, 소수, 문자열을 자유롭게 섞어서 구성할 수 있다. 예를 들어 60 100은 두 개의 정수로 이루어진 리스트이고, apple 3.14 42는 문자열과 숫자가 섞인 리스트이다.

리스트는 Max에서 매우 중요한 데이터 구조이다. MIDI 데이터, 좌표값, 시퀀서 패턴 등 복수의 값을 한 번에 다뤄야 하는 상황에서 필수적으로 사용된다. 리스트를 만들 때는 [pack]이나 [pak] 오브젝트가 자주 쓰이는데, 두 오브젝트의 차이는 S02에서 더 깊게 다룬다.

Bang

Bang은 EP02에서 배운 것처럼 실제 값을 담고 있지 않은 신호이다. 오로지 “실행하라”는 명령만 전달한다. 메세지 안에서는 b로 축약하여 포함할 수 있다.

MSP Signal (오디오 신호)

MSP Signal은 다른 모든 데이터 타입과 근본적으로 다르다. 일반 Max 데이터(Control Rate)는 이벤트가 발생할 때만 값이 전달되지만, MSP Signal(Audio Rate)은 DSP가 켜져 있는 동안 매 샘플마다 끊임없이 값이 흘러간다. 44.1kHz 기준으로 초당 44,100번이다.

MSP Signal은 32비트 부동소수점 값을 가지며, 오디오 출력 시에는 -1에서 +1 사이의 범위를 사용한다. 이 범위를 넘어가면 클리핑(Clipping)이 발생하여 소리가 찌그러진다.

데이터 타입 요약

타입설명예시범위
Int정수42, -7, 032비트 (-2^31 ~ 2^31-1)
Float부동소수점3.14, -0.532비트 (±3.4e+38)
Symbol문자열”open”, “hello”자유
List복합 데이터60 100, apple 3.14자유
Bang트리거(값 없음)-
Signal오디오 데이터연속적 부동소수점DAC 출력 시 -1~+1

핵심 오브젝트 정리

오브젝트역할
[number] / [flonum]정수 / 소수 입력 및 표시
[message]데이터 및 명령어 전달
[print]데이터 값과 타입 확인
[pack] / [pak]개별 값을 리스트로 묶기

직접 해보기

  1. [/ 3][/ 3.]에 각각 10을 보내서 결과 차이를 확인해보자
  2. Message 박스에 hello 42 3.14를 입력하고 print로 보내 리스트 출력을 확인해보자
  3. 정수형 numberbox에 3.9를 보내서 truncation이 일어나는 것을 직접 확인하자

다음 에피소드 예고

다음 에피소드에서는 Max의 가장 중요한 규칙인 “오른쪽에서 왼쪽으로” 실행 순서를 자세히 배운다. 왜 같은 연결이라도 순서에 따라 결과가 달라지는지 이해하게 된다.

자주 묻는 질문

  • [/ 3]에 10을 보내니 3.333이 아니라 3이 나옵니다. 왜 그런가요?

    Max는 오브젝트의 인자 형태로 데이터 타입을 결정합니다. [/ 3]처럼 인자가 정수면 모든 연산이 정수 모드로 처리되어 소수점 이하가 잘려나갑니다(반올림이 아니라 무조건 내림). 소수 결과를 얻으려면 인자에 점을 붙여 [/ 3.]으로 써야 합니다. 같은 원리로 [+ 0]은 정수, [+ 0.]은 소수 모드입니다. 이 점 하나의 차이가 결과를 완전히 바꾸므로 항상 주의해야 합니다.

  • Control Rate와 Audio Rate(MSP Signal)의 차이는 무엇인가요?

    일반 Max 데이터(Int, Float, List 등)는 컨트롤 레이트로, 사용자가 클릭하거나 다른 오브젝트가 출력하는 '이벤트가 발생한 순간'에만 값이 흐릅니다. 반면 MSP Signal은 오디오 레이트로 DSP가 켜진 동안 매 샘플마다(44.1kHz 기준 초당 44,100번) 연속적으로 32비트 부동소수점 값이 흐릅니다. 그래서 같은 패치코드를 봐도 일반 신호는 가끔 한 번씩, MSP는 끊임없이 흐른다고 생각하면 됩니다. 오디오 출력 시 -1~+1 범위를 벗어나면 클리핑이 발생합니다.

  • 정수 numberbox에 3.9를 보내면 어떻게 되나요?

    값이 3으로 잘려서 표시됩니다. 정수형 numberbox는 소수점 이하를 truncation(절단)으로 처리하기 때문에 3.9든 3.1이든 모두 3이 됩니다. 반올림이 아니라는 점이 중요합니다. 소수가 필요하면 [flonum] 오브젝트를 사용하거나 numberbox의 인스펙터에서 'Format'을 'Decimal (Float)'로 바꾸면 됩니다.

  • Symbol과 String은 같은 건가요?

    거의 같지만 Max에서는 'Symbol'이라는 용어를 씁니다. Symbol은 문자열 데이터로 오브젝트의 이름, 명령어, 파일 경로 등을 표현합니다. 예를 들어 [sfplay~]에 'open'을 보내 파일 다이얼로그를 열거나, 'read drum.wav'처럼 명령+인자 형태로 메시지를 보낼 때의 첫 번째 단어가 모두 Symbol입니다. 일반 프로그래밍 언어의 string과 달리 Max에서는 동일한 문자열은 메모리상 같은 객체로 공유(interning)되어 비교가 매우 빠릅니다.

실습 패치 다운로드

Max 8 이상에서 열어주세요. 파일을 Max로 드래그하거나 더블클릭하면 실행됩니다.

공식 문서 참조

YouTube

채널에서 더 많은 Max/MSP 예제를 이어서 보세요

튜토리얼의 흐름을 끊지 않고, 실제 영상 데모와 채널 콘텐츠를 연속해서 확인할 수 있습니다.

카톡 문의