Media Art ProgrammingWeek 04 · Period 01 Handout

p5.js / Media Art Programming

4주차 1교시 — if/else 조건문

Conditionals and Interaction 주제의 학생용 강의 자료입니다.

WEEK 04 PERIOD 01 P5.JS MEDIA ART

4주차 1교시 — if/else 조건문

강의 아웃라인: week-04-outline 다음 교시: week-04-period2-student (마우스·키보드 인터랙션)

항목 내용
대상 P5.js 입문자 (테크아트 전공)
소요 시간 50분 (45분 + 버퍼 5분)
핵심 도구 P5.js Web Editor
학습 목표
  • if/else 조건문의 구조를 이해하고 활용할 수 있습니다
  • 비교 연산자(>, <, ===, !==)와 논리 연산자(&&, ||, !)를 사용할 수 있습니다
  • dist() 함수로 원형 영역 판별을 구현할 수 있습니다
  • for문과 조건문을 결합해 조건부 패턴을 만들 수 있습니다

도입

실습과제 1 제출 확인

실습과제 1(P5.js Web Editor 링크 공유)을 아직 제출하지 않았다면 오늘 안으로 제출하세요. 제출하면 만점입니다.

3주차 연결

3주차에서 for문으로 무지개 원, 격자, 그라데이션 같은 다양한 패턴을 만들었습니다. 그런데 그 패턴은 항상 같은 방식으로 그려집니다. 실행할 때마다 같은 그림이 나옵니다.

만약 마우스를 왼쪽에 놓으면 파란색, 오른쪽에 놓으면 빨간색이라면? 만약 키보드를 누르면 도형이 원에서 사각형으로 바뀐다면?

‘만약 ~하면’을 코드로 표현하는 것이 바로 조건문입니다. 영어 키워드는 if입니다.

인터랙티브 미디어아트 사례

인터랙티브 미디어아트는 관객이 무언가를 하면 작품이 반응하는 설치 작품입니다. 여러 작품에서 오늘 배울 조건문과 비슷한 판단 구조를 발견할 수 있습니다.

사례 1: Steve Zafeiriou — “Sensorify” (2023) 카메라가 관객의 표정을 실시간으로 읽어서, 감정에 따라 다른 제너레이티브 비주얼을 생성합니다. 코드로 생각하면 if (표정 === "웃음") { 따뜻한 색상 } else if (표정 === "슬픔") { 차가운 톤 }처럼 표현할 수 있습니다. 뇌파(EEG) 센서까지 활용한 작품으로, MOMus 현대미술관(그리스)에 전시되었습니다. 링크: Sensorify — Steve Zafeiriou

사례 2: 사일로랩(SILO Lab) — 몰입형 인터랙티브 설치 (한국) 사일로랩은 한국의 크리에이티브 스튜디오입니다. “묘화”는 관객이 다가가면 백열등이 반응하고, “풍화”는 300개 랜턴이 움직임에 따라 변화합니다. 코드로 생각하면 if (관객 거리 < 임계값) { 조명 밝게 } else { 천천히 페이드 }와 같은 구조입니다. 국립아시아문화전당, 덕수궁, 서울시립미술관 등에서 전시했습니다. 링크: SILO Lab 공식 사이트

사례 3: Jeffrey Roe — “Stopping Time” (2025) 영상이 재생되다가 관객이 앞에 서면 화면이 꺼집니다. 관객이 떠나면 다시 재생됩니다. 이 작품의 코드 핵심은 if (personDetected) { stopVideo(); } else { playVideo(); }처럼 표현할 수 있습니다. 라즈베리파이와 PIR 센서로 만든 미니멀한 설치 작품입니다. 링크: Stopping Time — Tog Hackerspace

사례 4: “Compositions in Code” 전시 (2025, 뉴욕) Museum of the Moving Image에서 열린 Processing/p5.js 전시입니다. 우리가 배우는 도구로 만든 작품들을 다룹니다. p5.js 아티스트 Aleksandra Jovanic, Processing 선구자 Marius Watz 등 6인의 작품이 전시되었습니다. 링크: Compositions in Code — MoMI

