본 도구에서 사용하는 오픈소스 라이브러리

본 도구의 코드에는 1개의 오픈소스 라이브러리가 포함되어 있습니다.

Scratch 치트시트 — 간결한 참고서

Scratch 3 블록형 프로그래밍 치트시트: 변수, 리스트, 복제본, 브로드캐스트와 9가지 블록 분류를 다루며, 초보자가 게임, 애니메이션, 이야기 제작에 활용할 수 있는 내용을 망라합니다.

S3

Scratch Scratch 3.0 (online editor)

Scratch 3 (블록 기반) · 이벤트 기반 · 시각화 · 단일 스레드 협업 · 동적 (약형 변수)

추천 학습 경로

먼저 첫 프로그램을 조립하세요: 초록색 깃발로 시작 + 말하기 블록 → 변수와 리스트, 흐름 제어(조건 / 반복) 익히기 → 탐지 블록으로 키보드와 마우스를 읽고, 브로드캐스트로 스프라이트끼리 대화하기 → 사용자 정의 블록으로 코드를 정리하고 복제본으로 다중 스프라이트 만들기 → 마지막으로 FAQ 챕터에서 흔한 실수를 피하고, 타이머로 시간을 재며 클라우드 변수에 기록을 남기는 법을 익히세요.

1.Hello World 와 시작점

초록 깃발에서 시작하는 첫 번째 프로그램: 스프라이트가 말하고, 모양과 배경을 바꾸며, 아홉 가지 블록 카테고리를 알아봅니다.

최소 프로그램

초록 깃발을 눌러 스프라이트가 말하게 하는 것은 모든 Scratch 프로젝트의 출발점입니다. 최소 프로그램은 이벤트와 형태 블록 두 가지 범주만 있으면 됩니다.

1
2
when green flag clicked
say (Hello, world!) for (2) seconds

초록 깃발로 시작하기

초록 깃발 블록은 프로젝트 전체의 시작 스위치입니다. 무대 위의 초록 깃발을 클릭하면 여기에서 시작하는 모든 스크립트가 동시에 실행되고, 빨간색 정지 버튼을 누르면 모두 멈춥니다.

1
2
3
4
5
when green flag clicked
forever
move (10) steps
if on edge, bounce
end

스프라이트가 말하기

말하기와 생각하기 블록은 스프라이트가 말풍선 안에 글자를 표시하게 하며, 가장 직관적인 출력 방법입니다. 초를 지정하면 그만큼 머무른 뒤 사라지고, 지정하지 않으면 계속 표시됩니다.

1
2
3
4
when green flag clicked
say (你好,我是小猫!) for (2) seconds
think (接下来要做什么呢…) for (2) seconds
say (点击我开始!)

모양 바꾸기

각 스프라이트는 여러 모양을 가질 수 있으며, 모양을 바꾸면 걷기나 눈 깜빡이기 같은 애니메이션을 만들 수 있습니다. 다음 모양 블록은 순서대로 순환합니다.

1
2
3
4
5
when green flag clicked
forever
next costume
wait (0.2) seconds
end

배경 바꾸기

무대 배경은 장면과 같으며, 이야기에 따라 바꿀 수 있습니다. "배경이 ~로 바뀌었을 때" 블록과 함께 사용하면 배경마다 다른 스크립트를 실행할 수 있습니다.

1
2
3
4
when green flag clicked
switch backdrop to (森林)
wait (3) seconds
switch backdrop to (城堡)

아홉 가지 블록 카테고리

블록은 기능에 따라 아홉 가지로 나뉘며, 색상이 모두 다릅니다: 동작 파랑, 형태 보라, 소리 분홍, 이벤트 노랑, 제어 주황, 감지 청록, 연산 초록, 변수 주황, 내 블록.

1
2
3
4
5
// 이벤트(노랑) 제어(주황) 동작(파랑) 형태(보라) 소리(핑크)
// 감지(청록) 연산(초록) 변수(주황) 내 블록(보라)
// 왼쪽 패널에서 블록을 중앙 스크립트 영역으로 드래그해서 조립
when green flag clicked
say (欢迎来到 Scratch!)

스크립트는 위에서 아래로

같은 스크립트는 위에서 아래로 블록 단위로 실행되며, 앞 블록이 끝나야 다음 블록이 실행됩니다. 순서가 동작의 선후를 결정합니다.

1
2
3
4
5
when green flag clicked
move (100) steps
turn right (90) degrees
move (100) steps
// 먼저 직진, 다음에 우회전, 다시 직진

저장과 공유

로그인하면 프로젝트가 클라우드에 자동으로 저장됩니다. "파일" 메뉴에서 컴퓨터로 다운로드할 수 있고, 오른쪽 위 "공유"를 누르면 웹사이트에 게시되어 누구나 온라인으로 즐길 수 있습니다.

1
2
3
4
// 파일 메뉴에서「컴퓨터에 저장」또는「컴퓨터에서 업로드」
// 로그인하면 프로젝트가 자동으로 클라우드에 저장됨
// 오른쪽 위「공유」를 누르면 Scratch 사이트에 공개 가능
// 남이 내 작품을 실행하는 건 온라인 실행이라 다운로드 불필요

2.변수와 상수

변수 만들기, 값 설정과 변경, 표시 및 숨기기, 그리고 클라우드 변수와 로컬 변수를 다룹니다.

변수 만들기

"변수" 카테고리에서 "변수 만들기"를 클릭하고 이름(예: 점수)을 입력하세요. 변수는 상자와 같아서 숫자, 문자열, 불 값을 저장할 수 있습니다.

1
2
3
4
// 변수 카테고리 > 변수 만들기 > 이름 입력:점수
set [分数 v] to (0)
set [姓名 v] to (小猫)
set [胜利 v] to (false)

설정과 변경

「정하기」는 변수를 특정 값으로 설정하고, 「바꾸기」는 현재 값에 더하거나 뺍니다. 점수와 생명력은 모두 「바꾸기」 블록으로 갱신합니다.

1
2
3
4
set [分数 v] to (0)
change [分数 v] by (10) // 점수는 10이 됨
change [分数 v] by (-5) // 점수는 5가 됨
set [分数 v] to (100) // 직접 100으로 설정

표시와 숨기기

변수는 기본적으로 무대 왼쪽 위에 표시되며 위치를 드래그할 수 있습니다. 보기 싫은 변수는 숨기기 블록으로 가려 화면을 깔끔하게 유지하세요.

1
2
3
4
set [分数 v] to (0)
show variable [分数 v]
wait (2) seconds
hide variable [分数 v]

리스트 변수

리스트는 많은 데이터를 담을 수 있는 변수로, 일렬로 늘어선 상자와 같습니다. 요소를 추가, 삭제하고 특정 위치의 값을 읽을 수 있습니다.

1
2
3
4
5
6
add (苹果) to [水果 v]
add (香蕉) to [水果 v]
add (西瓜) to [水果 v]
// 水果 = [苹果, 香蕉, 西瓜]
item (2) of [水果 v] // 香蕉
length of [水果 v] // 3

상수와 고정값

블록에 직접 입력한 숫자나 문자열이 바로 상수이며, 실행 중에 변하지 않습니다. 값이 바뀌어야 하는 데이터에만 변수를 사용하세요.

1
2
3
4
move (10) steps // 10은 상수
wait (1) seconds // 1은 상수
say (固定提示文字) // 문자열 상수
set [速度 v] to (10) // 상수를 변수에 저장

클라우드 변수

클라우드 변수는 데이터를 서버에 저장하며, 해당 프로젝트를 연 모든 사용자가 같은 데이터를 공유합니다. 순위표에 적합하지만 숫자만 지원합니다.

1
2
3
4
5
// 변수 만들 때「클라우드 변수」체크(로그인 필요, 숫자만)
set [最高分 v] to (分数)
if <(分数) > (最高分)> then
set [最高分 v] to (分数)
end

로컬 변수

기본적으로 변수는 프로젝트 전체에서 공유되지만, 변수를 만들 때 "이 스프라이트만 사용"을 선택하면 그 스프라이트만의 변수가 됩니다. 복제본은 각각 독립된 사본을 갖습니다.

1
2
3
// 변수 만들 때「이 스프라이트만」선택
when green flag clicked
set [私有值 v] to (0)

슬라이더 변수

무대 위의 변수 표시기를 마우스 오른쪽 버튼으로 클릭하면 슬라이더로 설정할 수 있으며, 마우스로 드래그해 실시간으로 값을 바꿀 수 있어 볼륨이나 속도 같은 조절 가능한 파라미터에 적합합니다.

