클래스는 어떠한 프로젝트를 만들때 우리가 필요한 기능들을 묶어 처리하는 하나의 캡슐과도 같은 것이다.
그안에 해당되는 기능/처리에 필요한 많은 명령문과 함수(메서드)를 만들게 된다. 보통 클래스는 public이나 internal로 선언해서 만든다.


사용자 삽입 이미지


그림과 같이 플렉스에서는 새로운 클래스를 만들때 패키지(클래스의 포함경로)와 이름을 정하게 되고 접근제한자를 public/internal중에 한개를 선택하게 되어있다.
superClass에는 상속받을 부모의 클래스를 넣어주면 자동으로 네임스페이스를 클래스 내부에 선언하게 된다.
Interface의 경우에는 구현할 인터페이스의 경로를 설정한다.

사용자 삽입 이미지

그림은 패키지를 com.test라는 경로로 선언하였다. 그러면 com폴더에  test폴더에 저장이 된다.
* 패키지 : 클래스를 그룹화하여 서로 충돌없이 사용하도록 폴더의 구조를 나누는 것이다.
com.test라고 선언한다면 생성하는 클래스는 com이라는 폴더에 test라는 폴더 및에 생성하게 된다.
관행적으로 패키지 이름은 소문자로 한다.
클래스 이름은 관행적으로 첫문자를 대문자로 사용한다. 그리고 Test라고 선언한 클래스이름과 같은 이름(Test.as)으로 파일이 생성하게 된다.
* 클래스이름과 파일명은 항상 같은 이름으로 일치시켜야 한다. 만약 이후 클래스명이나 파일명이 수정되면 둘다 같은 이름으로 일치시키도록 한다.
클래스의 스코프는 전체패키지에서 접근가능하도록 public으로 설정하였고 상속받을 부모는 Sprite(프레임 없는 무비클립)을 상속받았다..
* 상속을 받지 않고 클래스를 생성하면 기본적으로 최상위 클래스인 Object를 상속받게 된다.
실행하면 아래의 그림처럼 클래스가 생성된다.
사용자 삽입 이미지

[ com -> test -> Test.as ]


Test의 소스코드를 보면 아래와 같다.
package com.test
{
 import flash.display.Sprite;
flash라는 폴더에 display라는 폴더에 Sprite 클래스를 임포트하였다.
위의 클래스는 어도비에서 제공하고 플렉스빌더의 sdk에 swc형태로 저장되어있다.
* swc : 라이브러리 프로젝트로 압축된 파일안에 소스코드를 저장해 넣은 클래스집합

 public class Test extends Sprite
Sprite에서 상속을 받았기 때문에 Test클래스는 Sprite의 extends이다

 {
  public function Test()
  {
   super();
  }
이부분이 생성자이다 패키지 어디에선가 이 클래스를 사용하고자 생성시킬때 이 부분이 실행하게 되며
반드시 생성자에는 반환타입이 없다.
super()라는것은 부모의 생성자를 의미한다. 여기서는 Sprite의 생성자를 호출하게 된다.
* parent는 계층구조상 상위의 개념
* super는 상속에서의 상위 개념
 
 }
}

사용자 정의 클래스를 만들어 보았다...이를 다시 상속받는 클래스를 하나 더 만들어보고 비교하면 금방 이해가 가실 것이다.

앞서 만든 Test를 상속받는 클래스 Test2를 com.test2라는 패키지에 만들어 본다.

사용자 삽입 이미지

그림처럼 설정하고 실행하면 아래의 경로에 클래스가 생성되게된다.
사용자 삽입 이미지

소스코드는 아래와 같다
package com.test2
{
 import com.test.Test;

 public class Test2 extends Test
 {
  public function Test2()
  {
   super();
  }
 
 }
}

이 클래스는 Test를 상속받았다 Test클래스는 Sprite를 상속받았으므로 Test2에는 Sprite성분과 Test성분을 모두 포함하고 있다.

* 클래스의 캡슐화 : 클래스를 만들 때 유념해야 할것은 각 메서드의 스코프를 잘 정의하고 내부에서만 사용하는 메서드는 외부에서 접근이 불가능하게 하고 다른 클래스 메서드와의 충돌이나 에러 발생율를 최소한으로 하여 "한 덩어리"로서 자신의 역할만을 충실히 수행하도록 하는 것이 좋다.

Posted by 버터백통

어떠한 에러가 발생하였을 때 적절한 실행문을 실행하고자 할때는 throw문을 이용하여 탐지하도록 한다.
문법에러인 경우에는 개발시 컴파일러가 잡아주지만 그외의 에러인 경우에는 이를 통해 제어할 수 있다.
가령 동적객체에서 발생하는 에러라던가 네트웍 등에서 발생하는 에러인경우에 유동적으로 대처를 할 수 있다

* throw문은  에러를 순간 발생 시켜 Error객체를 생성하게 된다.
throw new Error( argument )
Error 객체의 생성자에는 문자열로 값을 받도록 되어있어 어떠한 에러인지를 메세지처리 할 수있다.
throw new Error( "필요한 값을 받지 못했습니다." );
throw new Error( "네트워크에 연결되지 않았습니다." );
..............
등과 같이 필요한 메세지를 전달하여 얼럿창을 이용하거나 적절한 조치를 취할 수 있도록 한다.

