|
Flash CS4 리소스 |
메서드메서드는 클래스 정의에 포함되는 함수입니다. 클래스의 인스턴스를 만들면 해당 인스턴스에 메서드가 바인딩됩니다. 클래스 외부에 정의된 함수와 달리 메서드는 자신이 연결된 인스턴스와 분리하여 사용될 수 없습니다. 메서드는 function 키워드를 사용하여 정의됩니다. 모든 클래스 속성과 마찬가지로 private, protected, public, internal, static 등의 클래스 속성 특성이나 사용자 정의 네임스페이스를 메서드에 적용할 수 있습니다. 다음과 같은 함수 구문을 사용할 수 있습니다. public function sampleFunction():String {}
다음과 같이 함수 표현식이 지정된 변수를 사용할 수도 있습니다. public var sampleFunction:Function = function () {}
대부분의 경우에는 다음과 같은 이유로 인해 함수 표현식 대신 함수 명령문을 사용하는 것이 좋습니다.
프로토타입 객체에 함수를 연결하려는 경우에는 함수 표현식을 사용해야 합니다. 자세한 내용은 프로토타입 객체을 참조하십시오. 생성자 메서드간단하게 생성자라고도 하는 생성자 메서드는 해당 메서드가 정의된 클래스와 이름이 같은 함수입니다. 생성자 메서드에 포함된 코드는 new 키워드를 사용하여 클래스의 인스턴스를 만들 때마다 실행됩니다. 예를 들어, 다음 코드에서는 status라는 속성 하나가 들어 있는 Example이라는 간단한 클래스를 정의합니다. status 변수의 초기값은 생성자 함수 안에서 설정됩니다. class Example
{
public var status:String;
public function Example()
{
status = "initialized";
}
}
var myExample:Example = new Example();
trace(myExample.status); // output: initialized
생성자 메서드는 항상 공용이지만 public 특성은 생략할 수 있습니다. 생성자에서는 private, protected 또는 internal 등의 다른 액세스 제어 지정자를 사용할 수 없습니다. 또한 생성자 메서드에는 사용자 정의 네임스페이스를 사용할 수 없습니다. 생성자에서는 super() 문을 사용하여 바로 위 수퍼 클래스의 생성자를 명시적으로 호출할 수 있습니다. 수퍼 클래스 생성자를 명시적으로 호출하지 않으면 컴파일러에서 생성자 본문의 첫 명령문 앞에 자동으로 호출을 삽입합니다. super 접두어로 수퍼 클래스를 참조하여 수퍼 클래스의 메서드를 호출할 수도 있습니다. 같은 생성자 본문에서 super()와 super를 함께 사용하려는 경우 super()를 먼저 호출해야 합니다. 그렇지 않으면 super 참조가 정상적으로 작동하지 않습니다. 또한 throw 또는 return 문을 사용하기 전에 super() 생성자를 호출해야 합니다. 다음 예제를 통해 super() 생성자를 호출하기 전에 super 참조를 사용한 결과를 확인해 볼 수 있습니다. 새 클래스인 ExampleEx에서는 Example 클래스를 확장합니다. ExampleEx 생성자에서 super()를 호출하기 전에 수퍼 클래스에 정의된 status 변수에 액세스합니다. 이 경우 super() 생성자가 실행되기 전에는 status 변수를 사용할 수 없으므로 ExampleEx 생성자 내의 trace() 문에서 null 값을 출력합니다. class ExampleEx extends Example
{
public function ExampleEx()
{
trace(super.status);
super();
}
}
var mySample:ExampleEx = new ExampleEx(); // output: null
생성자 내에서도 return 문을 사용할 수 있지만 값을 반환할 수는 없습니다. 즉, return 문에 표현식이나 값을 연결하면 안 됩니다. 따라서 생성자 메서드는 값을 반환할 수 없으며 반환 유형을 지정할 수 없습니다. 클래스에 생성자 메서드를 정의하지 않으면 컴파일러에서 자동으로 빈 생성자를 만듭니다. 클래스에서 다른 클래스를 확장하는 경우에는 컴파일러에서 자동으로 생성되는 생성자에 super() 호출이 포함됩니다. 정적 메서드클래스 메서드라고도 하는 정적 메서드는 static 키워드로 선언되는 메서드입니다. 정적 메서드는 클래스 인스턴스가 아닌 클래스 자체에 연결되며, 개별 인스턴스가 아닌 전체적인 상태에 영향을 주는 기능을 캡슐화하는 데 유용합니다. 정적 메서드는 전체 클래스에 연결되므로 클래스의 인스턴스가 아닌 클래스를 통해서만 액세스할 수 있습니다. 정적 메서드는 클래스 인스턴스의 상태에 영향을 주는 데 국한되지 않는 기능을 캡슐화하는 데 유용합니다. 즉, 클래스 인스턴스의 값에 직접 영향을 주지 않는 기능을 제공하는 메서드는 정적 메서드로 선언해야 합니다. 예를 들어, Date 클래스에는 문자열을 받아 숫자로 변환하는 parse()라는 정적 메서드가 있습니다. 이 메서드는 클래스의 개별 인스턴스에 영향을 주지 않으므로 정적입니다. 대신 parse() 메서드는 날짜 값을 나타내는 문자열을 받아 파싱하여 Date 객체의 내부 표현과 호환되는 형식으로 숫자를 반환합니다. 이 메서드는 Date 클래스의 인스턴스에 직접 적용되지 않으므로 인스턴스 메서드가 아닙니다. 정적 parse() 메서드는 Date 클래스에 속하는 getMonth() 등의 인스턴스 메서드와 대조됩니다. getMonth() 메서드는 Date 인스턴스의 월을 나타내는 특정 구성 요소를 검색하여 인스턴스의 값에 직접 작용하므로 인스턴스 메서드입니다. 정적 메서드는 개별 인스턴스에 바인딩되지 않으므로 정적 메서드 본문 내에서는 this 또는 super 키워드를 사용할 수 없습니다. this 참조와 super 참조는 인스턴스 메서드의 컨텍스트 내에서만 의미가 있습니다. 몇 가지 다른 클래스 기반 프로그래밍 언어와 달리 ActionScript 3.0에서는 정적 메서드가 상속되지 않습니다. 자세한 내용은 상속되지 않는 정적 속성을 참조하십시오. 인스턴스 메서드인스턴스 메서드는 static 키워드 없이 선언된 메서드입니다. 인스턴스 메서드는 전체 클래스가 아닌 클래스 인스턴스에 연결되며, 클래스의 개별 인스턴스에 영향을 주는 기능을 구현하는 데 유용합니다. 예를 들어 Array 클래스에는 Array 인스턴스에 직접 작용하는 sort()라는 인스턴스 메서드가 있습니다. 인스턴스 메서드 본문 내에서는 정적 변수와 인스턴스 변수가 모두 범위에 포함되므로 간단한 식별자를 사용하여 같은 클래스에 정의된 해당 변수를 참조할 수 있습니다. 예를 들어, 다음 CustomArray 클래스에서는 Array 클래스를 확장합니다. CustomArray 클래스에는 클래스 인스턴스의 총 개수를 추적하는 arrayCountTotal이라는 정적 변수, 인스턴스가 작성된 순서를 추적하는 arrayNumber라는 인스턴스 변수 및 이러한 변수의 값을 반환하는 getPosition()이라는 인스턴스 메서드가 정의됩니다. public class CustomArray extends Array
{
public static var arrayCountTotal:int = 0;
public var arrayNumber:int;
public function CustomArray()
{
arrayNumber = ++arrayCountTotal;
}
public function getArrayPosition():String
{
return ("Array " + arrayNumber + " of " + arrayCountTotal);
}
}
클래스 외부의 코드에서는 CustomArray.arrayCountTotal과 같이 클래스 객체를 통해 정적 변수 arrayCountTotal을 참조해야 하지만, getPosition() 메서드 본문 내에 있는 코드에서는 정적 변수 arrayCountTotal을 직접 참조할 수 있습니다. 이는 수퍼 클래스에 있는 정적 변수의 경우에도 마찬가지입니다. ActionScript 3.0에서는 정적 속성이 상속되지 않지만 수퍼 클래스의 정적 속성은 범위에 포함됩니다. 예를 들어, Array 클래스에는 DESCENDING이라는 상수를 비롯한 몇 가지 정적 변수가 있습니다. Array의 하위 클래스에 있는 코드에서는 간단한 식별자를 사용하여 정적 상수 DESCENDING을 참조할 수 있습니다. public class CustomArray extends Array
{
public function testStatic():void
{
trace(DESCENDING); // output: 2
}
}
인스턴스 메서드의 본문 내에서 this 참조의 값은 해당 메서드가 연결된 인스턴스에 대한 참조입니다. 다음 코드에서는 this 참조가 해당 메서드가 포함된 인스턴스를 가리킴을 보여 줍니다. class ThisTest
{
function thisValue():ThisTest
{
return this;
}
}
var myTest:ThisTest = new ThisTest();
trace(myTest.thisValue() == myTest); // output: true
인스턴스 메서드의 상속은 override 및 final 키워드를 통해 제어할 수 있습니다. 상속된 메서드를 다시 정의하려면 override 특성을 사용하고, 하위 클래스에서 메서드를 재정의할 수 없게 하려면 final 특성을 사용합니다. 자세한 내용은 메서드 재정의을 참조하십시오. get 및 set 접근자 메서드getter 및 setter라고도 하는 get 및 set 접근자 함수를 통해 정보 은폐 및 캡슐화라는 프로그래밍 원칙을 준수하면서 클래스에 사용하기 쉬운 프로그래밍 인터페이스를 제공할 수 있습니다. get 및 set 함수를 사용하면 클래스 속성을 클래스 전용으로 유지하면서 클래스 사용자가 클래스 메서드를 호출하는 대신 클래스 변수에 액세스하는 것처럼 이러한 속성에 액세스하도록 허용할 수 있습니다. 이러한 방법을 사용하면 getPropertyName() 및 setPropertyName() 등 이름이 복잡한 기존 접근자 함수를 사용하지 않아도 된다는 장점이 있습니다. 또한 읽기 및 쓰기 액세스가 모두 허용되는 속성마다 두 개의 공용 함수를 만들지 않아도 됩니다. GetSet이라는 다음 예제 클래스에는 privateProperty라는 전용 변수에 대한 액세스를 제공하는 publicAccess()라는 get 및 set 접근자 함수가 있습니다. class GetSet
{
private var privateProperty:String;
public function get publicAccess():String
{
return privateProperty;
}
public function set publicAccess(setValue:String):void
{
privateProperty = setValue;
}
}
다음과 같이 privateProperty 속성에 직접 액세스하려고 하면 오류가 발생합니다. var myGetSet:GetSet = new GetSet(); trace(myGetSet.privateProperty); // error occurs GetSet 클래스 사용자는 속성처럼 보이는 publicAccess라는 항목을 대신 사용하게 되지만, 실제로 이는 privateProperty라는 전용 속성에 작용하는 get 및 set 접근자 함수 쌍입니다. 다음 예제에서는 GetSet 클래스를 인스턴스화한 다음 publicAccess라는 공용 접근자를 사용하여 privateProperty의 값을 설정합니다. var myGetSet:GetSet = new GetSet(); trace(myGetSet.publicAccess); // output: null myGetSet.publicAccess = "hello"; trace(myGetSet.publicAccess); // output: hello getter 및 setter 함수를 사용하여 수퍼 클래스에서 상속된 속성을 재정의할 수도 있습니다. 일반적인 클래스 멤버 변수를 사용할 때는 이러한 작업이 불가능합니다. var 키워드로 선언된 클래스 멤버 변수는 하위 클래스에서 재정의할 수 없습니다. 그러나 getter 및 setter 함수를 사용하여 만든 속성에는 이러한 제한이 없습니다. 수퍼 클래스에서 상속된 getter 및 setter 함수에 override 특성을 사용할 수 있습니다. 바인딩된 메서드메서드 클로저라고도 하는 바인딩된 메서드는 해당 인스턴스에서 추출된 메서드입니다. 바인딩된 메서드의 예로는 함수에 인수로 전달된 메서드 또는 함수에서 값으로 반환된 메서드가 있습니다. ActionScript 3.0에 새로 도입된 바인딩된 메서드는 인스턴스에서 추출되어도 의미상의 환경이 유지된다는 점에서 함수 클로저와 비슷합니다. 그러나 바인딩된 메서드에서는 this 참조가 해당 메서드를 구현하는 인스턴스에 연결된 상태로 유지된다는 점에서 함수 클로저와 다릅니다. 즉, 바인딩된 메서드의 this 참조는 항상 메서드를 구현한 원래 객체를 가리킵니다. 함수 클로저의 경우에는 this 참조가 일반적이므로 호출 시점에서 함수에 연결된 객체를 가리킵니다. this 키워드를 사용하는 경우 바인딩된 메서드를 잘 이해해야 합니다. this 키워드는 메서드의 부모 객체를 참조합니다. 대부분의 ActionScript 프로그래머는 this 키워드가 항상 메서드 정의가 들어 있는 객체 또는 클래스를 참조하리라고 예상합니다. 그러나 메서드 바인딩을 사용하지 않으면 그렇지 않을 수도 있습니다. 예를 들어, 이전 버전의 ActionScript에서는 this 참조가 메서드를 구현한 인스턴스를 참조하지 않을 수도 있었습니다. ActionScript 2.0의 경우 인스턴스에서 메서드를 추출하면 this 참조가 원래 인스턴스에 바인딩되지 않을 뿐만 아니라 인스턴스 클래스의 멤버 변수 및 메서드를 사용할 수 없습니다. ActionScript 3.0에서는 메서드를 매개 변수로 전달할 때 바인딩된 메서드가 자동으로 만들어지므로 이러한 문제가 없습니다. 바인딩된 메서드를 사용하면 this 키워드가 항상 메서드가 정의된 객체 또는 클래스를 참조하게 됩니다. 다음 코드에서는 ThisTest라는 클래스를 정의합니다. 이 클래스에는 바인딩된 메서드를 정의하는 foo()라는 메서드 및 바인딩된 메서드를 반환하는 bar()라는 메서드가 있습니다. 클래스 외부에 있는 코드에서는 ThisTest 클래스의 인스턴스를 만들고 bar() 메서드를 호출한 다음 반환 값을 myFunc라는 변수에 저장합니다. class ThisTest
{
private var num:Number = 3;
function foo():void // bound method defined
{
trace("foo's this: " + this);
trace("num: " + num);
}
function bar():Function
{
return foo; // bound method returned
}
}
var myTest:ThisTest = new ThisTest();
var myFunc:Function = myTest.bar();
trace(this); // output: [object global]
myFunc();
/* output:
foo's this: [object ThisTest]
output: num: 3 */
코드의 마지막 두 행을 보면 this 참조는 전역 객체를 가리키지만 바인딩된 메서드인 foo()의 this 참조는 계속 ThisTest 클래스를 가리키는 것을 알 수 있습니다. 또한 myFunc 변수에 저장된 바인딩된 메서드에서는 ThisTest 클래스의 멤버 변수에 계속 액세스할 수 있습니다. 이 코드를 ActionScript 2.0에서 실행하면 this 참조가 서로 일치하게 되고 num 변수는 undefined가 됩니다. 바인딩된 메서드를 사용하는 것이 특히 유용한 부분은 이벤트 핸들러입니다. addEventListener() 메서드에는 함수 또는 메서드를 인수로 전달해야 하기 때문입니다. 자세한 내용은 이벤트 리스너에서 클래스 메서드로 정의되는 리스너 함수를 참조하십시오. |