1
2
3
4
// 변수 모니터 우클릭 > 슬라이더
// 범위(최솟값/최댓값)를 설정하고 드래그
set [音量 v] to (slider value)
set volume to (音量) %

3.데이터 형식

Scratch의 데이터는 숫자, 문자열, 불 값 세 가지 형식으로 나뉘며, 변수는 자동으로 형식을 추론합니다.

숫자

숫자는 블록의 흰색 동그란 구멍에 직접 입력하며, 양수, 음수, 소수 모두 가능합니다. 사칙연산 블록은 숫자를 반환합니다.

1
2
3
4
5
set [分数 v] to (100)
set [步长 v] to (0.5)
(10) + (5) // 15
(7) * (8) // 56
((分数) / (2)) // 50

문자열

문자열은 흰색 동그란 구멍이나 타원 구멍에 들어갑니다. 말하기, 생각하기, 리스트의 내용은 모두 문자열이 될 수 있습니다.

1
2
3
set [名字 v] to (小猫)
say (你好,我的名字是小猫)
join (苹果) (香蕉) // 苹果香蕉

불 값

비교와 논리 블록은 참(true) 또는 거짓(false)을 반환하며, 육각형 구멍에만 들어가서 판단 조건으로 사용됩니다.

1
2
3
4
<(分数) > (99)> // true 또는 false
<(分数) = (100)>
<<(a) > (0)> and <(b) > (0)>> // 둘 다 참이어야 참
<not <(分数) < (0)>>

리스트 요소

리스트 요소는 숫자일 수도 문자열일 수도 있으며, 읽을 때 번호로 n번째 항목을 가져옵니다. 요소 형식이 고정되어 있지 않아 섞어 저장할 수 있습니다.

1
2
3
4
add (100) to [数据 v]
add (小猫) to [数据 v]
item (1) of [数据 v] // 100
item (2) of [数据 v] // 小猫

자동 형식 추론

Scratch는 타입 선언을 강제하지 않아서 변수는 저장한 값 그대로가 되며, 언제든 다른 타입으로 바꿔 저장할 수 있습니다. 연산할 때 숫자와 문자는 자동으로 변환됩니다.

1
2
3
set [x v] to (10) // 숫자
set [x v] to (文字) // 문자열로 변경
set [x v] to (<(1) > (0)>) // 불리언

입력 형식

묻고 기다리기 블록은 사용자가 입력하게 하고, 답변 블록이 받는 값은 문자열입니다. 숫자로 사용하려면 연산 블록을 사용해 변환할 수 있습니다.

1
2
3
4
5
ask (你的年龄是几岁?) and wait
set [年龄 v] to (answer)
if <(年龄) > (6)> then
say (可以玩更复杂的游戏)
end

출력 형식

말하기, 생각하기 블록은 데이터를 보이는 글자로 바꿉니다. 연산 결과, 리스트 요소를 출력 블록에 직접 넣을 수 있습니다.

1
2
3
say (join (得分:) (分数))
say (join (item (1) of [排名 v]) ( 获得了第一名))
set volume to (音量) %

숫자와 문자열 변환

round는 반올림하여 정수로 만들고, mod는 나머지를 구합니다. 숫자가 문자열 연결에 참여하면 자동으로 문자열로 변환됩니다.

1
2
3
4
5
round (3.7) // 4
round (3.2) // 3
((10) mod (3)) // 1
// 숫자를 문자열에 직접 연결하면 자동 변환됨
say (join (分数:) (分数))

4.변수와 데이터 저장

변수와 리스트로 데이터를 저장하고, 복제본, 방송, 클라우드 변수를 통해 스프라이트 사이에 데이터를 전달합니다.

변수 저장

변수는 데이터의 "집"입니다. 먼저 값을 설정한 다음 사용합니다. 스크립트끼리 같은 변수를 읽고 써서 데이터를 공유하지만, 읽는 시점을 주의해야 합니다.

1
2
3
4
when green flag clicked
set [金币 v] to (0)
when this sprite clicked
change [金币 v] by (1)

리스트에 여러 값 저장

리스트는 한 번에 여러 데이터를 저장하며, 배열과 같습니다. 번호로 읽고 쓰며, 한 판의 모든 점수, 적 좌표 등을 기록하는 데 적합합니다.

1
2
3
4
5
delete (all) of [得分 v]
repeat (5)
add (pick random (0) to (100)) to [得分 v]
end
item (1) of [得分 v]

복제본이 데이터 보유

복제본은 스프라이트의 모든 스크립트와 변수를 복사합니다. 각 복제본의 "이 스프라이트만 사용" 변수는 독립적이며, 번호로 서로를 구분할 수 있습니다.

1
2
3
4
5
when green flag clicked
create clone of (我自己)
create clone of (我自己)
when I start as a clone
go to x: (pick random (-200) to (200)) y: (pick random (-150) to (150))

개인 변수

"이 스프라이트만 사용"을 선택한 변수는 각 복제본에 하나씩 있어, 하나를 바꿔도 다른 복제본에 영향을 주지 않으며, 복제본을 구분하는 핵심입니다.

1
2
3
4
5
6
7
8
when green flag clicked
set [编号 v] to (0)
repeat (3)
change [编号 v] by (1)
create clone of (我自己)
end
when I start as a clone
say (join (我是克隆体) (编号))

클라우드 변수

클라우드 변수는 숫자를 서버에 동기화하며, 모든 플레이어가 같은 데이터를 공유합니다. 순위표, 온라인 대전에 적합하지만 값은 숫자만 가능합니다.

1
2
3
// 변수 만들 때「클라우드 변수」체크
when green flag clicked
set [在线人数 v] to (0)

방송으로 데이터 전달

방송 자체는 "메시지 이름"만 전달하므로, 데이터를 전달하려면 값을 전역 변수에 쓴 다음 방송하고, 수신 측은 그 변수를 읽습니다.

1
2
3
4
5
when green flag clicked
set [得分 v] to (100)
broadcast (游戏结束)
when I receive (游戏结束)
say (join (最终得分:) (得分))

전역 변수와 로컬 변수

기본적으로 변수는 전역적으로 보입니다. 어떤 스프라이트의 스크립트든 읽고 쓸 수 있습니다. "이 스프라이트만 사용"을 선택하면 그 변수는 해당 스프라이트 또는 특정 복제본에만 속합니다.

1
2
3
4
// 전역 변수:모든 스프라이트에서 공유
set [总分 v] to (100)
// 지역 변수:이 스프라이트에서만 보임
set [自身速度 v] to (5)

데이터 영속성

변수는 프로젝트 실행 중에만 존재하며, 페이지를 새로 고치거나 프로젝트를 닫으면 비워집니다. 오래 보관하려면 클라우드 변수를 쓰거나 데이터를 정리해 내보내세요.

1
2
3
4
5
6
// 클라우드 변수:로그인 후 서버에 저장되어 오래 유지
// 데이터 내보내기:리스트 내용을 정리해 메모장에 복사
ask (要载入之前的记录吗?) and wait
if <(answer) = (是)> then
say (读取云变量最高分)
end

5.흐름 제어

조건 판단과 반복으로 스크립트의 흐름을 제어합니다. 만약, 반복, ~까지 반복, 기다리기, 멈추기를 다룹니다.

만약 판단

"만약 ~라면"은 조건을 만족할 때만 안쪽 블록을 실행합니다. 조건은 육각형 구멍이며, 비교나 논리 블록을 넣습니다.

1
2
3
if <(分数) > (99)> then
say (满分!)
end

만약-아니면

"만약 ~라면 ~아니면"은 둘 중 하나를 고릅니다. 조건이 성립하면 앞쪽을, 아니면 뒤쪽을 실행합니다. 승패나 스위치 상태 같은 판단에 적합합니다.

1
2
3
4
5
if <key (空格 v) pressed?> then
say (跳)
else
say (蹲下)
end

N번 반복

"N번 반복"은 안쪽 블록을 횟수만큼 반복하며, 칸씩 이동, 같은 그림 반복 그리기, 효과 여러 번 재생에 자주 쓰입니다.

1
2
3
4
repeat (10)
move (5) steps
end
// 이동 10회 × 5걸음 = 총 50걸음

무한 반복

"무한 반복"은 영원히 멈추지 않으며, 멈추기 블록이나 조건으로 종료합니다. 스프라이트 순찰, 배경 스크롤 같은 지속적 동작을 그 안에 넣습니다.

