프로세싱 튜토리얼 함수생성

함수생성

함수를 만들어내기 위해서는 확실한 함수 역할 계획을 세워야 한다. 특정 그림을 그릴 것인가? 수를 계산할 것인가? 이 미지에 필티를 추가할 것인가? 합수의 역할에 대해 생각한 후, 각 역할에 필요한 매개변수와 데이터의 종류를 생각해보자.

목표를 설정하고 잘게 조개보자.

다음 예시에서는 먼저 프로그램을 만들어 함수를 만들기 전에 세부사항을 확인해볼 것이다. 이후. 매개변수를 하나씩 추

가하고 코드를 실행해보며 함수를 만들어낼 것이다.

void setup() { size (100, 100);

}

void draw() | background (204);

// Draw thick, light gray X

stroke(160):

stroke Weight(20);

line(0, 5, 60, 65): line(60, 5, 0, 65):

// Draw medium, black X

stroke(0);

strokeWeighr10);

line(30, 20, 90, 80);

line(90, 20, 30, 80):

// Draw thin, white X

stroke (255);

stroke Weighr02):

line(20, 38, 80, 98);

line(80, 38, 20, 98);

}

이전 예시처럼 3개의 X를 그릴 수 있는 함수를 만들어내기 위해 먼저 X를 그리는 함수를 만들어보자. 이 함수는 그 목표 를 뜻하는 ‘draw X( )라고 이름 지을 것이다. 블록 안의 코드는 좌측 상단에 연회색의 X를 그릴 것이다. 이 함수는 매개변수 가 없어 코드가 실행될 때마다 똑같은 X를 그릴 것이다. 함수 이름 아래의 키워드 보이드void는 이 함수가 값을 반환하지 않음을 나타낸다

void setup () {

size (100, 100);}

void draw() {

drawX();}

void drawX() {

background (204);

// Draw thick, light gray X

stroke (160);

stroke Weight(20);

line(0, 5, 60, 65);

line(60, 5, 0, 65);

}

X를 다르게 그리기 위해서는 변수가 함수에 추가되어야 한다. 다음 예시에서 gray 매개변수는 블록에 그려질 X의 회색 값을 설정한다. 함수의 이름 다음에 오는 괄호 안에 위치하는 매개변수는 데이터의 종류와 이름을 포함해야 하는데 이때 종 류는 int이고 이름은 gray이다.

void setup() {

size(100, 100);}

void draw() {

background (204);

drawX(0); // Passes O to drawX(), runs drawX()}

void draw X(int gray) { // Declares and assigns gray stroke (gray);

// Uses gray to set the stroke

stroke Weight (20);

line(0, 5, 60, 65);

line(60, 5, 0, 65);

}

이 함수가 drmatv( )로부터 불러와 지면, 합수 이름 우측 팔호 안의 값은 gray에 할당된다. 이 예시 안에서 gray에 할당되는 값은 0이므로 X는 검은색으로 채워진다.

void setup() { size (100, 100);

}

void draw() f background (204);

drawX(0, 30); // Passes values to drawX(), runs drawX()}

void drawX(int gray, int weight) |

stroke(gray);

stroke Weight(weight);

line(0, 5, 60, 65);

line(60, 5, 0, 65);

}

함수는 매개변수를 1개 이상 가질 수 있다. 각 매개변수는 함수 우측 괄호 안에 위치해야 하고 모두 그 데이터의 종류가 명시되어야 하며 다수의 매개변수는 쉼표로 나뉘어야 한다. 이 예시에서 블록 안의 stroke Wcight() 함수를 이용해 선 두께를 조정하기 위해 wcight 매개변수가 추가되었다.

void setup () {

size(100, 100);

}

void draw() {

background(204);

drawX(0, 30, 40, 30, 36);}

void drawX(int gray, int weight, int x, int y, int size) {

 stroke (gray);

stroke Weight(weight);

line(x, y, x+size, y+size);

line(x+size, y, x, y+size);

}

함수를 하나씩 쌓아 올려 3개의 X를 그릴 수 있는 함수를 만들었다. 완료된 drawX() 합수는 각  청의 시각적 특성을 정의하는 5개의 매개변수가 있다. dravX() 안의 각 함수 호출에는 5개의 매개변수가 있는 것을 확인하지 각 함수 호출의 매개변수 숫자와 데이터 종류는 함수에 정의된 숫자와 데이터 종류와 부합해야 한다.

만약 함수 호출이 draw X(160.2,20.0.5,60)라면 첫 번째 매개변수는 정수여야 하므로 오류가 발생할 것이다. 만약 함수 호출이 draw X(160,20,0.5)라면 매개변수가 4개뿐이므로 오류가 발생할 것이다.

void setup() {

size (100, 100);

}

void draw() {

background (204);

drawX(160, 20, 0, 5, 60); // Draw thick, light gray

drawX(0, 10, 30, 20, 60); // Draw medium, black X 

drawX(255, 2, 20, 38, 60); // Draw thin, white X

}

