ADOBE/ ActionScript

플래시 하나의 파일 여러개의 클래스 관련

AlrepondTech 2011. 11. 10. 10:16
반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

출처: http://blog.daum.net/_blog/BlogTypeView.do?blogid=0JSr0&articleno=6344202#ajax_history_home

내용은 야웅닷컴의 김기준님의 강좌를 나만 이해하기 쉽게 정리해 놓은거다.  

출처 - http://yawoong.com/board/zboard.php?id=tutorial_kjky 

 

액션스크립트는 패키내에 하나의 클래스만 만들 수 있다.

 

그래서 package 밖에 internal(접근수정자)을 사용하여 클래스를 만들어서 사용한다.

 

package

{

public class Test

{

private test1:Test1;

public function Test()

{

test1 = new Test1();     // 클래스 Test1 인스턴스를 생성후 사용가능

}

}

}

internal class Test1     // internal를 사용하여 Test클래스에서 사용할 수 있도록 함

{

}

 

 

=================================

=================================

=================================

 

 






출처: http://hanulis.tistory.com/68


자.

드디어 클래스 쓰는 방법은 익혔어. 이제 조금 확장해서 생각해봐야지.

하나의 패키지에 여러개의 클래스를 만들수 있다고 했겠다?

해보지뭐.

Greeter.as --

package
{
    public class Greeter
    {
        public function sayhello() {
           trace("hello man~");
        }
    }
 
   public class Greeter2
   {
       public function sayhello2() {
           trace("hello man2~");
       }
    }
}

Greeter.fla

var s=new Greeter2();
s.sayhello2();

자.. 클래스 두개다. 받아랏.

1180: Call to a possibly undefined method Greeter2.

.... 정의했잖아.; Greeter2.; 왜 안되는데;;

자..잠깐..;; 파일명이랑 클래스명이랑 같아야 했었지..?

... 그래도 답이 없다.; 파일명을 Greeter(2).js로 할수도 없잖아!


다시 검색.

레퍼런스도 살펴보고, 구글링도 하고 네이버링도 하고..







드디어 원인을 알았어!

package안에는 class는 하나밖에 들어갈수 없어. OTL

그럼 여러개의 클래스를 만들수 있다며?





만들수 있더라.

요렇게.

package
{
    public class Greeter
    {
         public function sayhello() {
              trace("hello man~");
         }
    }
}
 
class Greeter2
{
    public function sayhello2() {
        trace("hello man2~");
    }
}

또다른 class는 밖으로 빠졌어. 넌 아웃사이더다.

자.. 다시 한번 실행.

1180: Call to a possibly undefined method Greeter2.

안되네. 이제 슬슬 익숙해져가고 있어. 한번에 되는 꼴을 못봐. 인생 뭐 다 그렇지.


다시 검색....



후, 결과 요약.

package 밖에 선언된 class는 internal 속성을 가지는 class가 된다.


internal속성이라.. 사전적으로 봐도 딱 "내부적"인 뜻이 보였어.

내부적인 class라.. 패키지의 내부적인 class... 패키지 안에서만 class.

그렇군. package안에 만든 class에서만 새로 생성할수 있는 class가 되는거였어.

즉.. 그림으로 보면..

 

 

 

 

 

 

 

개념도

이정도겠지. 그림에 있는 말대로.. Greeter Class안에서.. var test=new Greeter2(); 가 된다는 거였어.

어허허..; 귀찮기도 하여라;

다시한번 수정하고 실행해보자.

Greeter.as

package
{
    public class Greeter
    {
       public function sayhello() {
           trace("hello man~");
       }
 
       public function callGreeter2() {
           return new Greeter2();
       }
    }
}
 
class Greeter2
{
    public function sayhello2() {
       trace("hello man2~");
    }
}

test.fla

var s=new Greeter();
var s2=s.callGreeter2();
s2.sayhello2();

s는 새로운 Greeter를 생성하고..

s2는 Greeter의 callGreeter2()를 실행하면서 Greeter2를 받아오고..

마지막으로 Greeter2에 있는 sayhello2();를 실행했지.

결과는..

hello man2~

야호~

 

 

 

=================================

=================================

=================================

 

 

 