1
2
3
4
forever
move (10) steps
if on edge, bounce
end

~까지 반복

"~까지 반복"은 먼저 실행하고 나서 판단하며, 조건이 성립하면 멈춥니다. 사용자가 키를 누를 때까지 기다리기, 점수가 목표에 이를 때까지 기다리기 등에 적합합니다.

1
2
3
4
repeat until <key (空格 v) pressed?>
wait (0.1) seconds
end
say (终于按了空格!)

기다리기

"1초 기다리기"는 현재 스크립트를 잠시 멈추고, "~까지 기다리기"는 조건이 성립할 때까지 멈춥니다. 주의: 기다리기는 현재 스크립트만 멈추며, 다른 스크립트는 평소처럼 실행됩니다.

1
2
3
4
5
when green flag clicked
say (预备)
wait (1) seconds
say (开始!)
wait until <(计时器) > (10)>

스크립트 멈추기

"모두 멈추기"는 모든 스크립트를 끝내고, "이 스크립트 멈추기"는 현재 스크립트만 멈추며, "이 스프라이트의 다른 스크립트 멈추기"는 이 스크립트만 남깁니다.

1
2
3
4
5
6
when green flag clicked
forever
if <(生命值) < (1)> then
stop (all)
end
end

조합 논리

AND, OR, NOT은 여러 조건을 하나의 조건으로 결합한다. AND는 모두 참이어야 하고, OR은 최소 하나가 참이어야 하며, NOT은 반전한다.

1
2
3
4
5
6
if <<key (w v) pressed?> or <key (上 v) pressed?>> then
change y by (10)
end
if <<(分数) > (0)> and <(分数) < (100)>> then
say (分数在范围内)
end

6.사용자 정의 블록 (함수)

사용자 정의 블록은 반복되는 코드를 재사용 가능한 블록으로 묶어, 매개변수를 받거나 값을 반환할 수 있어 함수와 같다.

블록 만들기

「사용자 정의 블록」 분류에서 「새 블록 만들기」를 눌러 이름을 정하고 매개변수를 추가하면, 스크립트 영역에 define 블록이 나타난다. 여기에 로직을 작성한다.

1
2
3
4
define 跳跃
change y by (50)
wait (0.2) seconds
change y by (-50)

매개변수 사용

만들 때 숫자 또는 텍스트 입력을 추가하고, 호출할 때 서로 다른 값을 채워 넣는다. 매개변수는 지역 변수로 블록 내부에서만 유효하다.

1
2
3
4
5
6
7
define 画正方形 (边长)
repeat (4)
move (边长) steps
turn right (90) degrees
end
画正方形 (50)
画正方形 (100)

값 반환

사용자 정의 블록은 기본적으로 반환값이 없다. 결과를 「반환」하려면 변수에 결과를 저장한 뒤 호출 후 읽도록 한다.

1
2
3
4
define 计算平方 (n)
set [平方 v] to ((n) * (n))
计算平方 (7)
say (join (7 的平方是) (平方))

사용자 정의 블록 호출

정의한 뒤 필요한 곳에 호출 블록을 올려 놓으면 실행된다. 한 번 호출하면 블록 내부 스크립트가 한 번 실행된다.

1
2
3
4
5
define 打招呼 (名字)
say (join (你好,) (名字))
when green flag clicked
打招呼 (小猫)
打招呼 (小狗)

재귀

사용자 정의 블록은 자기 자신을 호출할 수 있다 (재귀). Scratch에는 스택 깊이 제한이 있으므로 너무 깊은 재귀는 피하고 반복문으로 바꾸는 편이 좋다.

1
2
3
4
5
6
define 数数 (n)
if <(n) > (0)> then
say (n)
数数 ((n) - (1))
end
数数 (3)

화면 새로 고침 안 함

사용자 정의 블록을 편집할 때 「실행 중 화면 새로 고침 안 함」을 체크하면 블록이 한 번에 즉시 실행되어, 대규모 리스트 연산과 빠른 계산에 적합하다.

1
2
3
// define 블록 편집 >「화면 새로고침 없이 실행」체크
define 批量处理
// 루프 안의 대량 계산을 한 프레임씩 그리지 않음

매개변수의 지역성

사용자 정의 블록의 매개변수는 블록 내부에서만 유효하지만, 블록 내부에서 새로 만든 변수는 기본적으로 전역에서 보이므로 외부 같은 이름 변수와 서로 덮어쓰지 않도록 주의한다.

1
2
3
define 加分 (amount)
change [分数 v] by (amount) // 전역 변수 수정
加分 (10)

재사용과 분리

일부 로직을 사용자 정의 블록으로 추출하면 여러 이벤트에서 반복해 호출할 수 있어, 코드가 깔끔해지고 디버깅도 쉬워진다.

1
2
3
4
5
6
7
define 重新开始
set [分数 v] to (0)
switch backdrop to (开始界面)
when green flag clicked
重新开始
when I receive (失败)
重新开始

7.문자열

연결, 문자 추출, 길이, 포함 등 문자열 연산을 지원해 간단한 텍스트 처리가 가능하다.

텍스트 연결

「(문자열) (문자열) 결합」은 두 문자열을 앞뒤로 이어 붙여 새로운 문자열 하나로 만들고, 안내 문구나 좌표 만들기에 자주 쓰인다.

1
2
3
join (你好,) (小猫) // 你好,小猫
join (X=) (x position) // 숫자를 문자열에 연결
say (join (得分:) (分数))

문자 추출

「N번째 글자」는 문자열에서 지정한 위치의 문자를 가져온다. 한국어도 한 글자씩 계산하며 공백도 한 문자로 센다.

1
2
3
letter (1) of (Scratch) // S
letter (2) of (Scratch) // c
length of (你好) // 2

문자열 길이

「(문자열)의 길이」는 문자 개수를 반환하며 영어, 공백, 한국어 모두 각각 한 개씩 센다. 빈 문자열 판별, 입력 길이 제한에 사용된다.

1
2
3
4
5
length of (Scratch) // 7
length of (你好世界) // 4
if <(length of (answer)) > (10)> then
say (太长了!)
end

포함 여부 확인

「(문자열)에 (문자열) 포함 여부」는 한 문자열에 다른 문자열이 들어 있는지 확인해 불리언 값을 반환한다. 키워드 검출에 활용할 수 있다.

1
2
3
4
<(Scratch 真有趣) contains (有趣)?> // true
if <(answer) contains (猫)> then
say (你喜欢猫)
end

위치 찾기

「N번째 글자」와 「(문자열)의 길이」를 함께 사용하면 손으로 찾기를 구현할 수 있다. 한 자리씩 비교해 위치를 반환한다.

1
2
3
4
5
6
7
set [位置 v] to (0)
repeat (length of (文本))
change [位置 v] by (1)
if <(letter (位置) of (文本)) = (目标)> then
say (join (找到位置:) (位置))
end
end

리스트로 분리

문자열을 한 글자씩 리스트에 저장해 글자 단위로 처리하기 쉽게 한다. 「반복 실행」과 함께 순회한다.

1
2
3
4
5
6
delete (all) of [字符表 v]
set [i v] to (1)
repeat (length of (文本))
add (letter (i) of (文本)) to [字符表 v]
change [i v] by (1)
end

빈 문자열 판별

「길이 = 0」이면 빈 문자열이다. 입력 칸을 비워 두면 answer는 빈 문자열이므로 먼저 판별한 뒤 사용해 오류를 피한다.

1
2
3
4
5
6
ask (输入你的名字) and wait
if <(length of (answer)) = (0)> then
say (名字不能为空)
else
say (join (你好,) (answer))
end

긴 텍스트 이어 붙이기

Scratch의 텍스트 블록은 한 줄 입력만 받으므로, 긴 텍스트는 여러 「결합」 블록으로 나눠 이어 붙인다. 쉼표와 공백은 그대로 유지된다.

1
say (join (第一行,) (join (第二行,) (第三行)))

8.리스트와 자료 구조

리스트는 Scratch의 핵심 자료 구조로, 추가·삭제·수정·조회, 순회, 2차원 모사를 지원한다.

리스트 만들기

「변수」 분류에서 「리스트 만들기」를 누르면 변수처럼 스크립트 패널에 나타난다. 무대의 리스트는 표시하거나 숨길 수 있다.

1
2
3
// 변수 카테고리 > 리스트 만들기 > 이름 입력:가방
add (苹果) to [背包 v]
show list [背包 v]