이처럼 에러가 발생하였을 때 처리해주는 부분은 try~catch문에서 처리하게 된다.
- throw문은 try블럭안에 작성되어있어야 하고 만약 에러가 발생하게 되면 catch문의 코드 블럭이 실행된다.
try{
명령문1
명령문2
........
throw new Error("에러가 발생하였다")
명령문3
}catch(위임된 객체:Error){
에러발생시 처리할 명령문
trace( 위임된 객체.message )
}
에러가 발생하지 않는다면 명령문1~명령문3까지 모두 실행하겠지만 명령문2 이후에 에러가 발생하면
try문에서 빠져나가 catch문의 명령문을 실행하게 된다. 이때 throw에서 생성한 Error객체의 메세지를 확인하기 위해서 catch문에 delegate를 선언하여 이 객체로 접근이 가능하다.

예1) 에러 발생만 체크
try {
 trace("1");
 trace("2");
 
throw new Error("에러 발생");
 trace("3");
} catch (obj:Error) {
 
trace(obj.message);
}

* 실행결과 : 화면에 "1    2     에러 발생" 이라고 순서대로 출력

예2) 네트워크에서 msg라는 값을 받아 처리라고 가정
var msg:String //어디선가 넘겨주게 될 값이라고 가정
try {
 if(msg == undefined){
  throw new Error("필요한 값을 받지 못하였습니다.")
  }
 trace("계속 진행");
} catch (obj:Error) {
 trace(obj.message);
}
만약 위의 코드가 네크워크에서 값을 받아 변수 msg라는 곳에 넣었다고 할때 값이 없으면 에러가 발생하고 그렇지 않으면 "계속 진행"을 출력하게 된다. 지금과 같은 경우에는 msg에 값이 없으므로 throw에 의하여 catch문의 trace가 실행하게 되지만 변수 msg = "어떠한 값"으로 값이 있는 경우에는 throw문은 실행하지 않는다.

* try문에 모든 코드를 넣자니 코드가 보기에 좋지 못하다.
  따라서 try 블럭에 함수를 넣어 실행시키도록 한다.

var id:String;
var u_name:String;
var msg:String;

//네트워크와의 통신하는 함수
function sendAndLoad():void
{
 trace("네트워크와 값을 교류했습니다.")
 각 변수들에게 받은 값을 대입...
}

//교류된 값을 정상적으로 받았는지 체크
function chkParams():void
{
 if(id == undefined) throw new Error("아이디가 없습니다.");
 if(u_name == undefined) throw new Error("이름이 없습니다.");
 if(msg == undefined) throw new Error("메세지가 없습니다.");
}

//정상적으로 값이 설정되면 실행
function makeDisplay():void
{
 trace("화면에 필요정보를 만든다.")
}

try{
 sendAndLoad();
 chkParams();  -> 실제 throw가 있는 함수
 makeDisplay();
}catch( obj:Error ){
 trace( obj.message )
}
이처럼 각 함수를 만들어 try 블럭에 넣어서 실행하면 코드가 조금은 정리되어 보인다.


* finally 블럭 : catch문 다음에 사용되며 에러가 발생하더라도 실행되는 블럭
try{
  throw new Error("에러가 발생하였다")
}catch(obj:Error){
  trace( obj.message )
}finally{
  trace("무조건 실행된다.")
}



Posted by 버터백통
앞에서 속성 x라는 setter나 getter에 관하여 다루어 보았다. 이들은 Sprite나 MovieClip에서 공통적으로 상속받은 어떠한 클래스의 메서드일 텐데...이들의 실행문을 개발자 마음대로 바꾸어 실행하도록 하고싶을 때는 메서드를 재정의 하여야 한다.

public override function 함수이름():반환타입
{
     명령문들...
}
또는 아래와 같이 재 선언 할수도 있다.
override public function 함수이름():반환타입
{
     명령문들...
}
위처럼 부모의 메서드를 재정의하여 사용하고 싶을 때 사용한다.
가령 A라는 클래스에 mind()라는 클래스는 trace("난 이미자 좋아")를 구현한다. 이 A라는 클래스를 상속받은 B클래스는 세대도 바뀌고 환경도 바뀌어 mind()가 "태희 좋아"로 바꾸려고 한다.

//클래스 A
public class A
{
   public function mind():String
  {
   
  return "이미자 좋아"
  }
}

//클래스 B
public class B extends A
{
   override public function mind():String
  {
    
return "태희 좋아"
  }
}


A클래스에서는 mind를 실행시키면 이미자를 좋아하지만 B클래스 이후 부터는 mind를 실행시키면 태희를 좋아하게 되는 것입니다. (B를 상속받은 모든 클래스는 A와 B의 모든 메서드를 가지고 있겠지만 mind인 경우 "태희 좋아"라는 B클래스에서 재 선언한 메서드가 실행하게 된다.)
Posted by 버터백통