If you're seeing this message, it means we're having trouble loading external resources on our website.

웹 필터가 올바르게 작동하지 않으면 도메인 *. kastatic.org*.kasandbox.org이 차단되어 있는지 확인하세요.

주요 내용

정적 함수 vs. 인스턴스 메소드

알고리즘 #3 (마우스를 따라 가속)을 살펴보기 전에 벡터와 PVector객체를 사용할 때 필요한 중요한 개념을 이해해야 할 필요가 있습니다. 정적(static) 메소드와 인스턴스(instance) 메소드를 사용하는 것에 무슨 차이가 있는지 알아봅시다.
잠시 벡터를 잊고 아래 코드를 살펴봅시다.
var x = 0;
var y = 5;
x = x + y;
꽤 단순하지요? x 값은 0이고 y를 더해 x는 5가 됩니다. 이 코드를 PVector에 대해 배운 것을 기반으로 꽤 쉽게 다시 쓸 수 있습니다.
var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
벡터 v의 값은 (0,0)이고 v에 u를 더해 v는 (4,5)가 됩니다.
단순한 계산의 또 다른 예를 살펴 보겠습니다:
var x = 0;
var y = 5;
var z = x + y;
x의 값은 0이고 여기에 y를 더해 그 결과를 새로운 변수 z에 저장합니다. 이 예제에서는 x의 값이 변하지 않고 y 값도 변하지 않습니다! 별로 중요해 보이지 않기도 하고 수학의 관점에서 생각하면 너무 당연한 말입니다. 그러나 PVector의 연산은 그렇게 명확하지 않습니다. 지금까지 아는 것을 기반으로 코드를 작성해 보겠습니다.
var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // 속지마세요. 이 코드는 올바르지 않습니다!!!
위 코드는 알맞게 짐작한 것처럼 보일 수 있지만 PVector 객체는 이렇게 쓸 수 없습니다. add()의 정의를 살펴 보면...
PVector.prototype.add = function(v) {
    this.x = this.x + v.x;
    this.y = this.y + v.y;
 };
... 이 코드로는 위에서 우리가 원하는 것을 할 수 없습니다. 첫째, 새로운 PVector를 반환하지 않고(return 문이 존재하지 않습니다) 둘째, 호출된 PVector의 값을 변경합니다. 두 개의 PVector 객체를 더한 후 결과로 새로운 PVector를 반환하기 위해서는 반드시 "정적인" add() 함수를 이용해야 합니다.
"정적" 함수는 객체에 대해 정의되는 함수지만 객체의 프로퍼티를 변경하지 않습니다. 그러면 과연 객체에 대해 정의할 필요가 있을까요? 일반적으로 객체와 관련이 있는 것은 객체에 붙이는 것이 논리적이기 때문입니다. 정적 함수는 객체를 명칭공간(namespace) 처럼 다룹니다. 예를 들어 PVector에 대한 모든 정적 함수는 전송된 PVector 객체로 무엇이든 처리하고 항상 값을 반환합니다. 같은 방식으로 작동할 전역 함수를 정의할 수도 있지만 이렇게 하면 전역 함수를 만들지 않고 관련된 함수끼리 묶을 수 있습니다.
한 번 대조해봅시다. 다음은 add() 인스턴스 메소드를 사용하는 방법입니다.
v.add(u);
이 줄은 v를 수정하므로 반환 값을 저장할 필요가 없습니다. 반대로 다음은 add() 정적 함수를 이용하는 방법입니다.
var w = PVector.add(v, u);
만약 해당 함수의 결과를 변수에 저장하지 않으면 이 코드는 쓸모가 없습니다. 정적 함수는 객체 자체를 변경하지 않기 때문입니다. PVector의 정적 함수를 이용하면 PVectors 입력값 일부를 변형하지 않고 PVector 객체에 대한 일반적인 수학 연산을 수행할 수 있습니다.
다음은 add()를 정적 함수로 만드는 방법입니다.
PVector.add = function(v1, v2) {
  var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
  return v3;
};
여기에는 여러 가지 차이점이 있습니다.
  • 객체의 프로토타입이 아닌 객체에 대해 직접적으로 함수를 정의합니다.
  • 함수 내부의 this 키워드에 절대로 접근하지 않습니다.
  • 함수로부터 값을 반환합니다
PVector 객체의 add(), sub(), mult(), div() 함수는 모두 정적 함수로 나타낼 수 있습니다. 또한 angleBetween(), dot(), cross()와 같이 해당하는 인스턴스 메소드가 존재하지 않는 정적 함수도 있습니다. PVector를 이용하여 프로그램을 만들 때 계속해서 이러한 함수들을 이용하게 될 것입니다.

본 "내추럴 시뮬레이션" 과정은 다니엘 쉬프만(Daniel Shiffman)이 저술한 "The Nature of Code"의 내용을 차용한 것이며, 본 내용물의 저작권은 Creative Commons Attribution-NonCommercial 3.0 Unported License를 적용합니다.