이 작품들의 공통점은 — 표정 감지든, 거리 센서든, 마우스 클릭이든 전부 ‘만약 ~하면’이라는 조건 판단이 핵심이라는 것입니다. 오늘 배울 if문 하나만 알면, 이런 인터랙티브 스케치의 첫 발을 뗄 수 있습니다.


핵심 개념 1 — if문 기본 구조

일상 비유

조건문은 우리가 매일 쓰는 논리입니다.

일상 언어 코드
“만약 비가 오면 → 우산을 쓴다” if (비가 온다) { 우산을 쓴다; }
“만약 배고프면 → 밥을 먹는다” if (배고프다) { 밥을 먹는다; }

프로그래밍에서도 같은 구조를 사용합니다. 만약 (조건이 맞으면) { 이 코드를 실행한다 }

문법

if (조건) {
  실행할 코드
}

괄호 () 안에 조건을 쓰고, 중괄호 {} 안에 실행할 코드를 씁니다. 조건이 맞으면(true) 중괄호 안이 실행되고, 안 맞으면(false) 건너뜁니다.

실행 흐름 시각화:

코드 실행 →  조건 확인
              │
         ┌────┴────┐
         │         │
       true      false
         │         │
     { 실행 }   건너뜀
         │         │
         └────┬────┘
              │
         다음 코드로 →

코드는 위에서 아래로 쭉 가다가 if를 만나면 갈림길이 생깁니다. 조건에 따라 한쪽 길만 갑니다.

비교 연산자

조건을 만들려면 값을 비교해야 합니다.

연산자 의미 예시 결과
> 크다 5 > 3 true
< 작다 5 < 3 false
>= 크거나 같다 5 >= 5 true
<= 작거나 같다 3 <= 5 true
=== 같다 5 === 5 true
!== 같지 않다 5 !== 3 true
등호 3개 주의

===는 등호가 3개입니다. 2주차에서 =값을 넣는 것(대입)이라고 배웠습니다. let x = 5에서 =는 ‘5를 x에 넣어라’. 그런데 ===는 ’같은지 비교해라’입니다.

기호 의미 배운 시기
= 값 대입 (넣기) 2주차
=== 같은지 비교 (확인) 4주차 (오늘)

흔한 실수 — = 하나만 쓰기

//  잘못된 코드 — = 하나만 쓴 경우
if (mouseX = 200) {   // 이건 '200을 mouseX에 넣어라'라는 대입이 됩니다!
  background(255, 0, 0);
}

//  올바른 코드 — === 세 개
if (mouseX === 200) {  // 'mouseX가 200과 같은지 비교해라'
  background(255, 0, 0);
}

실수로 =을 쓰면 문법 오류가 나지 않아도 의도와 다르게 동작할 수 있습니다. 이런 문제가 생기면 먼저 ====를 확인하세요.

P5.js 첫 예시: 마우스 위치에 따른 배경색

2주차에서 배운 mouseX가 다시 등장합니다. 마우스 위치는 계속 바뀌니까 매 프레임 확인해야 합니다. 그래서 setup()이 아니라 draw() 안에 씁니다.

function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(220);  // 기본: 회색

  if (mouseX > 200) {
    background(255, 0, 0);  //  마우스가 오른쪽이면 빨강!
  }
}

실행 결과: - 마우스를 캔버스 왼쪽(x < 200)에 놓으면 → 회색 배경 - 마우스를 캔버스 오른쪽(x > 200)에 놓으면 → 빨간 배경

확인 질문

if (mouseY > 200)으로 바꾸면 어떻게 될까요?

: 마우스가 아래쪽에 있을 때 빨간 배경이 됩니다. y좌표로 비교하니까요.

코드 실행 추적 (mouseX = 250일 때):

1. background(220)  → 먼저 회색으로 칠함
2. mouseX > 200?    → 250 > 200 → true!
3. background(255, 0, 0) → 빨간색으로 다시 칠함 (회색을 덮어씀)

코드 실행 추적 (mouseX = 100일 때):

1. background(220)  → 먼저 회색으로 칠함
2. mouseX > 200?    → 100 > 200 → false
3. { } 안의 코드 건너뜀 → 회색 유지

