본문 바로가기

Flash/ActionScript 2.0

[MissFlash의 Flash ActionScript 2.0] 4. 클래스 (2)

* 본 포스트는 "콜린 무크의 Flash ActionScript 2.0"의 내용을 정리, 가공한 것입니다.
* 본 포스트를 퍼가실 때는 상단에 아래와 같이 원본출처를 명시해 주세요! ^^
원본 : http://blog.missflash.com/
출처 : MissFlash.com, http ://www.missflash.com/
* 포스트의 내용중 일부가 추가/수정될 수 있으므로 최신 내용을 접하고 싶으신 분은 원본글을 이용하시기 바랍니다.

4. 메소드

* 메소드의 기본 형태
class ClassName{
 function methodName(param1:type, param2:type, ... , paramn:type):returnType{
  statements
 }
}

* 데이터타입 Void와 연산자 void
Void는 데이터타입으로 메소드의 반환값이 존재하지 않을 경우 Void로 표시합니다.

* 메소드 오버로드(Method overload)
- 메소드의 이름은 완전히 동일하지만 시그너처가 다른 경우를 일컫습니다. ActionScript 2.0은 메소드 오버로드를 지원하지 않습니다.
- 위의 예에서 메소드 시그너처는 methodName(param1:type, param2:type, ... , paramn:type)를 의미합니다. :returnType은 메소드 시그너처에 속하지 않습니다.

1) this를 사용한 오브젝트 참조
this를 사용하는 것은 오브젝트 내부에서 현재 오브젝트를 알 수 있는 방법을 제공합니다.
function getColor(obj:Object):String{
 return obj.color;
}

tico.getColor(tico); // 파라미터로 현재 오브젝트를 전달할 수 있습니다.

2) 현재 오브젝트를 다른 메소드로 전달
* 용어정리
- 디스패처 : 이벤트를 전달하는 곳
- 리스너 : 이벤트를 전달받는 곳
- 이벤트 리스너 : 이벤트를 전달받는 오브젝트

* 오브젝트 삭제 방법
클래스는 오브젝트를 삭제하기 위해 오브젝트에 대한 참조를 먼저 제거해야 합니다.
function enableReset():Void{
 Mouse.addListener(this);
}
function disableReset():Void{
Mouse.removeListener(this);
}

var c:Car = new Car();
c.enableReset();
c.disableReset();
delete c;

A. 파라미터와 속성의 이름 충돌 관리
- this 키워드를 사용해 속성에 접근할 수 있습니다.
- this 키워드는 인스턴스 메소드나 생성자 안에서만 사용할 수 있습니다.
class Car{
 private var color:String; // 인스턴스 속성 color

 function setColor(color:String):Void{ // 메소드 파라미터 color
  this.color = color; // color 파라미터를 color 속성으로 설정
 }
}

3) 메소드 특성
A. static 특성으로 클래스 메소드 선언하기
- 메소드에 static 특성을 사용하면, 클래스의 인스턴스뿐만 아니라 클래스 자신만으로 호출 가능한 메소드를 만들 수 있습니다.
- 클래스 메소드에서는 this 키워드를 사용하지 못합니다.
- 클래스 메소드는 클래스 속성에만 접근해야 합니다.

4) 접근 메소드
* getter / setter
- private로 설정된 오브젝트의 속성을 가져오거나 변경할 수 있는 접근방법이 필요
- getter 메소드 : 속성의 값을 얻는 것
- setter 메소드 : 속성의 값을 변경하는 것

* getColor / setColor와 같은 접근 메소드
class Car{
 private var color:String;
 public function getColor():String{
  return color;
 }
 public function setColor(col:String):String{
  color = col;
}
}

var c:Car = new Car();
c.setColor("white");
trace(c.getColor()); // 출력 : white

5) 지역 변수
* 지역 변수란? : 함수나 메소드의 내부에 정의되고, 함수나 메소드의 실행이 끝나면 자동으로 제거되는 변수
- 코드를 보다 이해하기 쉽게 만들고, 반복적인 메소드 호출이나 속성 검색 과정을 단축시켜줍니다.
- 한 번의 실행과정이 반복되는 동안에 여러 번 결과를 얻기 위해 다른 메소드를 호출하는 것은 오류가 발생할 확률이 높습니다.
- 지역 변수와 같은 이름의 속성을 사용하기 위해서는 this 키워드를 사용해야 합니다.
- 가급적이면, 속성과 동일한 이름의 지역 변수를 사용하지 않는 것이 좋습니다.

6) 메소드에 중첩된 함수
A. 메소드에 중첩된 함수에서 현재 오브젝트에 접근하기
현재 오브젝트를 지역 변수로 저장함으로써 접근할 수 있습니다.

public function createCar():Void{
 var carObj:Car = this;
 function carType():Void{
  trace("Color type : " + carObj.color); // carObj를 통해 현재의 오브젝트에 접근할 수 있습니다.
 }
}

7) Getter, Setter 메소드
* 접근 메소드와 Dot 연산자의 비교
- 접근메소드의 사용 : 불편
c.setColor("white");

- Dot 연산자의 사용 : 편리
c.color = "white";

- Dot 연산자를 활용해 직접 속성에 접근하는 것은 OOP가 추구하는 이상에 어긋나며, 잘못된 데이터 속성을 정의할 수 있습니다. 이 둘을 절충한 것이 getter / setter 메소드입니다.


* getter / setter 메소드의 사용
- getter 메소드의 정의
function get propertyName():returnType{
 statements
}

활용예 : c.color;

- setter 메소드의 정의
function set propertyName(newValue:type):returnType{
 statements
}

활용예 : c.color = "white";

- getter / setter 메소드는 private 속성으로 선언할 수 없습니다.
- getter / setter 메소드와 동일한 이름의 클래스 내부 속성을 생성할 수 없습니다.
class Car{
 private var color_internal:String;

 public function get color():String{
  return color_internal;
 }

 public function set color(col:String):Void{
  color_internal = col;
 }
}

var c:Car = new Car();
c.color = "white";
trace(c.color);

A. 읽기 전용 속성
- getter / setter 가상 속성에서 setter를 선언하지 않고, getter 만 정의하면 읽기 전용 속성으로 사용할 수 있습니다.
- 읽기 전용의 가상 속성 : 클래스 외부에서 읽기만 가능
- private 속성 : 클래스 외부에서 읽고 쓰기 불가능
- public 속성 : 클래스 외부에서 읽고 쓰기 가능

8) 여분의 파라미터 또는 생략된 파라미터
* 활용방법
- arguments.length를 통해 잘못된 파라미터 수가 전달될 때
public function setDimensions (x:Number, y:Number, z:Number):Void{
 if (arguments.length != 3){
  return; // 프로그램을 종료합니다.
 }
}

- 메소드의 값이 없을 때
if (x == undefined){
 return; // 프로그램을 종료합니다. 혹은 x = 100;을 통해 초기값을 설정할 수 있습니다.
}

- 다수의 파라미터를 요구하는 메소드에서 null을 사용하는 방법
setDimensions (null, 100, 200); // 첫 번째 파라미터에 null을 입력함으로써 고의로 누락시킵니다.

* arguments 오브젝트에 담긴 추가 정보
- 현재 메소드에 대한 참조 : arguments.callee (this와 동일하지 않음, this는 메소드가 존재하는 오브젝트를 참조, callee는 메소드 자신을 가리킴)
- 현재 메소드를 실행한 메소드에 대한 참조 : arguments.caller