void drawX(int gray, int weight, int x, int y, int size) {

stroke(gray);

stroke Weight(weight);

line(x, y, x+size, y+size);

line(x+size, y, x, y+size);

}

이제 draw X() 함수가 존재하니 이 함수를 사용하지 않을 때 비실용적일 프로그램을 작성할 수 있다. 예를 들어 drawX() 함수 호출을 for 루프 안에 포함시켜 많은 반복을 만들 수 있다. 변수를 이용해 각 X는 독자적인 매개변수를 입력함으로써 다르게 그려질 수 있다.

void setup() {

size(100, 100);}

void draw() {

background (204);

for (int i = 0; i < 20; i++) {

drawX(200-1*10, (20-1)*2, i, ¡/2, 70);

}

}

void drawX(int gray, int weight, int x, int y, int size) {

stroke(gray);

stroke Weight(weight);

line(s, y, x+size, y+size);

line(x+size, y, x, y+ size);

}

다음 예시는 leaf() 함수를 생성했고 선 위에 잎을 정렬시키기 위해 vine( ) 함수를 생성했 다. 이 예시들은 함수가 다른 함수 안에서 어떻게 실행되는지 보여준다. leaf() 함수는 도형의 위치, 크기, 방향을 정의하는 4 개 매개변수가 있다.

int x

int y

int size 

int dir

이 간단한 프로그램은 나뭇잎을 그리며 매개변수가 이 잎의 특성에 미치는 영향을 보여준다.

void setup() {

size (100, 100);

noStroke();

}

void draw() {

background (0);

leaf(26, 83, 60, 1);

}

void leaf(int x, int y, int size, int dir) {

pushMatrix();

translate(x, y);

Move to position

scale(size);

// Scale to size

beginShape();

// Draw the shape

vertex (1.0* dir, -0.7);

bezierVertex(1.0* dir, -0.7, 0.4* dir, -1.0, 0.0, 0.0);

bezierVertex(0.0, 0.0, 1.0*dir, 0.4, 1.0* dir, -0.7);

endShape();

popMatrix();

}

vine() 함수는 위치, 나뭇잎 수, 각 나뭇잎의 크기를 설정하는 매개변수가 있다.

이 함수는 매개변수 값에 특정 규칙을 추가해 넝쿨의 형태를 결정한다. vine() 함수 안의 코드는 먼저 흰색 세로선을 그 리고 디스플레이 창의 높이와 나뭇잎 수에 따라 나뭇잎 사이의 공간을 결정한다. 첫 나뭇잎은 닝쿨 오른쪽에 그려지며 for 루프는 numleaves 매개변수에 따라 잎을 결정한다. 변수는 위치를 결정하며 leaf size는 각 나뭇잎의 크기를 결정한다. 각 나 뭇잎의 y좌표는 random() 함수 때문에 프로그램이 실행될 때마다 달라진다.

vine()함수는 여러 단계를 거쳐 현재의 코드로 정리되었다. 이 예시에서 vine() 함수는 drawX( )에서 호출되며 특성은 다른 매개변수에 의해 규정된다. 매개변수의 수를 늘려 냉쿨의 색상과 같은 다양한 특성을 결정하거나 직선 때신 국산 을 그릴 수도 있다.

함수를 이용해 얻을 수 있는 유일한 장점이 프로그램의 길이 단축뿐만은 아니지만 그렇다고 짧은 코드가 타이핑 양을 줄 이는 것도 아니다. 코드가 길수록 실수가 많으므로 프로그램이 짧으면 결국 오류도 적다. 함수는 프로그램을 이해하기 없에 해준다. 들여쓰기나 끊음 없이 한 단락만으로 쓰인 소설을 상상해보자.

함수는 프로그램의 가독성을 향상시키는 단락과 같 다. 복잡한 과정을 간단하고 이해하기 쉽게 작은 단위로 나누면 아이디어 구성에도 도움이 되지만 그렇다고 함수를 많이 한 든다고 되는 것도 아니다. 각 함수들은 아이디어, 계산, 형식을 나타내는 코드 단위여야 한다.

코드모음이 함수가 되면 이 함수가 포함된 코드는 한 번만 변경하면 수정할 수 있다. 예를 들어 코드 24-02에서 이 코드 가 한 번만 변경되면 되므로 프로그램 자체의 수정에도 긴 시간이 걸리지 않는다.

만약 하나의 세부사항만, 예를 들어 검정 색 원보다 작은 흰색 원의 위치를 바꾸고 싶다면 원래 그 코드를 여러 번 변경해야만 했을 것이다. 9개의 도형을 고치고 싶다 면 총 9줄의 코드를 변경해야만 했을 것이다.

또한 함수는 코드 재활용을 장려하므로 프로그램을 짜기 쉽다. 제작함수는 다른 프로그램에도 사용될 수 있다. 다른 프 로그램을 만들면서 작업에 필요한 함수 모음집을 구성할 수도 있다.

사실 이 프로세싱 프로그램의 일부는 제작자들의 작업에 사용된 함수 모음집이라고 할 수 있다.

Leave a Comment