추가와 삭제

추가는 새 원소를 꼬리에 넣고, 삭제는 지정한 번호 또는 전체를 비운다. 삭제하면 번호가 자동으로 앞당겨진다.

1
2
3
4
5
add (苹果) to [背包 v]
add (盾牌) to [背包 v]
delete (1) of [背包 v]
// 背包 = [盾牌]
delete (all) of [背包 v]

원소 읽기

「N번째 원소」는 번호로 값을 가져오며 번호는 1부터 시작한다. 범위를 벗어난 번호는 오류 없이 빈 값을 반환한다.

1
2
3
4
5
add (金) to [宝箱 v]
add (银) to [宝箱 v]
item (1) of [宝箱 v] // 金
item (2) of [宝箱 v] // 银
item (5) of [宝箱 v] // 空

원소 바꾸기

「N번째 원소를 (값)으로 바꾸기」는 지정한 위치의 값을 바꾸며 길이는 변하지 않는다. 특정 칸의 아이템을 갱신할 때 적합하다.

1
2
3
add (旧药水) to [背包 v]
replace item (1) of [背包 v] with (新药水)
item (1) of [背包 v] // 新药水

원소 삽입

「N번째 위치에 (값) 삽입하기」는 새 원소를 지정한 위치에 넣고, 뒤따르는 원소는 자동으로 뒤로 밀린다.

1
2
3
4
add (苹果) to [背包 v]
add (梨) to [背包 v]
insert (西瓜) at (2) of [背包 v]
// 背包 = [苹果, 西瓜, 梨]

원소 찾기

「리스트에 (값) 포함 여부」는 특정 원소가 존재하는지 확인해 불리언 값을 반환한다. 먼저 확인하고 사용해 빈 값을 읽지 않도록 한다.

1
2
3
4
5
if <[背包 v] contains (钥匙)> then
say (你有一把钥匙)
else
say (没有钥匙,去找找吧)
end

리스트 순회

「~일 때까지 반복하기」에 번호 변수를 더해 리스트를 한 항목씩 처리하는 것이 반복 순회를 흉내 내는 일반적인 작성법입니다.

1
2
3
4
5
set [i v] to (1)
repeat until <(i) > (length of [背包 v])>
say (item (i) of [背包 v])
change [i v] by (1)
end

2차원 데이터 모사

리스트는 1차원이므로 「번호 = 행 × 열 수 + 열」로 2차원 표를 흉내 내 지도나 체스판을 만들 수 있다.

1
2
3
4
// 4행 3열 그리드, 칸 번호 1-12
set [编号 v] to (((行) * (3)) + (列))
add (格子内容) to [地图 v]
item (编号) of [地图 v]

9.프로젝트와 자원 관리

스프라이트 수, 리스트 크기, 클론본 한도를 관리해 프로젝트 성능을 최적화하고 끊김을 피한다.

클론본 한도

Scratch 프로젝트당 동시에 존재할 수 있는 클론본은 최대 300개다. 한도를 넘으면 가장 오래된 클론본이 자동으로 삭제된다.

1
2
3
4
5
6
// 클론 최대 300개, 무한 클론 피하기
when green flag clicked
set [计数 v] to (0)
repeat (10)
create clone of (我自己)
end

리스트 크기 제어

리스트가 무한히 커지면 프로젝트가 느려진다. 다 쓴 데이터는 즉시 지우거나 최대 개수를 제한한다.

1
2
3
4
add (新成绩) to [成绩 v]
if <(length of [成绩 v]) > (100)> then
delete (1) of [成绩 v]
end

스프라이트 수

스프라이트(객체)가 많을수록 매 프레임 계산할 일이 늘어난다. 같은 종류의 대상은 여러 스프라이트를 복제하기보다 클론을 우선 사용한다.

1
2
3
4
5
// 적 50마리:스프라이트 1개 + 클론 50번이 스프라이트 50개보다 빠름
when green flag clicked
repeat (50)
create clone of (敌人)
end

신호 폭주

매 프레임 신호를 보내는 등 짧은 시간에 많은 신호를 보내면 수신 스크립트가 계속 다시 시작해 프로젝트가 느려진다. 신호는 조건이 바뀔 때만 보낸다.

1
2
3
4
5
// forever 안에서 무작정 브로드캐스트하지 않음
// 위치가 바뀌었을 때만 브로드캐스트해서 메시지 폭주를 줄임
if <not <(x position) = (上一帧x)>> then
broadcast (位置)
end

변수 캐시

반복 계산한 결과는 변수에 저장해 매번 복잡한 연산을 하지 않도록 한다. 여러 번 쓰는 값은 미리 계산해 저장해 둔다.

1
2
3
4
5
// 한 번 계산해 여러 곳에서 재사용
set [距离 v] to ((x position) - (目标x))
if <(距离) < (50)> then
say (快到了)
end

스프라이트 목록 관리

무대 오른쪽 아래의 스프라이트 목록이 모든 객체를 표시한다. 끌어당겨 순서를 바꾸고, 우클릭으로 복사·내보내기·삭제할 수 있다.

1
2
// 스프라이트 썸네일 우클릭 > 복제/내보내기/삭제
// 복제된 스프라이트는 같은 스크립트를 가지며, 모양 바꿔 새 캐릭터로

성능 최적화

매 프레임 다시 그리기를 줄이고, 대량 리스트 연산을 피하며, 클론본과 입자 수를 제한하면 프로젝트가 더 매끄럽게 돌아간다.

1
2
3
4
5
6
7
// 깜빡임 줄이기:먼저 스프라이트 숨기고 한꺼번에 이동
hide
repeat (20)
change x by (5)
end
show
// 대량 계산은「화면 새로고침 없이 실행」의 내 블록에 넣기

의상과 소리 자원

모든 의상과 소리는 자원이므로 많을수록 프로젝트 파일이 커지고 로딩이 느려진다. 쓸모 없는 자원은 지우고, 가져오기 전에 이미지를 압축한다.

1
2
// 안 쓰는 모양과 소리 삭제해서 .sb3 크기 줄이기
// 이미지는 불러오기 전에 압축해서 로딩 시간 단축

10.스프라이트 곧 객체

모든 스프라이트는 객체이며, 자기만의 변수와 스크립트를 갖고 클론본이 곧 다중 인스턴스다.

스프라이트 곧 객체

스프라이트는 의상·변수·스크립트를 묶어 그 자체로 작은 객체다. 무대는 전역 컨테이너에 해당한다.

1
2
3
4
// 스프라이트「고양이」:변수 이름 + 스크립트
when green flag clicked
set [名字 v] to (小猫)
say (join (你好,) (名字))

클론본 곧 인스턴스

클론본은 스프라이트의 복제 인스턴스로, 의상과 전역 스크립트는 공유하지만 자기만의 위치·크기·개인 변수를 가진다.

1
2
3
4
5
6
when green flag clicked
repeat (3)
create clone of (我自己)
end
when I start as a clone
go to x: (pick random (-200) to (200)) y: (0)

신호 곧 메서드 호출

신호는 다른 「객체」에 메시지를 보내는 것과 같고, 수신 블록이 이를 처리한다. 객체 지향의 메시지 호출과 비슷하다.

1
2
3
4
5
when this sprite clicked
broadcast (受伤)
when I receive (受伤)
say (啊!)
change [生命 v] by (-1)

개인 속성

「이 스프라이트에만 사용」 변수가 곧 객체의 개인 속성이며, 클론본은 각각 독립적이어서 서로 간섭하지 않는다.

1
2
3
4
5
6
when green flag clicked
set [编号 v] to (1)
create clone of (我自己)
when I start as a clone
set [编号 v] to (2) // 이 클론만 변경
say (编号)

클론 재사용

스프라이트를 복제하면 같은 「템플릿」을 얻고, 스크립트나 변수만 바꾸면 동작이 다른 인스턴스를 파생할 수 있어 상속과 비슷하다.

1
2
3
4
5
6
7
// 적 템플릿 클론 → 각각 다른 속도 설정
when I start as a clone
set [速度 v] to (pick random (1) to (5))
forever
move (速度) steps
if on edge, bounce
end

상태와 동작

객체의 상태는 변수에 저장되고, 동작은 스크립트로 표현됩니다. 상태 변수를 판단해 어떤 동작 집합을 실행할지 결정합니다.

1
2
3
4
5
6
7
8
9
if <(状态) = (巡逻)> then
move (5) steps
if on edge, bounce
else
if <(状态) = (追踪)> then
point towards (玩家)
move (8) steps
end
end

