'2009/12'에 해당되는 글 2건

  1. 2009/12/30 kineticroad Class란 무엇인가요?
  2. 2009/12/30 kineticroad 이정도는 되야 영웅

요새 스터디를 시작하게 되었다.
누군가를 가르친다는게 상당한 부담이기도 하고 나도 내 앞가림하기 바쁘다고 생각했기때문에
사실 오래전부터 고민해 왔었다.
정식으로 전산과를 나온것도 아니고 맨날 그림만 그리다가 이길로 진입하게된 나로써는 깊이있는 내용을
전달해주지 못할 것 같다는 생각때문이었다.
그런데 IT에 처음 와서 Flash를 처음 만지고 ActionScript를 처음 접하는 친구들이 고생하는걸 보니
전에 다니던 회사시절이 생각났다. 그래서 결심을 했다. 스터디를 시작하게되었다.

TEAM : FP(Flash Quickly Progress)

내가 잘 할 수 있는건 빨리 배우게 하는 밑거름을 만들어 배우는 시간을 단축시키는거다.
모든 과정이 그렇듯 기본이 되어있으면 빨리 배울 수 있게된다.
하지만 이 과정은 굉장히 지루하고 인내가 필요하다. 그래서 내가 가르쳤던 대부분의 사람들은 금새 나가 떨어졌었다.
이번에 내 교육방침은. "내가 뭘하는지 몰랐는데 정신을 차려보니 뭔가를 만들고 있었다"는게 기본적인 방침이다.
그래야 덜 지루하게 수업을 진행할 수 있지 않을까 하고 생각했기 때문.
어찌 되었든 간에 수업의 첫시간은 Class에 대한 이야기로 시작하려고 한다.

사실 Class라는 말 자체가 풍기는 뉘앙스로 봐서는 뭐가 들어가 있긴 있는데 도무지 무슨일을 하는 녀석인지 당최 이해하기가 어렵다.

보통 Class를 설명할때 책에서는 "교실"을 예를 들어 설명하는 경우가 많은데 가장 적절한 예라고 생각은 하지만 이해가 쉬워지진 않는다.

ActionScript에서 Class를 정의하자면 대충 이렇다.

"클래스는 프로그램을 구성하는 기능성을 갖춘 객체의 집합"

정도로 설명할 수 있는데 이 설명을 이해하려면 "객체지향"이라는 말을 먼저 이해해야한다.

객체지향프로그래밍이라는게 나오면서 클래스라는 개념들이 등장하기 시작했는데 사람 몸에 비유해서 사람 몸을 구성하는데 있어서 부위별로 나눠보면 머리 팔 2개 다리 2개 몸통. 5군데로 나눠볼 수 있다.

각 부위를 클래스로 이해하면 간편하다.

사용자 삽입 이미지

각각의 부위는 그에 해당하는 역할을 지닌 클래스로 분리할 수 있고 그 기능들이 유기적으로 결합되어있어 있다.
팔이나 다리가 없어진다 하더라도 신체라는 큰 프로그램이 "죽지는" 않고 나름대로의 기능을 유지할 수 있도록 설계되어 있다.
객체지향프로그램은 각각의 모듈들이 각기 다른 기능들을 갖고 있어서 어떤 물건을 조립하듯 프로그램을 만들어가는 것이라고 이해하면 "일단" 객체지향에 대해서 첫번째 관문은 통과했다고 보면 된다.

이때 각각의 모듈들은 클래스의 집합으로 이뤄져 있고 클래스는 모듈을 만들어 내기 위한 기능을 구현해낸다.
클래스는 큰 프로그램을 만들기 위한 모듈을 구성하는 하나의 집합이라고 생각하면 일단 거시적인 관점에서는 맞다고 볼 수 있다.

그렇다면 각각의 Property와 Method들이 Class를 이루고 있다면 Property와 Method들이 Program을 이루고 있는 최소단위인가? 라는 의구심이 들 수도 있겠지만 대답은 "아니다"라고 단정지어 말할 수 있다.

왜냐하면 Property는 그 자체가 개개의 클래스이기 때문이고 Method 또한 Property를 이용해 구현하고자 하는 기능을 실행하는 방아쇠 역할이기 때문이다.
클래스는 단지 클래스일 뿐이고 뭔가를 구현하고 구성하기 위한 하나의 부품 역할을 한다.

그렇기 때문에 하나의 클래스를 정상적으로 작동하게 하기 위해서는 클래스간 유기적인 결합이 필요하다.