이렇게 한 줄씩 추적하는 것을 트레이싱(tracing)이라고 합니다. 코드가 예상대로 안 될 때, 한 줄씩 따라가면 어디서 틀렸는지 찾을 수 있습니다.


핵심 개념 2 — if/else와 else if

if/else — “둘 중 하나”

’왼쪽이면 파랑, 오른쪽이면 빨강’처럼 둘 중 하나를 선택하고 싶으면 else를 씁니다.

function setup() {
  createCanvas(400, 400);
}

function draw() {
  if (mouseX > width / 2) {
    background(255, 0, 0);  // 오른쪽: 빨강
  } else {
    background(0, 0, 255);  // 왼쪽: 파랑
  }
}

if (조건) { A } else { B } — 조건이 맞으면 A, 아니면 B. 반드시 둘 중 하나만 실행됩니다.

         조건 확인
           │
      ┌────┴────┐
      │         │
    true      false
      │         │
   { A 실행 }  { B 실행 }
      │         │
      └────┬────┘
           │
      다음 코드 →

if만 쓰면 false일 때 아무것도 안 하지만, if/else를 쓰면 false일 때 B를 실행합니다.

width / 2를 썼는데, width는 캔버스 너비(400)니까 width / 2는 200입니다. 숫자 200을 직접 쓰는 것보다 width / 2가 좋습니다 — 캔버스 크기를 바꿔도 자동으로 가운데가 되니까요.

else if — “세 가지 이상”

세 가지로 나누고 싶으면 else if를 추가합니다.

function setup() {
  createCanvas(400, 400);
}

function draw() {
  if (mouseX < width / 3) {
    background(255, 0, 0);    // 왼쪽 1/3: 빨강
  } else if (mouseX < width * 2 / 3) {
    background(0, 255, 0);    // 가운데 1/3: 초록
  } else {
    background(0, 0, 255);    // 오른쪽 1/3: 파랑
  }
}

캔버스를 세 영역으로 나누고, 마우스가 어디에 있느냐에 따라 다른 배경색이 나옵니다. else if를 더 추가하면 4등분, 5등분도 가능합니다. (단, else if가 많아지면 코드가 길어집니다. 그럴 때는 6주차에서 배울 ’배열’로 더 간결하게 처리할 수 있습니다.)

확인 질문

else if 없이 if를 세 번 연속 쓰면 같을까요?

: 다릅니다. if-else if-else는 하나만 실행되는데, if를 세 번 쓰면 조건이 맞는 것 전부 실행됩니다. 지금은 if-else if-else를 쓰세요.


핵심 개념 3 — boolean과 논리 연산자

true와 false

조건문의 괄호 안은 항상 결과가 true 아니면 false입니다. 이것을 boolean(불리언)이라고 합니다.

mouseX > 200    // → true 또는 false
5 === 5         // → true
3 > 10          // → false

조건이 true면 실행, false면 건너뜀.

논리 연산자: 여러 조건 조합하기

조건 하나로는 부족할 때가 있습니다. ‘마우스가 이 영역 안에 있는지’ 확인하려면 조건이 여러 개 필요합니다.

연산자 이름 의미 예시
&& AND (“그리고”) 둘 다 true여야 true A && B
\|\| OR (“또는”) 하나만 true여도 true A \|\| B
! NOT (“아님”) true ↔ false 반전 !A

진리표:

A B A && B A \|\| B
true true true true
true false false true
false true false true
false false false false

AND(&&)는 둘 다 true여야 true. OR(||)은 하나만 true여도 true. 일상으로 비유하면 — ’밥도 먹 숙제도 해야 외출 가능’은 &&, ’전화하거나 문자하면 연락 성공’은 ||.

실용 예시: 사각형 영역 판별

‘마우스가 이 사각형 안에 있는지’ 판별하려면 조건 4개를 &&로 연결합니다.