이벤트 기반 모델

스크래치는 이벤트 기반입니다. 초록 깃발, 키 입력, 클릭, 메시지 모두 해당 스크립트를 실행시킵니다. 메인 함수가 없으며, 모든 것이 이벤트에서 시작됩니다.

1
2
3
4
5
6
7
8
when green flag clicked
启动游戏
when this sprite clicked
播放音效
when key (空格 v) pressed
跳跃
when I receive (过关)
进入下一关

메시지 전달

스프라이트끼리는 서로의 변수에 직접 접근하지 않고, 방송 메시지와 공유 변수 읽기로 협력해 결합도를 낮춥니다.

1
2
3
4
5
6
7
// 플레이어 점수 → 스코어보드 스프라이트로 브로드캐스트
when this sprite clicked
change [分数 v] by (1)
broadcast (加分动画)
// 스코어보드 쪽이 수신
when I receive (加分动画)
set [显示分数 v] to (分数)

11.디버깅과 오류 처리

스크래치는 예외 메커니즘이 없으므로, 변수 모니터링, 말하기 블록, 경계 검사로 문제를 발견합니다.

예외 메커니즘 없음

스크래치는 예외를 던지지 않으며, 프로그램은 잘못된 논리대로 조용히 실행될 뿐입니다. 따라서 데이터를 미리 확인하고 적극적으로 오류를 방지하는 것이 중요합니다.

1
2
3
// 에러가 나지 않고 이상한 결과만 얻음
// 리스트 범위 밖 읽기는 빈 값을 반환, 비교가 항상 거짓일 수도
// 데이터를 미리 확인하는 게 유일한 방어선

변수 모니터링

무대의 변수 표시기를 우클릭하면 일반 읽기, 큰 글씨 읽기, 슬라이더, 숨기기 등으로 전환할 수 있어 실시간으로 값을 관찰하기 편리합니다.

1
2
3
4
// 무대의 변수 모니터 우클릭:
// 일반 표시 / 큰 글자 / 슬라이더 / 숨기기
set [分数 v] to (0)
change [分数 v] by (1)

말하기 블록으로 디버깅

의심스러운 위치에 「(변수) 라고 말하기」를 넣어 중간 값을 출력해 논리를 점검합니다. 점검 후에는 반드시 삭제하세요.

1
2
3
define 计算得分
set [总分 v] to ((a) + (b))
say (总分) // 임시 디버그 출력

경계 검사

리스트 요소를 읽기 전에 먼저 인덱스가 범위 안인지 확인해 빈 값을 읽지 않도록 합니다. 범위는 1부터 길이까지입니다.

1
2
3
4
5
if <<(i) > (0)> and <(i) <= (length of [背包 v])>> then
say (item (i) of [背包 v])
else
say (序号越界)
end

빈 값 검사

answer가 비어 있거나 리스트가 비어 있을 때는 먼저 확인한 뒤 사용해, 빈 값이 연산에 들어가 이상한 결과가 나오지 않도록 합니다.

1
2
3
4
5
if <(length of [背包 v]) = (0)> then
say (背包是空的)
else
say (item (1) of [背包 v])
end

리스트 범위 초과

리스트 인덱스는 1부터 시작하며, 요소를 삭제하면 인덱스가 자동으로 당겨집니다. 「(리스트) 길이」를 상한으로 사용하면 범위를 넘지 않습니다.

1
2
3
4
5
delete (1) of [背包 v]
// 삭제 후 원래 2번째가 1번째가 됨
if <(i) > (length of [背包 v])> then
set [i v] to (length of [背包 v])
end

단계별 디버깅

큰 스크립트를 작은 조각으로 나눠 한 부분씩 테스트하거나, 기다리기 블록으로 속도를 늦춰 각 단계에서 무슨 일이 일어나는지 관찰합니다.

1
2
3
4
5
6
when green flag clicked
初始化
wait (0.5) seconds // 천천히 관찰하기
计算得分
wait (0.5) seconds
显示结果

자주 하는 오류 목록

오류는 보통 변수가 초기화되지 않았거나, 조건이 반대로 쓰였거나, 인덱스가 범위를 넘거나, 방송을 아무도 받지 않을 때 발생합니다. 목록대로 하나씩 점검하세요.

1
2
3
4
5
// 변수가 대입 후 사용되는지 확인
// 비교 방향이 올바른지 확인
// 리스트 번호가 범위 안인지 확인
// 브로드캐스트와 수신 이름이 일치하는지 확인
// 클론이 상한을 넘지 않는지 확인

12.입력과 출력

감지 블록으로 키보드, 마우스, 질의응답을 읽고, 말하기·모양·배경으로 출력하며, 클라우드 변수로 데이터를 저장합니다.

키보드 입력

「스페이스 키를 눌렀는가?」는 키가 눌렸는지 감지하며, 반복문과 함께 쓰면 연속 이동을, 단일 판단과 함께 쓰면 점프를 구현할 수 있습니다.

1
2
3
4
5
6
7
8
forever
if <key (右移 v) pressed?> then
change x by (5)
end
if <key (左移 v) pressed?> then
change x by (-5)
end
end

마우스 입력

마우스 위치와 누름 상태를 감지해 스프라이트가 마우스를 따라가거나 클릭에 반응하도록 합니다.

1
2
3
4
5
6
7
8
forever
go to (mouse-pointer)
if <mouse down?> then
set size to (120) %
else
set size to (100) %
end
end

질의응답 입력

「(~라고 묻고 기다리기)」는 입력 창을 띄우고, 사용자의 답을 「(답)」 블록에 저장합니다. 답은 항상 문자열입니다.

1
2
3
4
ask (你叫什么名字?) and wait
say (join (你好,) (answer))
ask (你今年几岁?) and wait
set [年龄 v] to (answer)

접촉 감지

스프라이트가 마우스, 다른 스프라이트, 색상에 닿았는지 감지합니다. 충돌 검사나 아이템 잡기에 사용됩니다.

1
2
3
4
5
6
7
8
forever
if <touching (敌人 v)?> then
change [生命 v] by (-1)
end
if <touching (mouse-pointer v)?> then
say (抓到我了)
end
end

감지 값 출력

x 좌표, y 좌표, 방향, 소리 크기, 타이머 등은 모두 읽을 수 있는 감지 값이며, 바로 연산에 넣을 수 있습니다.

1
2
3
say (join (x=) (x position))
say (join (y=) (y position))
say (loudness) // 마이크 음량 0-100

방송 출력

방송은 다른 스프라이트와 동작을 동기화하며, 스프라이트 간 주요 출력 통로입니다. 수신 쪽에서 응답을 처리합니다.

1
2
3
4
5
when this sprite clicked
broadcast (开门)
when I receive (开门)
switch costume to (门开了)
play sound (咔嗒 v)

클라우드 변수 저장

클라우드 변수는 숫자를 서버에 저장하며 모든 플레이어가 공유합니다. 최고 점수나 온라인 통계에 적합합니다.

1
2
3
4
when green flag clicked
if <(分数) > (云_最高分)> then
set [云_最高分 v] to (分数)
end

화면으로 출력

말하기, 생각하기는 글자를, 모양 전환은 이미지를, 소리 재생은 오디오를 출력합니다. 이들을 조합해 피드백을 만듭니다.

1
2
3
4
5
6
when this sprite clicked
say (嗷呜!) for (1) seconds
play sound (咆哮 v)
switch costume to (张嘴)
wait (0.3) seconds
switch costume to (闭嘴)

13.자주 하는 실수

초보자가 가장 자주 빠지는 여덟 가지 함정입니다. BAD는 잘못된 예시, GOOD은 올바른 방법입니다.

무한 반복에서 멈춤

forever 반복 안에 기다리기를 넣으면 조건이 영원히 충족되지 않아 스크립트가 멈춥니다. 반복 안에는 조건을 바꿀 수 있는 블록이 있어야 합니다.

1
2
3
4
5
6
7
8
// BAD 결코 충족되지 않는 조건을 기다림
forever
wait until <(x position) > (1000)>
end
// GOOD 루프 안에서 조건을 진행시키거나 루프가 빠져나올 수 있게
repeat until <(x position) > (240)>
change x by (5)
end

방송 타이밍

방송은 비동기입니다. 보낸 뒤 바로 계속 실행되며 수신 스크립트는 동시에 시작됩니다. 순서가 필요할 때는 「방송하고 기다리기」를 사용하세요.