간단한 예를 들어 코드를 살펴보도록 해보자.

package
{

// 만들고자 하는 클래스를 시작하기전 클래스에서 사용되는 클래스들을 미리 포함시킨다.
import flash.display.Graphics;
import flash.display.Sprite;

// 클래스의 시작. extends는 Sprite 클래스를 상속받아 사용한다는 뜻.(상속의 개념은 제 1강 상속(클래스에도 족보가 있다) 편을 읽어볼 것)
public class TestSample extends Sprite
{
    /**
     *  Constructor.
     *  생성자. 클래스를 생성하게 될 때 실행되는 메서드(?)정도로 이해하면 된다.
     *  생성하는 방법은 아래와 같다.
     *  
     *  var test:TestSample = new TestSample();
     */
    public function TestSample()
    {
        // super 클래스인 Sprite를 생성한다.
        // (무슨의미인지 알려고 해봤자 지금 단계에서 설명해도 이해하기 어려울 터. 그냥 그렇다고 생각해라)
        super();

        drawReadRectangle();
    }

    /**
     *  @private
     *  속이 빨간 네모를 만드는 메서드로 Sprite 속성 중 graphics 속성을 이용해 빨간 네모를 코드로 그려낸다.
     */
    private function drawReadRectangle():void
    {
        var thisGraphics:Graphics = this.graphics;
        graphics.clear();
        graphics.beginFill(0xFF0000, 1);
        graphics.drawRect(0, 0, 100, 100);
        graphics.endFill();
    }
}
}

샘플코드를 잘 보면 3.0 코드를 처음으로 보는거라 이해하기 어려울지 모르겠지만 그냥 일단 빨강색으로 표시해둔 부분을 설명하는 것으로 Class가 뭔가요 챕터를 마치도록 하겠다.

var 이란 명령어는 2.0코드에도 비일비재하게 나타나는 거라 별 설명없이 넘어가도록 하고.
thisGraphics라는 변수를 선언해 놓고 뒤에 ":Graphics" 라고 적어놨다. 이는 "thisGraphics라는 녀석은 Graphics클래스 객체입니다!"라고 컴퓨터한테 이야기 해준거다.
그렇다면 thisGraphics라는 녀석은 Graphics 클래스 외에는 다른 정보를 담을 수 없다. 이를 지키지 않으면 컴파일(Flash에서는 Import라고 하나요?) 중에 오류가 발생하게 된다.

그렇다면 this.graphics라는 건 뭐지?

위에서 말했듯 위의 클래스는 Sprite라는 놈을 상속받아서 쓴다고 했고 상속은 "제 1강 상속(클래스에도 족보가 있다)"편에서 설명하겠다고 했다.

단순히 설명하자면 위의 클래스는 Sprite에 있는 모든 기능을 사용할 수 있다고 미리 정해둔거라고 보면 된다.

그리고 Sprite 내부에는 graphics라는 변수가 있다.




이 graphics라는 변수는 Graphics라는 클래스 형태로 지정되어있다. 참고로 이야기 하자면 graphics라는 놈에 대해서 미리 알려고 하지말 것. 혼란만 가중될거니까. ㅋ(미리 알아봐도 나쁘지는 않겠지만)

그렇다면 방금 만든 TestSample이라는 클래스는 Sprite를 상속받았고 TestSample은 Sprite의 기능을 모두 쓸 수 있다고 앞에서 미리 말했다. 그러니 graphics라는 변수도 사용할 수 있다는 의미다.

thisGraphics는 Graphics 클래스 이므로 Graphics의 기능중 drawRect를 이용해 사각형을 만든다.

위의 예제는 Class안에서 다른 Class 객체를 이용해 필요한 기능을 구현하는 방법을 아주 간단하게 표현한 것으로 어떤 기능을 만들어 내기 위해 또다른 클래스와 유기적으로 결합해 사용한 것이다.

Class라는 것에 대해 너무 완벽한 이해를 할 필요는 없다.
단지 Class는 하나의 프로그램을 만들기 위한 최소 단위이며 Class들간 유기적인 결합으로 하나의 모듈을 만들어 내고 모듈들은 커다란 프로그램을 만들어 내기 위한 하나의 구성요소라는 것만 이해하면 된다.
2009/12/30 13:18 2009/12/30 13:18


이정도는 되야 영웅
2009/12/30 12:51 2009/12/30 12:51