클래스 정의 공통적인 객체 메서드

Development Javascript

클래스 정의 공통적인 객체 메서드

toString()메서드

  • 하나의 클래스를 정의하면 클래스의 인스턴스가 문자열로 변환할 수 있게 반드시 toString()메서드를 정의해야 한다.
  • 이 문자열에는 변환되는 객체에 대한 정보가 들어있어야 하는데, 이렇게 해두면 나중에 디버깅할 때 유용하게 사용할 수 있다.
  • 문자열이 적당하게 구성되면 그 자체만으로도 프로그램 내에서 유용한 정보가 될 수 있다.

Circle클래스에 toString()메서드를 정의한 예

Circle.prototype.toString = function()
{
    return "[Circle of radius " + this.r + ", centered at (" + this.x + ", " + this.y + ").]";
}

valueOf() 메서드

  • valueOf() 메서드는 toString()과 상당히 유사하지만, 자바스크립트가 객체를 Number 같은 문자열 외에 기본 타입으로 변환하려 할 때 호출하게 된다.
  • 어떤 경우에는 객체를 문자열로 변환할 때 toString() 메서드보다 valueOf 메서드의 우선순위가 더 높아진다.
  • 클래스에 valueOf() 메서드를 정의해 놓았다면 객체를 문자열로 바꾸고 싶을 때 toString() 메서드를 명시적으로 써주어야 한다.

Complex 클래스에서의 예

alert("c = " + c); // valueOf를 사용한다. 화면에는 'c = 7'이 표시된다.
alert("c = " + c.toString()); // 화면에는 'c = {7,5}'가 표시된다.

비교 메서드

  • 자바스크립트의 동등 연산자는 값이 아닌 참조를 통해 객체를 비교한다. 즉 두 객체의 참조가 주어졌을 때 이 연산자들은 두 참조가 같은 객체를 가리키는지 검사한다.
  • 클래스의 인스턴스들이 서로 동등한지 검사할 수 이쎄 하려면 equals()라는 인스턴스 메서드를 정의한다.
  • 객체를 <나 <=같은 관계연산자와 함께 사용하려면 자바스크립트는 우선 객체를 valueOf() 메서드를 호출한 후 이 메서드가 기본 타입의 값을 반환하면 이 값을 비교한다.
  • 클래스의 인스턴스를 비교하는 한 가지 이유는 인스턴스들을 배열로 만들어 자장할 때 순서를 매길 수 있기 때문이다.

compareTo() 메서드가 주어지면 Complex 객체의 배열을 쉽게 정렬할 수 있다.

complexNumbers.sort(function(a,b) {
    return a.compareTo(b);
});

정렬을 위해서 static compare() 메서드를 compareTo() 인스턴스 메서드가 정의되어 있는 클래스에 집어넣는 코드

Complex.compare = function(a,b) {
    return a.compareTo(b);
}
complexNumbers.sort(Complex.compare);
  • equals()와 compareTo() 메서드를 같은 클래스에 구현한다면 이 두 메서드의 의미가 서로 일치하게 하는 것이 좋다. '같다'는 것에 대한 의미가 일치하지 않는 코드는 버그에 치명적일 수 있다.
  • 아래 코드는 Complex 객체에서 equals()메서드와 의미를 같게 만든 compareTo() 메서드다.

우선 복소수의 실수부가 같은지 비교한다. 만약 같다면 허수부를 비교한다.

Complex.prototype.compareTo = function(that)
{
    var result = this.x - that.x; // 뺄셈을 이용하여 실수부를 비교한다.
    if (result == 0) { // 만약 같다면
        result = this.y - that.y; // 허수부를 비교한다.
    }
    // 이제 this.equals(that)와 같은 의미로 0을 만들었다.
    return result;
}