1
2
3
4
5
6
// BAD 브로드캐스트 직후 수신측이 설정한 값을 읽으면 아직 갱신 안 됐을 수도
broadcast (开始动画)
say (动画结束)
// GOOD「브로드캐스트하고 기다리기」로 수신측 완료를 기다림
broadcast (开始动画) and wait
say (动画结束)

복제본 변수 혼동

전역 변수는 복제본끼리 공유되어 하나를 바꾸면 모두 바뀝니다. 복제본을 구분하려면 「이 스프라이트에만 사용」 전용 변수를 사용하세요.

1
2
3
4
5
6
7
8
9
// BAD 전역 변수로 번호를 매기면 모든 클론이 같은 값을 읽음
set [编号 v] to (0)
repeat (3)
change [编号 v] by (1)
create clone of (我自己)
end
// GOOD 비공개 변수는 클론될 때 클론에 복사됨
when I start as a clone
say (编号)

기다리기 조건이 충족되지 않음

wait until의 조건이 다른 스크립트에서 설정될 때, 그 스크립트가 실행되지 않을 수 있습니다. 그 조건을 바꿀 수 있는 스크립트가 반드시 있어야 합니다.

1
2
3
4
5
// BAD 조건이 중지된 스크립트에 의해서만 바뀔 수 있음
wait until <(加载完成) = (1)>
// GOOD 변수 폴링 대신 이벤트로 기다림
when I receive (加载完成)
say (加载好了)

빈 값이 연산에 포함됨

answer나 리스트 요소가 비어 있을 때 비교·연산에 들어가면 거짓이나 이상한 결과가 나옵니다. 먼저 길이를 확인한 뒤 사용하세요.

1
2
3
4
5
6
7
8
9
10
11
ask (输入数字) and wait
// BAD 빈 입력을 숫자로 비교, 항상 거짓
if <(answer) > (10)> then
say (大于10)
end
// GOOD 먼저 비어 있는지 확인
if <(length of (answer)) > (0)> then
say (join (你输入了) (answer))
else
say (你没有输入)
end

리스트 인덱스 범위 초과

리스트 인덱스는 1부터 시작하며 최댓값은 길이입니다. 0이나 길이를 넘는 인덱스로는 내용을 읽을 수 없으며 오류가 나기 쉽습니다.

1
2
3
4
5
6
7
add (苹果) to [背包 v]
// BAD 0번이나 너무 큰 번호로 리스트 읽기
say (item (0) of [背包 v])
say (item (9) of [背包 v])
// GOOD 1..길이 범위의 번호 사용
say (item (1) of [背包 v])
say (item (length of [背包 v]) of [背包 v])

모양 이름 불일치

모양을 전환할 때 이름은 모양 패널의 이름과 완전히 일치해야 합니다. 공백이 하나 더 많거나 글자가 하나 적으면 전환이 적용되지 않습니다.

1
2
3
4
// BAD 모양 이름에 여분의 공백이 있어 전환이 안 됨
switch costume to (新造型 )
// GOOD 모양 이름이 패널과 완전히 일치
switch costume to (新造型)

재귀가 너무 깊음

스크래치는 재귀 호출에 스택 깊이 제한이 있어 너무 깊으면 조용히 멈추거나 오류가 납니다. 깊은 재귀 대신 반복문을 사용하세요.

1
2
3
4
5
6
7
8
9
// BAD 깊은 재귀는 Scratch 스택 한계를 넘을 수 있음
define 数到 (n)
数到 ((n) + (1))
数到 (0)
// GOOD 루프로 세어 깊이 제한 없음
set [n v] to (0)
repeat (10000)
change [n v] by (1)
end

14.다중 스크립트와 동시 실행

여러 이벤트 스크립트가 병렬로 실행되며, 방송과 기다리기로 실행 순서를 조율합니다.

병렬 스크립트

같은 스프라이트에 여러 개의 독립적인 스크립트를 둘 수 있으며, 각자의 트리거 이벤트에서 병렬로 실행되어 서로 기다리지 않습니다.

1
2
3
4
5
6
7
8
9
10
when green flag clicked
forever
move (5) steps
if on edge, bounce
end
when green flag clicked
forever
play sound (节拍 v)
wait (1) seconds
end

이벤트가 곧 스레드

각 이벤트(초록 깃발, 키 입력, 클릭, 메시지 수신)는 독립적인 스크립트를 시작하며, 이는 하나의 스레드에 해당합니다.

1
2
3
4
5
6
when green flag clicked
say (开始了)
when key (空格 v) pressed
say (按了空格)
when this sprite clicked
say (被点击)

공유 변수

모든 스크립트가 전역 변수를 공유합니다. 여러 스크립트가 동시에 같은 변수를 바꾸면 결과가 서로 덮어쓸 수 있습니다.

1
2
3
4
5
6
7
when green flag clicked
forever
change [分数 v] by (1)
wait (0.1) seconds
end
when this sprite clicked
change [分数 v] by (10)

경쟁 상태

두 스크립트가 동시에 같은 변수에 대해 「읽기-수정-쓰기」를 하면 업데이트가 한 번 손실될 수 있습니다. 핵심 로직은 가능한 한 같은 스크립트 안에 두세요.

1
2
3
// 두 스크립트가 동시에 같은 변수를 change
// 이전 값 읽기→더하기→다시 쓰기 사이에 끼어들 수 있음
// 해결:중요한 카운트를 한 스크립트에 모아 처리

방송 동기 순서

「방송하고 기다리기」는 모든 수신 스크립트가 끝날 때까지 기다린 뒤 계속하므로, 여러 단계 애니메이션의 순서를 정하는 데 쓸 수 있습니다.

1
2
3
broadcast (第一幕) and wait
broadcast (第二幕) and wait
broadcast (第三幕) and wait

스레드 정지

정지 블록은 지정한 스크립트를 멈춥니다. 모두, 이 스크립트, 이 스프라이트의 다른 스크립트 등. 주로 초기화에 사용됩니다.

1
2
3
4
5
when green flag clicked
broadcast (重新开始)
when I receive (重新开始)
stop (other scripts in sprite)
set [分数 v] to (0)

여러 스프라이트 조율

여러 스프라이트가 동시에 움직일 때, 공유 변수와 기다리기를 써서 같은 걸음으로 걷게 하거나 순서대로 행동하게 합니다.

1
2
3
4
5
6
7
when green flag clicked
set [信号 v] to (0)
when I receive (齐步走)
set [信号 v] to (1)
when green flag clicked
wait until <(信号) = (1)>
say (开始前进)

단일 스레드 협력

스크립트는 병렬로 실행되지만, 각 스크립트 내에서는 여전히 순서대로 블록 단위로 실행되며 같은 순간에는 블록 하나만 실행됩니다. 긴 반복은 같은 스프라이트의 다른 스크립트를 멈추게 합니다.

1
2
3
4
5
// 한 스크립트의 긴 루프는 그 스프라이트의 다른 스크립트를 막음
//「브로드캐스트」로 작업을 다른 이벤트에 나눔
repeat (100)
复杂计算
end

15.네트워크와 확장

클라우드 변수는 프로젝트를 네트워크로 연결해 데이터를 공유하고, 확장 블록은 번역, 읽어주기 등 온라인 기능을 제공합니다.

클라우드 변수 네트워크

클라우드 변수는 숫자를 실시간으로 서버에 동기화하여 여러 사용자가 같은 프로젝트를 실행할 때 데이터를 공유하므로, 순위표나 간단한 대전에 적합합니다.

1
2
3
4
5
// 변수 만들 때「클라우드 변수」체크(숫자만)
when green flag clicked
if <(分数) > (云_最高分)> then
set [云_最高分 v] to (分数)
end

번역 확장

「번역」 확장은 온라인 번역을 호출해 텍스트를 목표 언어로 번역하고 문자열을 반환합니다.

1
2
3
// 확장 기능 추가 > 번역
say (translate (你好) to (英语 v))
say (translate (Hello) to (中文 v))

텍스트 음성 변환

「읽어주기」 확장은 텍스트를 읽어 주며, 언어와 음색을 전환할 수 있고, 음성 서비스를 호출하려면 인터넷에 연결되어 있어야 합니다.

1
2
3
// 확장 기능 추가 > 텍스트 읽어주기
speak (欢迎来到我的游戏)
set voice to (Kitty v)

비디오 감지

「비디오 감지」 확장은 카메라로 동작을 포착해 플레이어가 손을 흔들어 스프라이트를 조종하도록 합니다. 처음 사용 시 카메라 권한을 허용해야 합니다.

