손으로 하모니카나 머리빗을 만져보면, 여러 개의 구멍이나 빗살이 일정한 간격으로 쭉 늘어서 있죠. 또는 건물의 계단을 오를 때, 발을 딛는 계단들이 같은 모양으로 계속 이어지는 것을 느낄 수 있습니다.
만약 우리가 이런 모델을 코드로 만든다고 상상해봅시다. 하모니카에 구멍 10개를 뚫어야 한다면, 구멍을 만드는 코드를 열 번이나 복사해서 붙여넣어야 할까요? 계단을 20칸 만들어야 한다면 스무 번이나요? 생각만 해도 번거롭고 비효율적입니다.
바로 이럴 때 사용하는 마법 같은 명령이 for 입니다. for는 "이 작업을 정해진 횟수만큼, 혹은 이 규칙에 따라 반복해줘"라고 컴퓨터에게 지시하는 명령어입니다. 단 몇 줄의 코드로 수십, 수백 개의 반복되는 형태를 순식간에 만들어낼 수 있죠.
for 반복문의 기본 사용법
for는 괄호 () 안에 반복에 대한 규칙을 정해주고, 중괄호 {} 안에 반복할 명령을 넣어줍니다. 규칙은 크게 세 가지 방식으로 정할 수 있습니다.
-
시작부터 끝까지 1씩 증가하며 반복
for(변수 = [시작값 : 끝값]) { ... }
예를 들어,for(i = [1 : 3])라고 쓰면,i라는 임시 변수가 처음엔 1이 되었다가, 다음엔 2, 마지막으로 3이 되면서 중괄호 안의 명령을 총 세 번 실행합니다. -
정해진 증가율로 반복
for(변수 = [시작값 : 증가율 : 끝값]) { ... }
만약 1부터 3까지 0.5씩 증가시키고 싶다면 어떨까요?for(i = [1 : 0.5 : 3])라고 쓰면,i는 1, 1.5, 2, 2.5, 3으로 변하면서 총 다섯 번 반복합니다. -
정해진 값들만 콕 집어서 반복
for(변수 = [값1, 값2, 값3, ...]) { ... }
규칙적이지 않은 값들로 반복하고 싶을 때 사용합니다.for(i = [1, 3, 4, 6])이라고 쓰면,i는 1, 3, 4, 6 순서로 변하면서 네 번 반복합니다.
실습: for를 이용해 하모니카 만들기
자, 그럼 이 for 명령어를 활용해서 간단한 하모니카 모양을 함께 만들어 보겠습니다.
// 하모니카 전체 크기
harmonica_width = 100; // 좌우 너비 (mm)
harmonica_height = 25; // 위아래 높이 (mm)
harmonica_depth = 20; // 앞뒤 깊이 (두께) (mm)
// 구멍 속성
num_holes = 10; // 구멍은 총 10개를 뚫을 겁니다.
hole_height = 10; // 각 구멍의 높이는 10mm입니다.
wall_thickness = 3; // 구멍과 구멍 사이, 그리고 양쪽 끝의 벽 두께는 3mm입니다.
// =================================
// 2단계: 모델 실제로 만들기
// =================================
// 먼저, 구멍 하나의 너비를 자동으로 계산해 봅시다.
// 전체 너비에서, 모든 벽의 두께를 뺀 공간이 순수하게 구멍들이 차지할 공간입니다.
// 벽은 구멍 10개 사이에 9개, 그리고 양 끝에 2개, 총 11개가 있습니다. (num_holes + 1)
// 이렇게 남은 공간을 구멍의 개수(num_holes)로 나누면 구멍 하나의 너비가 나옵니다.
hole_width = (harmonica_width - (num_holes + 1) * wall_thickness) / num_holes;
// 이제 '차집합'을 의미하는 difference() 함수를 사용해 몸체에서 구멍들을 빼내겠습니다.
// 마치 찰흙 덩어리에서 도구로 흙을 파내는 것과 같습니다.
difference() {
// 첫 번째 객체: 기본 몸체 (찰흙 덩어리)
// 먼저, 꽉 찬 직육면체 모양의 하모니카 몸통을 만듭니다.
// center=true 옵션은 모델의 정중앙을 좌표의 원점(0,0,0)에 맞추는 역할입니다.
cube([harmonica_width, harmonica_height, harmonica_depth], center=true);
// 두 번째 객체 이후: 빼낼 모양들 (흙을 파낼 도구들)
// 여기에 for 반복문을 사용해서 10개의 구멍을 한 번에 생성하고 빼냅니다.
// i라는 변수가 0부터 9까지 (총 10번) 반복됩니다.
for (i = [0 : num_holes - 1]) {
// 각 구멍이 위치할 x축(좌우) 좌표를 계산하는 부분입니다. 여기가 핵심입니다.
// 첫 번째 구멍의 중심 위치를 계산한 뒤,
// 그 다음 구멍부터는 (구멍 너비 + 벽 두께)만큼씩 오른쪽으로 이동하며 배치합니다.
x_pos = -harmonica_width/2 + wall_thickness + hole_width/2 + i * (hole_width + wall_thickness);
// translate는 '이동'을 의미하는 명령입니다.
// 방금 계산한 x_pos 위치로 구멍 역할을 할 큐브를 이동시킵니다.
translate([x_pos, 0, 0]) {
// 몸체를 확실히 관통시키기 위해, 몸체 깊이(depth)보다 살짝 더 긴 큐브를 만듭니다.
// 마치 송곳이 판자를 뚫고 반대편으로 조금 더 튀어나오는 것과 같습니다.
cube([hole_width, hole_height, harmonica_depth + 1], center=true);
}
}
}
코드 해설
-
설계도 (변수 설정)
코드 상단에서 하모니카의 너비, 높이, 구멍 개수 등을 변수로 정해두었습니다. 이것은 우리 모델의 '설계도'와 같습니다. 만약 여러분이 구멍이 8개인 하모니카를 만들고 싶다면,
num_holes = 10;이 부분을num_holes = 8;로 바꾸기만 하면 됩니다. 나머지 너비나 위치는 코드가 알아서 다시 계산해 줄 겁니다. 정말 편리하죠. -
difference()함수이 함수는 첫 번째로 등장하는 객체에서, 그 뒤에 오는 모든 객체들의 모양을 빼내는 역할을 합니다. 우리는 커다란 직육면체 몸통(
cube)에서,for문이 만들어내는 10개의 길쭉한 직육면체(구멍)들을 빼내어 하모니카 형태를 완성합니다. -
for반복문의 기적이 코드의 심장부입니다. 우리는 구멍을 만들기 위한
translate와cube코드를 단 한 번만 작성했습니다.for (i = [0 : 9])이 명령이i의 값을 0부터 9까지 바꿔가며 코드를 열 번 실행시켜 줍니다. 가장 중요한 것은x_pos계산식입니다.i가 0일 때는 첫 번째 구멍의 위치가, 1일 때는 두 번째 구멍의 위치가 계산되어, 10개의 구멍이 정확한 간격으로 나란히 배치되는 것입니다.