2018년 9월 디자인과 코딩을 함께 다루는 유튜브 채널을 열었습니다. "타입과 미디어" 사이트는 당분간 유지할 계획이지만, 새로운 정보는 유튜브 비디오를 통해서 소개하겠습니다. 많은 관심 부탁드립니다! — 정대인

변수와 데이터

세부 목차

콘솔

프로세싱 편집창의 아래부분의 검은 텍스트 영역을 콘솔(console)이라고 합니다. 프로세싱의 콘솔에는 직접 데이터를 입력할 수는 없지만, 스케치의 작동 상황에 관한 다양한 데이터를 표시할 수 있고, 스케치에 문제가 있을 때에는 에러 메시지가 표시되기도 합니다.

콘솔에 출력하기

변수에 대해서 알아보기 이전에 println()을 살펴보겠습니다. println()함수는 프로세싱 에디터의 아래쪽에 위치한 콘솔에 원하는 값을 출력해주는 함수입니다.

프로세싱에서 기본으로 제공하는 frameCount 변수를 콘솔에 출력해보겠습니다.

void setup() {
	size(600, 200);
}

void draw() {
	println(frameCount);
}

위와 같이 프로세싱 에디터에 적고, 스케치를 실행합시다. 콘솔 창에 무엇이 표시되나요? 프로세싱 실행창이 아니라 에디터 아래쪽에 있는 검은 콘솔을 봐야합니다. 제대로 코드를 입력했다면 1부터 시작해서 점점 증가하는 숫자가 출력되는 것을 볼 수 있을 것입니다. frameCount란 프로세싱 자체에서 제공하는 시스템 변수입니다. 프로세싱 실행화면에는 아무런 변화가 없지만(우리가 적어넣은 코드가 없기 때문이지요), 프로세싱 화면이 리프레시될 때마다 frameCount1씩 증가하는 것입니다.

또다른 시스템 변수 frameRate을 살펴보겠습니다. 아래와 같이 코드를 적고 실행합시다.

void setup() {
	size(600, 200);
}

void draw() {
	println(frameRate);
}

위의 코드를 실행하면, 콘솔에 출력되는 값은 현재의 프레임레이트입니다. 프로세싱은 기본적으로 60fps(초당 프레임수; frames per second)를 유지하려고 합니다. 하지만, 복잡한 연산을 수행할 경우에는, 이 속도를 못 쫓아오는 경우가 발생하고, 따라서 프레임레이트도 떨어지게 됩니다. 또, 같은 코드라고 해도 실행하는 컴퓨터의 성능과 환경에 따라서 다른 프레임 레이트가 나올 수 있습니다.

변수

우리가 만든 스케치를 실행하면, 그 스케치 내에서 쓰인 모든 데이터는 임시로 컴퓨터의 메모리 공간 어딘가에 저장됩니다. 램(RAM; random-access memory)이 그런 저장공간 역할을 합니다. 데이터를 저장하고 있는 각 메모리 공간에는 주소가 있습니다. 0x7fff9575c058 이런 식이지요. 그런데 우리가 데이터를 불러 쓰고자 할 때마다 저렇게 암호같은 주소를 기억하는 것은 너무 힘든 일일 것입니다. 그래서 부르기 편한 이름/주소를 붙일 수 있습니다. 예를 들어, 누군가의 나이를 저장하고 불러와서 사용할 때, 0x7fff9575c058라고 부르는 것보다는 age라고 부르는 것이 사용하기도 편하고 기억하기도 쉽겠지요.

각 메모리 공간에는 고유주소가 있다고 했습니다. 현실 세계에서의 주소와 마찬가지로, 지금 영희가 어떤 주소에 살고 있다면, 나중에 영희가 이사가고, 철수가 같은 주소에 들어올 수 있습니다. 그 때, 그 주소에 가서 벨을 누르면, 영희 대신 새로 온 철수가 마중나오겠지요? 이렇게 변수(variable)가 가리키는 값은 변할 수 있습니다. 반면, 변하지 않는 값은 상수(constant)라고 합니다. 우리가 앞서 살펴본 PI가 이에 해당합니다.

기본 자료형

프로세싱이 제공하는 기본 자료형(primitive data types)을 살펴봅시다. 변수와 데이터에 대해서 이야기할 때, 또다른 비유법으로 상자를 말하기도 합니다. 물건의 종류와 크기, 모양에 따라서 사용하는 상자가 달라지지요? 프로세싱에서도, 데이터의 종류에 따라서 알맞는 자료형을 사용해야 합니다.

변수의 선언과 초기화

변수를 사용하기 위해서는 제일 먼저 선언(declare)해야 합니다.

int age;

위의 코드의 의미는 age라는 이름을 가진 정수형int 데이터를 앞으로 사용하겠다고 알리는 것입니다. 먼저 선언을 하고, 변수에 초기값을 부여할 수 있습니다. 아래에 같이 쓰고, 스케치를 실행합시다.

