고급 클래스 만들기

JScript 클래스를 정의할 때 속성을 할당할 수 있고, 정의된 클래스는 나중에 다른 클래스로부터 상속할 수 있습니다. 필드와 비슷한 클래스 멤버인 속성을 사용하면 데이터 액세스 방법을 제어하는 능력이 향상됩니다. 상속을 사용하면 클래스를 다른 클래스로 확장하거나 다른 클래스에 동작을 추가할 수 있습니다.

클래스의 인스턴스가 expando 속성을 지원하도록 클래스를 정의할 수 있습니다. 이는 클래스 기반 개체가 개체에 동적으로 추가되는 속성과 메서드를 포함할 수 있다는 것을 의미합니다. 클래스 기반 expando 개체는 프로토타입 기반 개체의 기능과 동일한 몇 가지 기능을 제공합니다.

속성이 포함된 클래스

JScript에서는 function get 문과 function set 문을 사용하여 속성을 지정합니다. 접근자 중 어느 하나 또는 두 접근자가 모두 읽기 전용, 쓰기 전용 또는 읽기-쓰기 속성을 만들도록 지정할 수 있습니다. 쓰기 전용 속성은 거의 사용하지 않으며 클래스 설계에 문제가 있다는 것을 나타낼 수 있습니다.

호출하는 프로그램에서는 필드에 액세스하는 방법과 같은 방법으로 속성에 액세스합니다. 두 가지 방법의 차이점은 속성에 액세스하려면 getter와 setter를 사용하지만 필드에는 직접 액세스한다는 것입니다. 속성을 사용하면 클래스에서 유효한 정보만 입력되도록 검사하고, 속성을 읽거나 설정하는 횟수를 기록하며, 동적 정보를 반환하도록 할 수 있습니다.

속성은 대개 클래스의 전용 필드나 보호 필드에 액세스하는 데 사용됩니다. 전용 필드는 private 한정자를 사용하여 표시하며 클래스의 다른 멤버들에만 액세스할 수 있습니다. 보호 필드는 protected 한정자를 사용하여 표시하며 클래스 또는 파생된 클래스의 다른 멤버들에만 액세스할 수 있습니다. 자세한 내용은 JScript 한정자를 참조하십시오.

다음 예제에서는 속성을 사용하여 보호 필드에 액세스합니다. 이 필드는 외부 코드에 의해 값이 변경되는 일을 방지하도록 보호되는 한편 파생된 클래스에서 액세스할 수 있도록 허용합니다.

class Person {
   // The name of a person.
   // It is protected so derived classes can access it.
   protected var name : String;

   // Define a getter for the property.
   function get Name() : String {
      return this.name;
   }

   // Define a setter for the property which makes sure that
   // a blank name is never stored in the name field.
   function set Name(newName : String) {
      if (newName == "")
         throw "You can't have a blank name!";
      this.name = newName;
   }
   function sayHello() {
      return this.name + " says 'Hello!'";
   }
} 

// Create an object and store the name Fred.
var fred : Person = new Person();
fred.Name = "Fred";
print(fred.sayHello());

이 코드는 다음과 같이 출력됩니다.

Fred says 'Hello!'

Name 속성에 공백 이름이 할당되면 오류가 발생합니다.

클래스에서 상속

extends 키워드는 다른 클래스 위에 빌드되는 클래스를 정의하는 데 사용됩니다. JScript에서는 대부분의 일반적인 언어 사양(CLS) 규격 클래스를 확장할 수 있습니다. extends 키워드를 사용하여 정의한 클래스를 파생 클래스라고 하며, 확장되는 클래스를 기본 클래스라고 합니다.

다음 예제에서는 앞의 예제에 나온 Person 클래스를 확장한 새로운 Student 클래스가 정의됩니다. Student 클래스는 기본 클래스에 정의된 Name 속성을 다시 사용하지만 기본 클래스의 sayHello 메서드를 재정의하는 새로운 sayHello 메서드를 정의합니다.

// The Person class is defined in the code above.
class Student extends Person {
   // Override a base-class method.
   function sayHello() {
      return this.name + " is studying for finals.";
   }
}

var mary : Person = new Student;
mary.Name = "Mary";
print(mary.sayHello()); 

이 코드는 다음과 같이 출력됩니다.

Mary is studying for finals.

파생 클래스에서 메서드를 다시 정의하더라도 기본 클래스의 해당 메서드는 변경되지 않습니다.

Expando 개체

일반 개체만 expando 개체이기를 원하는 경우에는 Object 생성자를 사용합니다.

// A JScript Object object, which is expando.
var o = new Object();
o.expando = "This is an expando property.";
print(o.expando);  // Prints This is an expando property.

클래스 중 하나가 expando 개체이기를 원하는 경우에는 expando 한정자를 사용하여 클래스를 정의합니다. expando 멤버에는 인덱스 표기([])를 사용해서만 액세스할 수 있으며 점 표기(.)를 사용해서는 액세스할 수 없습니다.

// An expando class.
expando class MyExpandoClass {
   function dump() {
      // print all the expando properties
      for (var x : String in this)
         print(x + " = " + this[x]);
   }
}
// Create an instance of the object and add some expando properties.
var e : MyExpandoClass = new MyExpandoClass();
e["answer"] = 42;
e["greeting"] = "hello";
e["new year"] = new Date(2000,0,1);
print("The contents of e are...");
// Display all the expando properites.
e.dump(); 

이 프로그램은 다음과 같이 출력됩니다.

The contents of e are...
answer = 42
greeting = hello
new year = Sat Jan 1 00:00:00 PST 2000

참고 항목

개념

JScript 한정자

사용자 정의 클래스 만들기

기타 리소스

클래스 기반 개체

JScript 개체