RCP/SWT & JFACE

RCP프레임워크 재료인 SWT 소개와 단점

반응형

SWT


swt 소개

 SWT는 각 운영체제마다 운영체제 고유의 UI 모양과 동작을 제공하는데, 실제로 UI를 운영체제의 자원을 이용하여 구성하고, 그 동작을 운영하는 것도 운영체제이기 때문이다. 예를 들어 윈도우즈용 SWT는 GDI(Graphic Device Interface. 마이크로 소프트 윈도우즈의 어플리케이션 개발 API)자원을 이용하여 UI를 만든다.



swt 단점 - 자원의 한계

 단점으로, 운영체제 자원을 추상화한 SWT 객체는 사용이 끝나면 dispose() 메서드를 호출해 반드시 운영체제에게 돌려주어야 한다. 만약 너무 많은 수의 운영체제 자원을 할당 받으면, 실행중인 다른 응용프로그램까지 악영향을 미칠 수 있고, 운영체제가 더이상 자원을 할당하는 것을 거부할 수 도 있다.


swt 단점 - 메모리 누수

그렇다면 사용이 끝난 후, 일일히 모든 컨트롤들의 dispose()를 호출하여 운영체제에게 자원을 돌려주어야 할까?

- 계층 구조의 운영체제 자원은 최상위 핸들만 반환하여도, 하위 자원은 자동으로 반환되기때문에 SWT도 최상위 Shell 객체를 반환하면 모두 반환될것 같지만 실제로 break point를 걸어보면 그렇지 않다. 그렇기 때문에 다음과 같은 절차를 통해서 dispose를 진행해야 메모리 누수를 막을 수 있다.


화면 전체 Shell 위에 canvas라는 자식 이 존재하는 경우에 canvas객체가 Coler이라는 운영체제 자원을 사용한다고 가정하여보자

Shell이 dispose()를 통해 반환이 되었을때 자식 객체인 Canvas 또한 반환되는 작업이 실행된다.

하지만 Canvas에서 포함되던 window 자원인 Color은 반환되지 않는다.



그렇기 때문에 메모리 누수가 진행된다. 


해결방법


public class MyCanvas extends Canvas{

  // 이 커스텀 SWT 클래스가 사용하는 운영체제 자원.

  private Color canvasColor;

 

  public MyCanvas(Color canvasColor){

    super();

    Assert.isLegal(canvasColor != null && !canvasColor.isDisposed());

    this.canvasColor = canvasColor;

    this.addListener(SWT.Dispose, new Listener(){

      handleEvent(Event e){

        handleDispose();

      }

    });

  }

 

  /**

   * 이 커스텀 컨트롤이 사용하던 자원을 모두 반환 함.

   */

  private handleDispose(){

    canvasColor.dispose();

  }

}

반응형