int age; // declaration

age = 21; // initialization

println(age);

또는 아래에 같이 선언과 초기화를 동시에 할 수도 있습니다.

int age = 21;

등호의 의미

수학에서 등호 =의 의미는 왼쪽과 오른쪽의 값이 같다는 의미입니다. 하지만, 프로세싱에서 등호는 다른 의미를 가집니다. 프로세싱에서 등호의 의미는 오른쪽의 값을 왼쪽에 할당(assign)하라는 의미입니다. 위의 예제의 경우 21age변수에 할당하라는 의미입니다. int age ← 21; 이렇게 화살표를 생각하면 이해가 쉬울 수도 있습니다.

양쪽의 값이 같다는 의미로 표현하려면, ==, 이렇게 두 개의 등호를 붙여서 사용해야 합니다.

int age  = 21;
println(age == 21);

위의 경우, 양쪽의 값을 비교해서 age21이 참이므로, true가 출력됩니다. true가 무엇인지는 아래 boolean에서 다루겠습니다.

변수에 값을 할당하기

일단, 변수를 선언했으면, 자유롭게 변수의 값을 바꿔줄 수 있습니다. 예를 들어서, 영희이 나이는 21세였지만, 해가 바뀌어 22세가 되었습니다. 이에 따라 우리의 변수 age의 값도 처음 초기화했던 21에서 22로 변경해줘야 합니다.

int age = 21;
println("She is " + age + " years old");

// next year, she is 22 years old

age = 22;
println("Now, she is " + age + " years old");

int

위에서 살펴본 바와 같이 int는 정수를 담을 수 있습니다.

int numBooks = 121;

float

float은 실수를 담을 수 있습니다.

float temperature = 21.5;

1.0int를 사용해야 할까요, float을 사용해야 할까요? 소수점이 있기 때문에 float을 사용해야 합니다.

boolean

boolean은 논리 자료형이라고 부르며, 참 true 또는 거짓 false, 둘 중 하나의 값만을 가집니다.

boolean graduated = false;
println(graduated);
graduated = true;
println(graduated);

char

char는 문자 한 글자를 담을 수 있습니다. 프로세싱에서 char의 값은 작은따옴표로 감싸줘야 합니다.

char c = 'a';
println(c);

char h = 'ㅎ';
println(h);

color

colorcolor()함수를 이용해서 값을 할당할 수 있습니다.

color c = color(255, 0, 0); // red
background(c);

String

문자열 String은 복수의 문자를 담을 수 있습니다. 기본 자료형이 아니라 클래스형이기 때문에 대문자 S로 시작한다는 점을 주의하세요.

String s = "안녕하세요";
println(s);

변수를 사용하는 이유?

대체 변수를 사용하는 이유는 무엇일까요? 여러가지 다른 이유가 있지만, 몇가지를 살펴보겠습니다.

변수 이름짓기

변수의 이름은 서술적으로 짓는 것이 좋습니다. 이름만 보고도 그 변수가 어떤 용도로 쓰이는지 이해가 되게 지어야 합니다.

int a = 50;

위에서 대체 a는 무엇일까요? a의 값이 50이라는 것은 알겠지만, 그 이상의 어떤 정보도 주지 않습니다.

int numPeople = 50;

이 경우에는 50이라는 값이 사람의 수를 나타낸다는 것을 바로 알 수 있습니다. 변수의 이름을 지을 때, a와 같은 무의미한 이름은 피하도록 합시다.

int theNumberOfHamburgersIeatPerDay = 2;

위의 경우, 변수의 용도는 정확하게 파악되지만, 이름이 길면 길수록 코딩에 방해가 됩니다. 변수를 사용할 때마다 긴 이름을 틀리지 말고 입력해야 하고, 코드가 쓸데없이 길어지기 때문입니다.

변수의 스코프 Variable Scope

변수의 선언을 어디서 했느냐가 중요하게 작용하는 경우들이 있습니다. setup()draw() 바깥에서 만들어진 변수는 전역변수(global variable)라고 합니다. 이렇게 만들어진 변수는 프로세싱 코드 어디에서나 접근할 수 있습니다.

int a = 3;

void setup() {
	size(600, 200);
}

void draw() {
	println(a); // no problem!
}

하지만, 함수의 내부에서 선언된 변수는 지역변수(local variable)라고 하며, 선언된 함수 내에서만 사용이 가능합니다.

void setup() {
	size(600, 200);
	int a = 3;
}

void draw() {
	println(a); // NOT GOOD!!
}

따라서 변수가 어디서 어떻게 쓰일지를 잘 생각해서 변수를 알맞은 위치에서 선언해야 합니다. 스케치 전체에서 쓰일 데이터라면 전역변수로 만들어주고, 스케치의 일부분에서만 쓰일 데이터라면, 지역변수로 만들어주면 됩니다.

프로세싱에서 제공하는 시스템 변수

자주 쓰는 시스템 변수를 몇 가지 알아보겠습니다.