function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(220);

  // 사각형 영역 표시 (x: 100~300, y: 100~300)
  stroke(0);
  noFill();
  rect(100, 100, 200, 200);

  // 마우스가 사각형 안에 있는지?
  if (mouseX > 100 && mouseX < 300 && mouseY > 100 && mouseY < 300) {
    fill(255, 0, 0);  // 안에 있으면: 빨강
  } else {
    fill(200);         // 밖이면: 회색
  }
  noStroke();
  ellipse(mouseX, mouseY, 30, 30);
}

x가 100보다 크고 그리고 300보다 작고 그리고 y가 100보다 크고 그리고 300보다 작을 때. 네 개 다 만족해야 true입니다. AND(&&)는 하나라도 false가 나오면 전체가 false입니다.


핵심 개념 4 — dist()로 영역 판별

사각형은 && 4개로 했는데, 원형 영역은 어떻게 할까요? dist() 함수를 씁니다.

dist() — 두 점 사이 거리

dist(x1, y1, x2, y2)

두 점 사이의 거리를 계산해줍니다. dist(0, 0, 3, 4) → 5. 마우스와 원 중심 사이 거리를 재서, 반지름보다 작으면 ’안에 있다’고 판단합니다. 수학 시간에 배운 피타고라스 정리(직각삼각형 빗변 길이)를 dist() 한 줄이 해결해줍니다.

dist()와 피타고라스 정리|697
function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(220);

  // 원 영역 표시 (중심: 200,200 / 반지름: 50)
  stroke(0);
  noFill();
  ellipse(200, 200, 100, 100);

  // 마우스가 원 안에 있는지?
  if (dist(mouseX, mouseY, 200, 200) < 50) {
    fill(0, 200, 0);  // 안에 있으면: 초록
  } else {
    fill(200);         // 밖이면: 회색
  }
  noStroke();
  ellipse(mouseX, mouseY, 30, 30);
}

사각형은 && 4개가 필요했는데, 원은 dist() 한 줄이면 됩니다.

영역 판별 방법 조건
사각형 && 4개 mouseX > 좌 && mouseX < 우 && mouseY > 상 && mouseY < 하
원형 dist() 1개 dist(mouseX, mouseY, 중심x, 중심y) < 반지름
dist()로 원형 영역 판별|659
지름 vs 반지름

ellipse(200, 200, 100, 100)에서 100은 지름이고, dist()와 비교하는 50은 반지름입니다. ellipse는 지름을 받고, 거리 비교는 반지름으로 합니다 (지름 ÷ 2 = 반지름).

이 패턴은 나중에 버튼 만들기에 유용합니다. ‘이 원을 클릭했는지’ 감지하는 데 씁니다.


핵심 개념 5 — for문 + 조건문 결합

3주차의 for문과 4주차의 if문이 만나면 패턴에 변화를 줄 수 있습니다.

짝수/홀수 — % 나머지 연산자

먼저 새 연산자 하나 — % 나머지 연산자.

연산 결과 해석
0 % 2 0 0을 2로 나눈 나머지 = 0 (짝수)
1 % 2 1 1을 2로 나눈 나머지 = 1 (홀수)
2 % 2 0 짝수
3 % 2 1 홀수
4 % 2 0 짝수

% 2의 결과가 0이면 짝수, 1이면 홀수. for문에 넣으면 짝수 번째·홀수 번째를 구분할 수 있습니다.

function setup() {
  createCanvas(400, 400);
  background(240);
  noStroke();

  for (let i = 0; i < 10; i++) {
    if (i % 2 === 0) {
      fill(255, 0, 0);   //  짝수 번째: 빨강
    } else {
      fill(0, 0, 255);   //  홀수 번째: 파랑
    }
    ellipse(i * 40 + 20, 200, 30, 30);
  }
}

실행 결과:

  (빨강-파랑 교대)

조건문을 넣으니까 번갈아 다른 색을 줄 수 있습니다.

체스판 패턴: 중첩 for + if

2차원으로 확장하면 체스판이 됩니다.

function setup() {
  createCanvas(400, 400);
  noStroke();

  for (let x = 0; x < 8; x++) {
    for (let y = 0; y < 8; y++) {
      if ((x + y) % 2 === 0) {
        fill(240);   // 흰 칸
      } else {
        fill(60);    // 검은 칸
      }
      rect(x * 50, y * 50, 50, 50);
    }
  }
}