출처: http://zelkova777.tistory.com/tag/%EB%82%B4%EB%B6%80%ED%81%B4%EB%9E%98%EC%8A%A4


앞서 작성한 Test.as 메  클래스이외 또 다른 클래스를 추가해야 할 경우 크게 두 가지 방법으로 작성할 수 있다.
Test.as 내에 클래스를 선언하는 방법(편의상 내부클래스라고 한다.)

패키지 폴더(sample)에 또다른
as파일을 생성하는 방법(편의상 외부클래스라 한다.)

이 있다.

근데 클래스 한개로 만들면 안되냐? 복잡하게 머하러 또 만드냐? 라고 질문할 수 있겠다.
예를 들어 어떤 시험에서 5개 과목의 시험결과를 처리할려고 한다.
한개의 클래스로 작성한다면 어떻게 되겠는가.
각 과목의 결과를 처리하는 5개의 클래스가 필요하다.
이렇게 작성된 각각의 클래스는 그 과목용으로만 사용이 가능하며 추후 과목이 추가되면 또 작성해야한다.
제작도 5번을 해야 하므로 제작시간도 만만찮게 걸린다.

그럼 어떻게 구성해야 할까..
5개의 시험과목을 구분짓는 것(속성,properties)이 머가 있는지 살펴보자.
시험이름,총점,점수등..머 정의한다면 무수히 많을 수가 있다. 복잡하니까 나열한 3개 정도만으로
구분한다고 하자. Exam이라는 클래스에서 이 속성(인스턴스 속성)이 다른것으로 어떠한 시험인지 구분이
가능하다.
시험클래스(메인 클래스)에서 시험을 만들고(인스턴스 변수) 시험의 속성을 결정한 후 결과를 계산하면
된다. 이렇게 작성하면 추후 시험이 추가 되더라도 시험메인클래스에서 새로운 시험을 선언하고 처리하면
되므로 별도의 클래스 작성이 필요없게 된다.

이  시험을 처리하는 간단한 클래스를 작성해보자.
(패키지 클래스 작성방법이 1주차에서 했으니까 자세한 설명은 1주차를 참고하기 바람.)

1. 내부 클래스로 처리하기
Test.as를 만들고 아래와 같이 작성하자.