1
2
3
// 확장 기능 추가 > 비디오 감지
when video motion > (50)
say (有动作!)

웹사이트에 공유

우측 상단의 '공유'를 클릭해 프로젝트를 Scratch 공식 사이트에 게시하면 누구나 온라인으로 실행하고 좋아요를 누르거나 댓글을 남길 수 있습니다.

1
2
// 로그인 → 오른쪽 위「공유」클릭
// 공개 후 링크를 복사해 친구에게 공유

리믹스

웹사이트에서 '리믹스'를 클릭해 다른 사람의 프로젝트를 복제하면 자신의 버전으로 수정할 수 있습니다. 리믹스에는 원작자의 크레딧이 유지됩니다.

1
2
// 남의 프로젝트 열기 →「리믹스」클릭
// 리믹스 후 스크립트를 편집해 공유하면 내 작품이 됨

클라우드 변수 제한

클라우드 변수는 사용에 제한이 있습니다. 프로젝트당 개수가 한정되어 있고, 값은 숫자만 저장 가능하며 너무 길 수 없으며, 잦은 업데이트는 서버에 의해 제한될 수 있습니다.

1
2
3
4
// 프로젝트마다 클라우드 변수 개수 제한 있음
// 클라우드 변수는 숫자만 저장, 문자열 불가
// 잦은 갱신은 서버에서 제한됨
// 클라우드 변수 사용 전에는 로그인 필요

네트워크 보안과 개인정보

온라인 프로젝트는 누구나 볼 수 있도록 공개됩니다. 실명, 주소, 전화번호 등 개인정보를 작품에 포함하지 마세요.

1
2
3
// 작품 안에서 실명이나 개인정보를 드러내지 않음
// 모르는 사람이 보낸 의심스러운 파일을 다운로드·실행하지 않음
// 가명을 써서 개인 정보 보호

16.시간과 타이밍

타이머, 기다리기, 그리고 일수 블록을 사용해 카운트다운, 스톱워치, 시간 제한 레벨을 만듭니다.

타이머

'타이머'는 프로젝트가 실행되기 시작한 순간부터 초 단위로 시간을 측정하며, 소수점 이하까지 정확하게 표시됩니다. 스톱워치와 카운트다운의 핵심입니다.

1
2
3
4
5
when green flag clicked
say (计时器)
forever
say (join (已用:) (timer))
end

타이머 초기화

'타이머 초기화'는 타이머를 0으로 되돌려 새로운 시간 측정을 시작할 때 사용합니다.

1
2
3
4
when green flag clicked
reset timer
wait (5) seconds
say (join (用时:) (timer))

일수 타이머

'2000년 이후의 일수'는 2000-01-01부터 경과한 일수를 반환하며, 날짜를 넘기는 측정이나 마지막 열람 시각 기록에 사용할 수 있습니다.

1
2
say (days since 2000)
// 소수점 있는 일수를 반환, 예:9678.5는 반나절을 뜻함

초 단위 대기

'N초 기다리기'는 현재 스크립트를 N초 동안 일시 정지하며, 리듬, 지연, 애니메이션 프레임 속도 조절에 사용됩니다.

1
2
3
4
5
when green flag clicked
say (3) for (1) seconds
say (2) for (1) seconds
say (1) for (1) seconds
say (起飞!)

카운트다운

타이머와 빼기를 사용해 카운트다운을 만들고, 0에 도달하면 종료 이벤트를 발생시킵니다.

1
2
3
4
5
6
7
8
9
10
when green flag clicked
set [剩余 v] to (30)
forever
set [剩余 v] to ((30) - (timer))
if <(剩余) < (0)> then
set [剩余 v] to (0)
broadcast (时间到)
stop (this script)
end
end

스톱워치

타이머 값의 차이를 사용해 한 동작에 걸린 시간을 측정하며, 반응 속도 테스트 게임에 적합합니다.

1
2
3
4
5
when green flag clicked
wait until <key (空格 v) pressed?>
reset timer
wait until <key (空格 v) pressed?>
say (join (你的反应:) (join (timer) ( 秒)))

시간 제한 레벨

정해진 시간 안에 임무를 완수해야 하며, 시간이 초과되면 실패합니다. 카운트다운과 승리 조건을 결합하세요.

1
2
3
4
5
6
7
8
9
10
11
when green flag clicked
set [倒计时 v] to (10)
repeat until <(倒计时) < (1)>
wait (1) seconds
change [倒计时 v] by (-1)
if <(通关) = (1)> then
say (过关!)
stop (this script)
end
end
say (时间到!)

시간 기반 애니메이션

타이머를 사용해 애니메이션을 프레임 속도가 아닌 실제 시간에 연동시키면, 컴퓨터마다 동일한 속도를 보장할 수 있습니다.

1
2
3
4
forever
go to x: ((timer) * (100)) y: (0)
end
// 캐릭터가 시간에 따라 등속 이동, 기기 속도에 의존 안 함

17.스크립트 생명주기

스크립트는 Scratch의 최소 실행 단위입니다. 시작, 실행, 정지를 이해하면 프로젝트 전체 흐름을 이해할 수 있습니다.

스크립트는 절차

이벤트 블록으로 시작해 끝까지 이어지는 한 스크립트는 하나의 작은 절차입니다. 여러 스크립트가 모여 완전한 프로그램을 구성합니다.

1
2
3
when green flag clicked // 시작점
say (第一步)
say (第二步) // 순서대로 실행

초록색 깃발로 시작

초록색 깃발은 표준 시작 진입점입니다. 클릭하면 '초록색 깃발을 클릭했을 때' 스크립트가 모두 동시에 시작되며, 이는 주 프로그램의 진입점 역할을 합니다.

1
2
3
when green flag clicked
初始化所有变量
显示开始界面

이벤트 처리기

이벤트 블록은 스크립트의 '머리'이며, 해당 이벤트가 발생했을 때만 실행됩니다. 트리거 조건이 없으면 스크립트는 스스로 시작되지 않습니다.

1
2
3
4
5
6
when key (空格 v) pressed
跳跃
when this sprite clicked
打招呼
when I receive (过关)
next backdrop

원자적 실행 절차

사용자 정의 블록에서 '화면 새로 고침 없이 실행'을 선택하면 블록 전체가 한 번에 실행되며 도중에 화면이 다시 그려지지 않아, 빠른 일괄 계산에 적합합니다.

1
2
3
define 大量计算
//「화면 새로고침 없이 실행」체크
// 한 프레임 안에 완료, 블록마다 그리지 않음

병렬 생명주기

각 스크립트는 독립적으로 시작되고 정지됩니다. 멈추기 블록을 사용하면 '모두 멈추기', '이 스크립트 멈추기', '이 스프라이트의 다른 스크립트 멈추기'를 정확히 제어할 수 있습니다.

1
2
3
4
5
6
when green flag clicked
主循环
when I receive (暂停)
stop (other scripts in sprite)
when I receive (继续)
主循环

멈추기의 적용 범위

'이 스크립트 멈추기'는 현재 스크립트에만 영향을 미치고, '이 스프라이트의 다른 스크립트 멈추기'는 같은 스프라이트의 나머지 스크립트를 멈추게 하며, '모두 멈추기'는 모든 것을 종료합니다.

1
2
3
stop (this script)
stop (other scripts in sprite)
stop (all)

상태 머신 절차

변수로 현재 상태를 기록해 스크립트가 상태 사이를 전환하도록 하면, 메뉴, 게임, 종료 같은 장면 흐름을 구현할 수 있습니다.

1
2
3
4
5
6
7
if <(场景) = (菜单)> then
switch backdrop to (菜单背景)
else
if <(场景) = (游戏中)> then
switch backdrop to (游戏背景)
end
end

프로젝트 생명주기

프로젝트는 리소스 로드, 초록색 깃발 클릭으로 시작, 멈추기 버튼으로 종료, 저장 및 공유에 이르기까지 완전한 생명주기를 구성합니다.

1
2
3
4
5
// 로드:모양, 소리, 변수 읽기
// 시작:초록 깃발 클릭, 각 스크립트 시작
// 실행:이벤트와 루프가 계속 실행
// 중지:빨간 원 버튼으로 모두 중지
// 저장:자동 저장 또는 수동으로 .sb3 다운로드

18.텍스트 패턴 매칭

Scratch에는 정규 표현식이 없으므로, 포함 여부, 문자 판단, 리스트 분할을 사용해 간단한 매칭을 수행합니다.