(x + y)가 짝수면 흰 칸, 홀수면 검은 칸. 3주차의 for문 + 4주차의 if문이 만나면 체스판처럼 규칙적이면서도 변화 있는 패턴을 만들 수 있습니다.

확인 질문

체스판을 흑백이 아니라 빨강/파랑 체스판으로 바꾸려면 무엇을 수정하면 될까요?

: fill(240)fill(255, 0, 0), fill(60)fill(0, 0, 255)로 바꾸면 됩니다.


예제

예제 1 — 캔버스 4등분 배경색 (if/else if/else)

function setup() {
  createCanvas(400, 400);
}

function draw() {
  if (mouseX < width / 2 && mouseY < height / 2) {
    background(255, 0, 0);    // 왼쪽 위: 빨강
  } else if (mouseX >= width / 2 && mouseY < height / 2) {
    background(0, 255, 0);    // 오른쪽 위: 초록
  } else if (mouseX < width / 2 && mouseY >= height / 2) {
    background(0, 0, 255);    // 왼쪽 아래: 파랑
  } else {
    background(255, 255, 0);  // 오른쪽 아래: 노랑
  }

  // 가이드 선
  stroke(0);
  strokeWeight(2);
  line(width / 2, 0, width / 2, height);
  line(0, height / 2, width, height / 2);
}

마우스를 움직여보면 4개 영역마다 다른 색이 나옵니다. &&로 x, y 조건을 동시에 쓴 것입니다.

예제 2 — 체스판 패턴 (for + if)

체스판에 HSB 색상을 입힙니다.

function setup() {
  createCanvas(400, 400);
  colorMode(HSB, 360, 100, 100);
  noStroke();

  for (let x = 0; x < 8; x++) {
    for (let y = 0; y < 8; y++) {
      if ((x + y) % 2 === 0) {
        fill((x + y) * 20, 80, 100);   // 짝수 칸: 색상 있는 칸
      } else {
        fill(0, 0, 20);                // 홀수 칸: 어두운 칸
      }
      rect(x * 50, y * 50, 50, 50);
    }
  }
}

흑백 체스판 대신 색상 있는 칸 + 어두운 칸으로 구성된 체스판입니다. 3주차 HSB + 4주차 조건문을 합친 것입니다.

예제 3 — 마우스 근처 도형만 색상 변화 (dist() 활용)

function setup() {
  createCanvas(400, 400);
}

function draw() {
  background(240);
  noStroke();

  for (let i = 0; i < 10; i++) {
    let x = i * 40 + 20;
    let y = 200;

    if (dist(mouseX, mouseY, x, y) < 30) {
      fill(255, 0, 0);   //  마우스 가까이: 빨강
    } else {
      fill(200);          // 멀리: 회색
    }
    ellipse(x, y, 30, 30);
  }
}

실행 결과: - 10개 원 중 마우스에 가까운 원만 빨간색으로 바뀜 - 마우스 위치에 따라 빨간 원이 바뀜

3주차 for문 패턴에 dist()를 넣어 마우스에 반응하는 패턴을 만들었습니다.


정리

개념 의미 문법
if 만약 ~하면 if (조건) { 실행 }
else 아니면 if (조건) { A } else { B }
else if 아니면 만약 ~하면 if (A) { } else if (B) { } else { }
연산자 종류 예시
>, <, >=, <=, ===, !== 비교 연산자 mouseX > 200
&&, \|\|, ! 논리 연산자 mouseX > 100 && mouseX < 300
% 나머지 연산자 i % 2 === 0 (짝수 판별)

그리고 dist() — 두 점 사이 거리 계산. 원형 영역 판별에 씁니다.

2교시 예고

조건문으로 ‘판단’은 할 수 있게 됐습니다. 그런데 아직 ’마우스를 클릭했을 때’ 같은 입력은 다루지 않았습니다. 2교시에서는 마우스 클릭과 키보드 입력을 배웁니다. 조건문과 합치면 ‘클릭하면 색이 바뀌는’, ‘키보드를 누르면 도형이 달라지는’ 인터랙티브 스케치를 만들 수 있습니다.