최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

프로그래밍 언어에서 공통의 요소를 하나의 interface로 만들어서 implements로 구현상속을 시킨 후

 

기능구현은 그 구현상속된 클래스에서 동작하게된다.

 

예를 들어서 "자동차"라는 객체가있다. 


프로젝트 안에서 한개가 아닌 쿠페, 레미콘, 세단, 포크레인, 렉카 등이 사용되고 자동차를 움직이는 드라이버는 어떠한 자동차이건


 페달(브레이크,악셀)을 밟아서 사용하게된다.

 

이때 드라이버는 항상 페달(브레이크,악셀)을 사용하고, 자동차의 종류를 바꾸고 싶을 경우에는 행위를 바꾸는게 아니라 


자동차모델만 변경 시켜서 운전을 하면된다. (자동차를 이용한 인터페이스는 다음 포스팅에서 자세히 설명.)

 

일단 이론적으로 interface가 필요한 이유는, 다형성에따른 다중상속 그리고 각각의 객체를 interface로 캐스팅하여 공통된 요소를 


사용 할 수 있기 때문이다. 추후에 디자인 패턴을 공부하게 되면서 다중상속에 대한 필요성과 의미를 다시 알게 될것이다.

 

다음은 여러가지 "버튼"이 있다고 가정하고, 버튼은 항상 "클릭"이라는 기능을 가지고 있을 때

 

사람(행위자)가 그저 버튼을 눌러 사용 하게 된다면 다음과 같이 응용 할 수 있다. (대략 생각나는대로 예제를 만들어 본 것..)

 

인터페이스_기초.zip

 

Main.as

package  {
 
 import flash.display.Sprite;
 
 public class Main extends Sprite {
  
  private var _person:Person;

  public function Main() {
   
   if(!_person) _person = new Person(new Button());
   _person.personUseButton();
  }

 }
 
}


Main.as는 도큐먼트 클래스이다.

 

11 : Person(사람:행위자)객체는 버튼을 누르는 동작을 가진 객체이다. person객체는 오로지 버튼을 클릭하는 메서드 밖에 없다.

 

      버튼으로 new Button을 Person의 멤버변수로 넘겨준다. 만약 클릭 기능을 가진 여러가지 버튼 객체가 있을경우

 

      _person = new Person(new ButtonOther()); 으로 다양하게 확장되어 사용되어 질 수 있다. (중요)

 

12 : person객체가 클릭을 시도한다.

 



IButton.as

package  {
 import flash.events.IEventDispatcher;
 
 public interface IButton extends IEventDispatcher {

  function set clicked($str:String):void;
  function get clicked():String;

 }
 
}


IButton 객체는 버튼객체의 인터페이스이다.

 

2 : Button 객체안에 이벤트를 전파하므로 IEventDispatcher를 상속받았고

 

6,7 : set과 get 메서드를 사용하여 더욱유연하게 대처 할 수 있다.

 

Button.as

package  {
 
 import flash.events.EventDispatcher;
 import flash.events.Event;
 
 public class Button extends EventDispatcher implements IButton{

  private var _lastClicked:String;
  public static const BUTTON_CLICK:String = "button_click";
  
  public function Button() {
   super();
  }
  
  public function set clicked($str:String):void{
   _lastClicked = $str;
   dispatchEvent(new Event(BUTTON_CLICK));
  }
  
  public function get clicked():String{
   return _lastClicked;
  }

 }
 
}


Button.as에서는

 

6 : 구현상속을 받은 후,

 

15 : clicked 메서드가 실행되면 바뀐내용을 dispatchEvent를 사용하여 전파한다.

 



Person.as

package {
 import flash.events.Event;
 
 public class Person{
  
  private var _button:IButton;
  
  public function Person($button:IButton){
   
   _button = $button;
   _button.addEventListener(Button.BUTTON_CLICK, clickComplete);
  }
  
  public function personUseButton(){
   _button.clicked = "버튼클릭";
  }
  
  public function clickComplete(e:Event):void{
   trace(_button.clicked);
  }
 }
 
 
}


Person 행위자에서는

 

8 : IButton 데이터타입 이지만, 아까 위에서 언급했던 Main.as에서 넘겨주는 값을 살펴보면 Button을 넘겨 주었다.

 

    즉, 구현은 Button객체에서하고 동시에 Button객체를 받았지만 동작할때는 IButton타입을 받아서 인터페이스로 사용하여 동작한다. (중요)

 

10 : button객체를 IButton데이터형의 _button 객체로 정의하고

 

15 : 행위자가 버튼을 클릭하게 되면 button객체의 dispatchEvent가 발생하게되고

 

11 : 등록된 리스너에 의해 18번 라인을 실행한뒤 반환받는다.

 


댓글