정규 표현식 없음

Scratch에는 정규 표현식 블록이 없습니다. 복잡한 텍스트 매칭은 연산 블록으로 직접 흉내 내거나 확장에 맡겨야 합니다.

1
2
// Scratch에는 정규식이 없음
//「포함」「N번째 문자」등의 블록으로 직접 구현

포함 매칭

'포함 여부'는 가장 간단한 부분 문자열 매칭으로, 텍스트 안에 특정 단어가 나타나는지 판단합니다.

1
2
3
if <(台词) contains (危险)> then
say (出现危险词!)
end

시작 문자 판단

첫 번째 문자를 가져와 특정 글자로 시작하는지 판단해 접두사를 검사합니다.

1
2
3
if <(letter (1) of (命令)) = (跳)> then
say (执行跳跃指令)
end

끝 문자 판단

마지막 문자를 가져와 끝을 판단해 접미사를 검사합니다. 마지막 위치의 번호는 곧 문자열의 길이입니다.

1
2
3
if <(letter (length of (命令)) of (命令)) = (!)> then
say (语气强烈)
end

문자 종류

한 문자가 숫자인지 알파벳인지를 판단하려면, 먼저 숫자 표를 만든 뒤 '포함 여부'로 조회해 보세요.

1
2
3
4
// 数字表 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
if <[数字表 v] contains (letter (i) of (文本))> then
say (这是数字)
end

패턴 찾기

반복문을 사용해 텍스트를 한 글자씩 훑으며 조건에 맞는 조각을 찾습니다. 연속된 숫자를 추출하는 데 활용할 수 있습니다.

1
2
3
4
5
6
7
set [i v] to (1)
repeat (length of (文本))
if <[数字表 v] contains (letter (i) of (文本))> then
say (join (找到数字) (letter (i) of (文本)))
end
change [i v] by (1)
end

분할 파싱

구분자를 기준으로 텍스트를 리스트로 나눈 뒤 한 항목씩 처리해 간단한 파싱을 구현합니다.

1
2
3
4
5
6
7
8
9
10
11
set [i v] to (1)
repeat (length of (文本))
if <(letter (i) of (文本)) = (,)> then
add (当前段) to [段落 v]
set [当前段 v] to ()
else
set [当前段 v] to (join (当前段) (letter (i) of (文本)))
end
change [i v] by (1)
end
add (当前段) to [段落 v]

와일드카드 흉내

'포함 여부'와 여러 조건을 조합해 와일드카드를 흉내 냅니다. 예를 들어 텍스트가 여러 키워드 중 하나와 일치하는지 판단할 수 있습니다.

1
2
3
if <<(文本) contains (开始)> or <(文本) contains (结束)>> then
say (匹配到关键词)
end

19.저장, 게시와 디버깅

프로젝트 저장, 내보내기, 공유와 디버깅 요령으로 작품을 더 매끄럽고 재미있게 만드세요.

프로젝트 저장

로그인 상태에서는 프로젝트가 자동으로 클라우드에 저장됩니다. '파일' 메뉴에서 수동으로 저장하거나 컴퓨터에 내려받아 백업할 수 있습니다.

1
2
3
4
// 로그인하면 클라우드에 자동 저장
// 파일 > 컴퓨터에 저장해서 .sb3 백업
when green flag clicked
say (放心,已经自动保存了)

.sb3 파일 형식

프로젝트 파일의 확장자는 .sb3이며, 내부에 project.json과 모양, 소리 등의 자원을 담은 압축 파일이라 오프라인에서도 열 수 있습니다.

1
2
3
// .sb3는 zip 압축 패키지
// 안에 project.json과 소재 파일이 들어있음
// .sb3를 더블클릭하면 오프라인으로 열 수 있음

공유와 게시

우측 상단의 '공유'를 클릭해 작품을 게시하고, 제목, 설명, 태그를 설정해 더 많은 사람이 찾을 수 있도록 하세요.

1
2
3
// 재미있는 프로젝트 제목을 붙임
// 플레이 방법을 명확히 쓰고 알맞은 태그 추가
//「공유」를 눌러 공개하고 링크를 친구에게 보냄

리믹스로 재창작

웹사이트에서 다른 사람의 프로젝트를 리믹스해 학습의 출발점으로 삼고, 스크립트를 수정하거나 레벨을 더해 자신만의 버전을 게시하세요.

1
2
3
// 프로젝트 열기 →「리믹스」클릭
// 스크립트와 모양을 수정해 공유
// 원작자 이름을 남기고 커뮤니티 규칙 준수

디버깅 도구

변수 모니터, 말하기 블록, 기다리기 늘리기 같은 요령으로 문제를 찾고, 스크립트를 한 단락씩 검증하세요.

1
2
3
// 의심스러운 변수를 감시해 실시간 값 확인
// 임시로 say를 추가해 중간 결과 출력
// wait를 넣어 각 단계를 천천히 관찰

백업과 버전

.sb3 파일을 컴퓨터에 내려받아 백업하고, 이름을 바꿔 여러 버전을 저장해 두면 잘못 고쳐도 이전 버전으로 되돌릴 수 있습니다.

1
2
// 중요한 작품은 정기적으로 .sb3 다운로드해 백업
//「다른 이름으로 저장」으로 여러 버전 보관

게시 전 점검

게시 전에는 초록색 깃발, 키 입력, 클릭, 브로드캐스트 등 모든 진입 경로를 테스트하고, 무한 루프나 범위 오류, 화면 끊김이 없는지 확인하세요.

1
2
3
// 테스트:초록 깃발, 스페이스, 스프라이트 클릭, 브로드캐스트 수신
// 확인:루프가 빠져나올 수 있는지, 리스트 범위 밖이 아닌지
// 확인:클론이 상한을 넘지 않는지, 화면이 부드러운지

지속적 학습

공식 튜토리얼, Scratch Wiki, 커뮤니티 프로젝트를 통해 다양한 기법을 익혀 작품을 계속 개선해 나가세요.

1
2
3
// 공식 튜토리얼:scratch.mit.edu의「创意与学习」
// Scratch Wiki:en.scratch-wiki.info
// 커뮤니티의 좋은 작품을 많이 즐기며 배우기

공식 링크

공식 문서와 리소스에 대한 직접 링크.

이 치트시트에 대해

Scratch는 매사추세츠 공과대학교 미디어 랩이 개발한 무료 시각적 프로그래밍 언어로, 5~16세 학습자를 위해 만들어졌습니다. 코드를 직접 입력하는 대신 '블록'을 조립하는 방식을 사용하며, 동작, 모양, 소리, 이벤트, 제어, 탐지, 연산, 변수, 사용자 정의 블록의 아홉 가지 범주에서 블록을 끌어다 스크립트 영역에 놓으면 스프라이트 애니메이션, 인터랙티브 게임, 창의적인 이야기를 만들 수 있습니다. 본 페이지는 Scratch 3의 자급식 치트시트로, 게임, 애니메이션, 이야기 제작에서 초보자가 자주 사용하는 약 80%의 내용을 다룹니다. 19개 챕터가 각자의 주제를 다룹니다. 첫 프로그램(hello), 변수와 데이터 저장(vars / types / pointers), 흐름 제어(control), 사용자 정의 블록(funcs), 문자열과 리스트(strings / collections), 프로젝트와 자원 관리(mem), 스프라이트 객체 모델(oop), 디버깅과 흔한 실수(errors / faq), 입출력과 동시 스크립트(io / threads), 클라우드 변수와 확장(net), 시간과 타이머(time), 스크립트 생명주기(proc), 텍스트 패턴 매칭(regex), 저장·게시와 디버깅(build)에 이르기까지. 각 챕터는 예시가 포함된 8개의 소단원으로 나뉘며, 한 예시는 5~20줄 정도라 읽으며 따라 치기에 좋습니다. 다른 프로그래밍 언어와 달리 Scratch에는 텍스트 문법이 없으므로, 여기서는 블록의 가독성 있는 텍스트 표현으로 다뤄 오프라인에서도 살펴보고 떠올리기가 쉽도록 했습니다. 모든 내용은 브라우저 안에서 렌더링되며, 업로드되거나 추적되지 않아 개인정보가 안전합니다. 본 페이지는 GuruToolkit 무료 개발자 도구 모음의 일부이며, 코드 스니펫은 자유롭게 사용할 수 있지만 어떠한 보증도 제공하지 않습니다.

버전 2.1.0