package sample{//패키지 	public class Test {//시험 메인 클래스  	} }//package  //패키지내 시험 과목 클래스 internal class Exam {  } 

Exam 클래스는 sample 패키지 내부에서만 사용할 것 이므로 internal로 제한했다.
다음으로 Exam 클래스에 속성을 저장할 인스턴스 변수를 선언하자.

//패키지내 시험 과목 클래스 internal class Exam { 	//과목 이름 	internal var examName:String; 	//과목 총점 	internal var totalScore:uint; 	//점수 	internal var score:uint; } 

각각의 속성을 internal로 선언했다. 여기서 알아둬야 할 것은 internal 인데 이것은 인스턴스 변수의 접근 제한자라고 한다.
클래스와 마찬가지로 어디까지 접근을 가능하게 할 것인가를 알려주는 것이다.
인스턴스 접근제한자는 4개가지가 있는데 추후 강의해서 무지하게 나올 예정이므로 반드시 익혀둬야 한다.

  • public : 접근제한이 없다. 어떤 상황에서도 접근이 가능하다.
  • internal : 패키지내에 어떠한 클래스에서도 접근이 가능하다. 
                패키지 외부 클래스에서 접근이 불가능하다.
  • protected : internal 확장으로 하위클래스,선언된 클래스 내에서만 접근이 가능하다.
  • private : 선언된 클래스 내부에서만 접근이 가능하다.


접근제한자를 명시하지 않으면 기본으로 internal로 되니 주의하자.
만약 변수에 어떠한 접근제한자를 써야할 지 판단이 안서면 private를 써주는 것이 좋다.
private은 선언된 클래스내에서만 접근이 가능하므로 다른 클래스에서 접근이 필요할 경우 수정해주면
되므로 접근설정 변경이 용이하다. 그러나 기타 접근제한자로 해서 다른 클래스에서 접근되게 코드를 짤
경우 수정이 대략 난감할 경우가 발생할 수 있으니 주의하자.

위 코드에서는 어떻게 사용해야 할지 명확하므로 Test 클래스에서도 접근이 가능하도록 만들었다.
그럼 어떻게 접근하는가. Test 클래스에 Exam 인스턴스를 선언해보자.

package sample{//패키지 	public class Test {//시험 메인 클래스 		public function Test() {//생성자 			var myExam:Exam = new Exam; 			myExam.examName = "국어" 			myExam.totalScore = 100 			myExam.score = 80 		} 	} }//package  //패키지내 시험 과목 클래스 internal class Exam { 	//과목 이름 	internal var examName:String; 	//과목 총점 	internal var totalScore:uint; 	//점수 	internal var score:uint; 	 } 

Test 클래스에 

생성자

라는 넘이 생겼다. 클래스와 이름이 동일하며 접근제한자는 public이다.
이넘의 역할은 클래스 인스턴스가 생성되면 즉시 실행된다.

코드시작점

정도로 이해하면 되겠다.

모든 클래스는 기본으로 생성자를 명시하는 것을 원칙으로 한다.(없이 작성도 가능하다.)
접근제한자는 오로지 public만 가능하다.

생성자에는 보통 외부에서 선언시 필요한 클래스 속성들을 정의할 부분이 들어간다.
변수초기화 시키는 부분 정도로 이해하면된다.

위 코드처럼 Exam 속성들은 internal로 선언되었으므로 바로 인스턴스를 생성해주고 속성을 접근할 수 있다.
그럼 이제 Exam에도 생성자를 하나 만들어주자.

package sample{//패키지 	public class Test {//시험 메인 클래스 		public function Test() {//생성자 			var myExam:Exam = new Exam; 			myExam.examName = "국어" 			myExam.totalScore = 100 			myExam.score = 80 			trace(myExam.examName) 		} 	} }//package  //패키지내 시험 과목 클래스 internal class Exam { 	//과목 이름 	internal var examName:String; 	//과목 총점 	internal var totalScore:uint; 	//점수 	internal var score:uint; 	 	function Exam(examName:String, totalScore:uint, score:uint) { 		this.examName = examName; 		this.totalScore = totalScore; 		this.score= score 	} } 

Exam

생성자에는 접근제한자를 설정하지 않았다. 이런 경우 자동으로 public으로 간주한다.

그리고 파라미터들이 있다. 인스턴스 변수와 동일한 이름,변수형으로 선언되었다.
이 상태에서 저장한 후 플래시에서 테스트해보면 에러를 뿌린다.
아규먼트 값이 일치하지 않는다고..
Test부분에서 Exam의 새로운 인스턴스를 생성될 때 바로 속성을 설정해주어야한다.
만약 바로 설정할 필요가 없다고 느껴지면 다음과 같이 생성자 파라미터에 초기화해 줄 수도 있다.

function Exam(examName:String="국어", totalScore:uint=100, score:uint=50) { 

this.examName 처럼 변수에 this를 붙혀주면 이 변수는 인스턴스 변수를 가르킨다.
즉 internal var examName을 가르키게 된다.
internal var examName = 생성자 지역변수 examName으로 생성자 부분 코드를 이해하면된다.

2. 외부 클래스로 작성하기.

1번에선 Test.as파일 하나에 Exam클래스까지 선언해서 만들었다.
이런 내부 클래스 방법은 Exam클래스 자체가 매우 간단한 동작만 할 경우 외부 as파일까지 만들 필요가
없을 때 사용한다. 하지만 Exam클래스가 들어갈 내용이 많고 코드가 복잡해질 경우는 외부로 빼서
만드는게 좋다.
Exam클래스부분을 삭제하고 sample 폴더아래 배운대로 Exam.as를 만들어 주면 끝이다.


class_02.zip
다운로드


이 Test클래스와  Exam클래스를 수정해서
1. Test클래스에 국어(총점:50,점수:임의),영어(총점:100,점수:임의),수학(총점:80,점수:임의) 3과목의
    Exam 인스턴스를 생성한 후
2. 각 3과목에 평균을 계산해 출력해주는 Test클래스를 만들어보자.

 

 

=================================

=================================

=================================

 

 

 

반응형