다음 예시는 생성자라는 새로운 프로그래밍 요소를 소개한다. 생성자는 객체가 생성되어 작동하는 코드 블록이다. 생성 자는 항상 클래스와 같은 이름을 가지며 일반적으로 객체의 필드가 생성되면 값을 지정하기 위해 사용된다.(생성자가 모든 수치 필드의 값은 0으로 설정된다.)
생성자는 가능한 반환 유형이 없으므로 이전에 데이터 유형이나 Yoid 키워드가 선행되지 않는다는 점을 제외하면 다른 메소드와 같다. 아래 예시에서 객체 sp가 생성될 때 매개변수 33. 50, 300 생성자 안의 xPos,
ypos, dia 변수에 지정된다. 생성자 블록 안에서 이 값들은 객체의 x, y, diameter 필드에 지정된다. 객체의 모든 메소드 안에 서 필드에 접근시키기 위해서는 필드를 생성자 밖에서 선언해야 한다. 변수의 유효범위 규칙(92쪽)을 기억하라. 만약 필드가 생성자 내부에서 선언되었다면 생성자 외부에서는 접근 불가능하다.
Spot 클래스의 작동은 추가적인 메소드와 필드를 정의에 추가함으로써 확장할 수 있다. 아래 예시는 클래스를 확장하 원이 디스플레이 윈도우에서 위아래로 움직이게 하고 윈도우의 위아래에 부딪히면 방향을 바꾸도록 한다. 원이 움직이드 속도를 설정할 변수가 필요하며 방향이 바뀌므로 현재의 방향을 유지할 다른 변수가 필요하다.
그 필드의 목적을 명확히 하고 이름을 짧게 하기 위해 speed와 direction으로 정했다. speed는 가능한 속도 범위를 넓히기 위해 float값으로 만들었으며 direction 필드는 움직임에 수학을 쉽게 적용하도록 int로 만들었다.
float speed
int direction
원하는 움직임을 만들어내기 위해 매 프레임마다 원의 위치를 업데이트해야 한다. 디스플레이 윈도우의 모서리에서는 방향도 바꾸어야 한다. 모서리 관련 테스트를 위해 코드는 y좌표가 원의 반지름보다 작거나 윈도우의 높이에서 원의 반지름 을 뺀 것보다 큰지 확인한다.
반지름 값을 확실히 포함하고 원의(중심이 아닌) 테두리가 모서리에 닿으면 방향이 바뀌는지 분명히 확인하라. 메소드의 임무와 명칭 결정 외에도 사용자는 반드시 반환 유형을 정해야 한다. 이 메소드에서는 아무것도 반환되지 않으므로 void 키워드가 사용되었다.
void move() 원의 위치와 방향을 업데이트
move()와 cisplay() 메소드 안의 코드는 1개의 메소드로 조합될 수 있었다. 2개의 메소드는 예시가 더 명확해지도록 나 누었다. 객체의 위치를 변경하는 것은 화면에 객체를 그리는 것과 다른 작업이며 이것은 별개의 메소드를 사용하는 데 반영 되어 있다. 이 변화는 Spot 클래스에서 생성된 모든 객체들이 고유의 크기와 위치를 갖게 한다. 객체는 또한 모서리에서 방 향을 바꾸며 화면에서 위아래로 움직일 것이다.
class Spot {
float x, y; // X-coordinate, y-coordinate float diameter
// Diameter of the circle
float speed;
/ Distance moved each frame
int direction = 1;
// Direction of motion (1 is down, -1 is up)
// Constructor
Spot(float xpos, float ypos, float dia, float sp) | × = xpos;
y = ypos;
diameter = dia;
speed = sp;
}
void move ) {
y += (speed * direction);
if ((y > (height - diameter/2)) | | (y < diameter/2 direction *= -1:
}
}
void display() {
ellipse(x, y, diameter, diameter);
}
}
공간을 절약하고 객체 재사용에 집중하기 위해 여기서부터 이번 장의 끝까지 등장하는 예시는 Spo 클래스를 사용하는 예시에서 Snot 클래스의 코드를 다시 출력하지 않을 것이다. 그 대신 독자가 “//Spot 클래스를 삽입하시오”와 같은 코멘트 를 본다면 그 위치에 코드를 잘라 붙여 넣어 코드를 작동시켜라. move() 메소드가 필드를 업데이트하고 display() 메소드가 sp 객체를 디스플레이 윈도우에 그린 결과물을 보기 위해 아래 코드를 작동시켜라.
Spot sp; // Declare the object
void setup() {
size(100, 100);
noStroke( );
sp = new Spot(33, 50, 30, 1.5); / / Construct the object}
void draw() {
fill(0, 15);
rect(0, 0, width, height);
fill (255); sp.move(); sp.display();
}
함수와 마찬가지로 잘 작성된 클래스는 프로그래머가 실행 세부사항이 아니라 결과적 행동에 집중하게 해준다. 객체는 재사용 목적으로 구성해야 한다. 어려운 프로그래밍 문제를 해결하고 클래스에 입력되면 그 코드는 이후 새로운 코드를 작 성하는 도구로 사용할 수 있다. 예를 들어 프로세싱에서 사용되는 함수와 클래스는 제작자의 코드의 일부였던, 흔히 사용되 는 함수와 클래스에서 파생되었다.
클래스의 인터페이스가 똑같이 남아 있는 한, 내부의 코드는 객체를 사용하는 스케치를 수정하지 않고도 업데이트하지 나 수정할 수 있다. 예를 들어 객체가 x좌표, 좌표, 반지름으로 구성되어 있고 move()와 display()의 이름이 똑같이 남아 있 다면 Spot 안의 실제 코드를 변경할 수 있다. 이것은 프로그래머가 각 객체들에 대한 코드를 전체 프로그램과 독립적으로 다 듣게 해준다.
다른 종류의 변수들처럼 고유 이름을 가진 추가적인 객체를 선언해 객체를 프로그램에 추가할 수 있다. 아래 프로그램은 Spor 클래스에서 만들어진 3개의 객체를 갖고 있다. spl. sp2, sp3이라는 그 객체들은 각각 고유의 필드와 메소드를 가진다.
각 오브젝트의 메소드는 뒤에 닷 연산자와 메소드 이름을 붙여 이름을 서술해 실행한다. 예를 들어 spl. moved() 코드는 spL 객체의 일부인 move() 메소드를 실행한다. 이 메소드가 실행될 때 그 메소드는 객체 안의 필드에 접근한다. sp3이 move( )를 처음 실행할 때 필드 값 >는 speed 필드 값 1.5를 생성자가 sp3로 전했기 때문에 1.5의 값으로 업데이트된다.