[UI&C Lab] Draw Path...

Project/UI&C Lab 2007. 2. 21. 10:58

이번에는 만들어 놓은 Draw Path Recorder를 이용하여 path 경로를 축출하여 나무가지가 뻗어나가며 꽃과 잎이 돋아나는 형태의 결과물을 만들게 되었다. draw path를 가져와서 라인을 그리는 클래스에서 추가적인 기능을 넣는 것으로 완성을 하게 되었는데 그 과정은 다음과 같다.

사용자 삽입 이미지
 
라인을 path에 따라 그려주는 클래스에서 임의의 좌표점에서 무비클립의 스케일을 랜덤하게 생성하여 scale 1 ~ scale random(100)으로 진행하였다. 기초적인 나무의 형태와 오브젝트들을 나열했으나 부자연스럽다. 다음 진행은 아래와 같다.
 

사용자 삽입 이미지
 
라인의 굵기를 처음 좌표를 시작하는 지점과 끝 지점으로 갈수록 굵은 쪽에서 가늘게 진행하였다. 그리고
꽃과 잎의 구분을 위하여 두개의 무비클립을 상호 조화롭게 나타나도록 배치하였고 라인과 마찬가지로 잎과 꽃의 scale도
큰쪽에서 작은 쪽으로 진행하였다. 그러나 어딘가 또 부자연스럽다. 잎과 꽃의 rotation을 보면 rotation을 랜덤으로
설정해 놓았기 때문에 식물의 가지가 뻗어나가는 방향으로 향하지 않은 놈들이 상당히 보인다. 이는
자연의 나무 형태에서 보는 것과는 다른 부자연스러운 모양을 나타내고 있다. 다음은
그 문제를 해결한 부분이다.

사용자 삽입 이미지
 
앞의 것과 같은 클래스 구조에서 각각의 잎과 꽃을 나타내는 무비클립의 rotation에 제한을 두었다.
 
  var difx:Number = pointList[count].x - pointList[count-1].x;
  var dify:Number = pointList[count].y - pointList[count-1].y;
  var ang:Number = Math.atan2(dify, difx);
  var rotationValue:Number = ang * (180 / Math.PI);
 
여기서의 rotationValue 값은 라인이 진행하는 방향의 각도를 가지고 있으므로 그 각도에서 + and -값을 꽃은 60, 잎은 70도로
한정하고 - 와 +는 랜덤으로 설정하였다. 이렇게 하여 라인이 진행하는 방향 쪽으로 향하는 잎과 꽃을 나타낼 수 있었다.
 

사용자 삽입 이미지
 
이렇게 진행하고 마지막으로 잎과 꽃을 실사 이미지를 입히고 가지의 line은 lineGradientStyle 메소드를
이용하여 명암을 넣으므로써 조금은 입체적인 느낌을 살리려고 했다.
 
이것을 만들때 Line Path Recorder를 이용하여 축출한 Point 좌표가 마우스의 움직임에 따라 저장이되는 관계로
그대로 사용할 경우에는 한점과 한점을 지나는 간격이 좁은 관계로 처리해야 하는 양이 늘어나는 문제가 있었다.
이는 기존의 point 좌표를 갖는 array에서 중간 값들을 두번 걸러내는 것으로 처리속도를 높일 수 있었다.
 
실사 이미지가 들어가므로 인해서 잎과 꽃이 나타날때 약간의 CPU문제가 발생하지만 그럭저럭 쓸만한 클래스가 만들어졌다.
    

설정

트랙백

댓글

[UI&C] Path Recorder

Project/UI&C Lab 2007. 2. 21. 10:58
이번은 화면 좌표를 표준화 String으로 축출하여 화면에 비주얼을 보여주고 네비를 구성해 봤다.
표준화된 String을 이용하기에 다양한 비주얼 형태에 적용이 가능할 것으로 예상된다.
사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


사용자 삽입 이미지


    

설정

트랙백

댓글

UI&C(User Interface & Communication) Lab...

Project/UI&C Lab 2007. 2. 21. 10:57
'UI&C Lab'은 개인적인 공부와 프로젝트를 통해서 얻은 경험을 바탕으로 제대로 된 UI를 개발하는 목표로 만들게 되었다. 이를 통해서 작게는 나의 역량을 키우고 쌓아갈 수 있는 발판이 될 것이며 크게는 사내 프로세스를 변화시키고 진정 내가 하고싶은 것을 하며 밤을 새는 일일 것이다.

'UI&C Lab'은 오프라인에서 진행중이다.

사용자 삽입 이미지


    

설정

트랙백

댓글

AS3 API 계층구조도

Programming/ActionScript 2.0 2007. 2. 21. 10:57
AS3 API 계층구조 자료



 = new EXE(new SWF(new JPG(PDF))); 입니다.

    

설정

트랙백

댓글

사용한 모든 인터벌 삭제하기

Programming/ActionScript 2.0 2007. 2. 21. 10:57
class IntervalGroup{


        private var _intervalAry:Array;
        private static var _instance:IntervalGroup;


        private function IntervalGroup(){
                _intervalAry = new Array();
        }


        public static function getInstance():IntervalGroup{
                if(_instance == null){
                        _instance = new IntervalGroup();
                }
                return _instance;
        }


        public function set interval(num:Number):Void{
                _intervalAry.push(num);
        }


        public function clear():Void{
                for(var i=0;i<_intervalAry.length;i++){
                        clearInterval(_intervalAry[i]);
                }
        }
}
    

설정

트랙백

댓글

Adobe MAX 2006 Korea Conference를 다녀와서...

Miscellaneous/Story 2007. 2. 21. 10:57
Adobe MAX 2006 Korea가 지난 11월 14~15일 양일간 삼성동 그랜드 인터콘티넨탈호텔 그랜드볼룸에서 개최됐다. Adobe사에서 Macromedia를 인수하기 전에 국내에서 처음 열린 MAX 2005 Korea에서는 트랙을 Design, Development, Mobile&Device로 구성하였다. 이번 MAX 2006 Korea에서는 Creative World, Application World, Mobile World로 트랙 명칭이 바뀌었지만 그 내용과 구성은 작년과 비슷하게 진행되었다.

 국내 웹에이전시에서 플래시를 가장 많이 사용하고 있는 것을 반영하듯이 이번 컨퍼런스에서도 Creative World 트랙을 참석하는 사람들이 가장 많았다. 나는 일을 떠나서 플래시가 사용되고 있는 모든 분야에 관심이 두고 있었지만 3개의 트랙이 같은 시간대에 진행되었기 때문에 작년과 같이 이번에도 Creative World 트랙을 참석했다.

 작년에 인기가 많았던 강사진들과 새롭게 한국을 찾은 강사까지 그들이 준비한 섹션 내용은 나의 열정과 내 놀이(플래시)에 대한 자부심을 느끼기에 충분했다. 자신의 작업 스타일과 관심분야는 달랐지만 그들이 이야기 하는 것에는 하나같이 공통점이 있었다.

첫째로 조슈아 데이비스(Joshua Davis)가 이야기 했던(Watch for patterns) 말처럼 그들은 하나같이 주어진 아이디어 속에서 패턴을 찾는 것에 열정을 가지고 있었다. 그런 과정 속에서 만들어진 결과물은 보이지 않는 또 다른 영감으로 다시 태어났고 그것은 자신에게 주어진 문제를 해결하는데 큰 도움을 주고 있었다.

사용자 삽입 이미지

둘째로 일을 미치도록 사랑하라(Work like hell), 크레그 스완(Craig Swann)이 이야기했던 Work less play more와도 같은 이야기라 생각된다. 조슈아 데이비스가 이야기 했던 일(work)이란 것은 크레그 스완이 이야기 했던 놀이(play)와 같다. 우리가 일이라 생각하는 것은 짜여진 일정에 쫓기다 보면 창의적인 결과물을 만들어 내기가 쉽지가 않다. 하지만 자신이 즐기는 놀이 속에서는 보다 창의적인 사고로 문제에 접근할 수 있을 것이다.

MAX 컨퍼런스를 작년에 이어 2차례 참석하면서 생각한 것은 컨퍼런스라는 것은 눈에 보이는 지식을 습득하는 곳이 아니라 눈에 보이지 않는 느낌을 찾는 시간이라 생각된다. 그 느낌을 어떻게 자신의 것으로 만들고 승화시킬 수 있는지는 오로지 자신의 몫이 아닌가 생각된다.
 
이번 Adobe MAX 2006 Korea에서 보고 느낀 것은 아래 링크로 첨부하였다. 각 섹션별로 스피커들의 작품들을 볼 수 있는 사이트도 함께 기재해 놓았으니 방문해 보길 바란다.






invalid-file

프리젠테이션 자료


    

설정

트랙백

댓글

프레임 모션에 easing 적용하기

Programming/ActionScript 2.0 2007. 2. 21. 10:56
보통 프레임간 이동할 시에는 사용할 클래스를 따로 제작을 하여 사용을 합니다. 저도 GotoPlay.as dynamic class를 만들어서 필요할때마다 사용을 하곤 합니다. 오늘 Tween 클래스를 가지고 놀다가 Tween클래스를 사용하여 프레임 모션에 에싱을 줄수 없을까 생각해 봤습니다. _currentframe 속성의 경우는 read-only 속성이기 때문에 값을 넣을 수가 없어서 Tween 클래스에서 무비클립의 속성으로 사용하여 에싱을 줄 수는 없습니다. 그래서 무비클립에 하나의 변수를 만들어 그것을 통해서 제어를 하도록 해봤습니다.








[Flash] http://jasu.tistory.com/attachment/cfile22.uf@232CFD385880209E219C15.swf


import mx.transitions.Tween;
import mx.transitions.easing.*;

mc._frame = mc._currentframe;
var myTween:Tween = new Tween(mc, "_frame", Strong.easeOut, mc._currentframe, 235, 1, true);
myTween.onMotionChanged = function() {
        mc.gotoAndStop(Math.round(mc._frame));
};
myTween.onMotionFinished = function() {
        this.yoyo();
};

mc라는 무비클립이 있고 그 안에 무비클립을 235 프레임까지 모션을 적용합니다. 엑션을 통한 모션처럼 자연스러운 모션을 적용하기 위해서는 프레임을 많이 필요로 합니다.(프레임간 이동 간격을 통해 esaing이 적용되기 때문)

프레임에 png 동영상 컷들을 넣고 스크롤바를 통해서 원하는 지점으로 이동할 때 프레임에 easing을 넣으면 괜찮을 것 같네요...^^

    

설정

트랙백

댓글

승려의 섬에는 과연 무슨일이 일어났는가?

Programming/Algorithms 2007. 2. 21. 10:56

마이크로 소프트사는 기발한 면접 문제로 유명하다.  아래는 마이크로소프트사에서 면접을볼때 질문했던 문제중에 하나입니다. 여러분도 한번 생각해 보세요


if((생각한 시간 > 2분) || (문제의 답을 이미 알고 있는가?)){
    웃고 넘어감;
}else{
    앞으로 돌아가서 최소한 2분 동안 답을 생각해 볼것;
}
 
"옛날에 어느 나라에  승려들만 모여 사는 섬이 있다. 그들 중에서 어느 사람은 눈이 빨갛고 어느 사람은 눈이 갈색이다. 눈이 빨간 사람은 마법에 걸려 있기 때문에 스스로 눈이 빨갛다는 사실을 깨닫게 되면 그날 밤 12시에 스스로 목숨을 끊어야만 한다(그것은 마법이었기 때문에 눈이 빨갛다는 사실을 깨달은 사람은 예외 없이 목숨을 끊어야 한다). 승려들은 서로의 눈 색깔에 대해 전혀 언급하지 않는다는 불문율이 있었기에 상대방의 눈 색깔을 알려줄 수도 없었다. 그 섬에는 거울도 없고 거울 비슷한 물건도 없었기 때문에 자신의 눈이 무슨 색인지 아는 사람은 아무도 없었다. 그래서 그들은 자신의 눈 색깔을 알 길이 없었기에 행복하게 살아갈 수 있었으며, 자살 따위를 하는 사람은 아무도 없었다.
 그러던 어느 날 그 섬에 관광객이 찾아왔다. 그는 승려들 사이에 존재하는 규칙을 알지 못했기 때문에 절대로 하지 말아야할 말을 내뱉고 말았다.
 "당신들 중에서 적어도 한 명은 눈이 빨간색이로군요."
무심한 관광객은 그 날로 되돌아갔지만, 남아있는 승려들은 생전 처음으로 눈 색깔에 대한 말이 나왔기 때문에 크게 동요하지 않을 수 없었다. 그리고 그날 밤부터 그 섬에는 무서운 일이 일어나기 시작했다. 빨간 눈을 가진 사람은 모두 3명이 있었다. 과연 어떤 일이 일어났겠는가?

임백준저 - 누워서 읽는 알고리즘 중에서 발췌


http://www.sellsbrothers.com/fun/msiview/default.aspx?content=question.htm


위 주소는 마이크로소프트사의 면접 문제를 모아놓은 곳입니다.
 
 
---------------------------
 
var dayCount = 0;
whatHappened = function (redEye:Number):Number { dayCount++; if (redEye == 1) {
                trace(dayCount+"");
        } else {
                trace(whatHappened(redEye-1)+"번 승려 죽음");
        }
        return redEye;
};
trace(whatHappened(3)+"번 승려 죽음");

----------------------------
 
flash에서는 메모리상의 스택 Depth가 255를 넘어가게 되면 오버플로우(overflow)가 발생한다. 다시 말해서 위 redeye 승려가 255명을 초과하게 되면 플래시는 힘들다고 계산 안한다.  그런데 구현이 맞는지 모르겠습니다.;;

    

설정

트랙백

댓글

오버라이딩 인스턴스 메소드의 멤버 접근

Programming/ActionScript 2.0 2007. 2. 21. 10:55
[오버라이딩 인스턴스 메소드의 멤버 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드

예제 :
class A{
        public function over():Void{
        }
}

class B extends A{
        public function methOfB():Void{
        }
        public function over():Void{
                methOfB(); //B.methOfB()를 실행한다.
        }
}

설명 :
서브클래스에 정의된 메소드는 어느 하나가 오버라이딩 메소드라도 서로 접근할 수 있다. 따라서 오버라이딩 메소드

B.over()는 B.methOfB()를 정상적으로 실행한다. [표]상속받은 메소드에서 서브클래스의 인스턴스 메소드를 실행할

때 오류가 발생한 것과 비교해본다.
====================
멤버 접근:
상속받은 인스턴스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public function over():Void{
        }
        public function otherMethOfA():Void{
        }
}

class B extends A{
        public function over():Void{
                //otherMethOfA()를 실행함
                otherMethOfA();
        }
}

설명 :
[표]에서, 서브클래스(B)의 모든 메소드는, 심지어 오버라이딩 메소드라 하더라도, 슈퍼클래스(A)의 메소드에 접근할

수 있다.
====================
멤버 접근:
오버라이드된 인스턴스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public function over():Void{
        }
        public function over2():Void{
        }
}

class B extends A{
        public function over():Void{
                //B.over()를 실행. A.over2()가 아니다.
                over2();
        }
        public function over2():Void{
        }
}

설명 :
모든 상황에 있어서, 컴파일러는 불분명한 참조에 대해, 슈퍼클래스를 찾지 않고 서브클래스 안에서 참조를 모두 결

정한다. 예제에서 오버라이딩한 over() 메소드는 over2()를 실행하는데, 이 메소드가 서브클래스에 동일하게 존재하

기 때문에 B.over2()를 실행한다.
====================
멤버 접근:
서브클래스의 인스턴스 속성

예제 :
class A{
        public function over():Void{
        }

        class B extends A{
                public var propOfB:Number = 1;
                public function over():Void{
                        trace(propOfB); // 출력 : 1
                }
        }

        설명 :
        서브클래스에 정의된 메소드는 동일한 서브클래스의 속성에 접근 할 수 있다. 따라서 오버라이딩 메소드 B.over()는

        propOfB에 접근하는 것이 가능하다. [표]과 비교해 보면 상속받은 메소드에서 서브클래스의 인스턴스 속성에 접근하

        는 것은 오류가 발생한다.
        ====================
        멤버 접근:
        상속받은 인스턴스 속성(슈퍼클래스에 정의됨)

        예제 :
        class A{
                public var propOfA:Number = 2;
                public function over():Void{
                }
        }

        class B extends A{
                public function over():Void{
                        trace(propOfA); // 출력 : 2
                }
        }

        설명 :
        서브클래스에 정의된 메소드는, 오버라이딩한 메소드라 하더라도 슈퍼클래스의 속성에 접근할 수 있다. 따라서 오버

        라이딩 메소드 B.over()는 propOfA에 접근하는 것이 가능하다.
        ====================
        멤버 접근:
        오버라이딩된 인스턴스 속성(슈퍼클래스와 서브클래스 모두 정의됨)

        예제 :
        class A{
                public var overriddenProp:Number = 3;
                public function over():Void{
                }
        }

        class B extends A{
                public var overriddenProp:Number = 4;
                public function over():Void{
                        trace(overriddenProp); // 출력 : 4
                }
        }

        설명 :
        서브클래스의 메소드는 서브클래스의 오버라이드된 속성의 값을 출력한다(3이 아닌 4). 왜냐하면 bInstance는

        overriddenProp에 단 하나의 값만을 저장하며, 오버라이딩 메소드는 슈퍼클래스의 오버라이드된 값을 참조하지 않는

        다.
        ====================
        멤버 접근:
        서브클래스의 클래스 메소드 불분명한 참조

        예제 :
        class A{
                public function over():Void{
                }
        }

        class B extends A{
                public static function classMethOfB():Void{
                }
                ublic function over():Void{
                        classMethOfB(); // B.classMethOfB()를 실행함
                }
        }

        설명 :
        컴파일 과정에서 클래스 케소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다(classMethOfB()는 해당 메소드

        가 존재하는 곳이 B이므로, B.classMethOfB()로 결정된다) [표]과 비교하면 상속받은 메소드(슈퍼클래스에 정의된)에

        서 static메소드에 대한 불분명한 참조는 오류가 발생했다.
        ====================
        멤버 접근:
        서브클래스의 클래스 메소드 불분명한 참조

        예제 :
        class A{
                public function over():Void{
                }
        }

        class B extends A{
                public static function classMethOfB():Void{
                }
                public function over():Void{
                        B.classMethOfB(); /// 정상적으로 실행됨.
                }
        }

        설명 :
        B.classMethOfB()는 분명한 참조이므로, 컴파일러는 클래스 B에서 해당 클래스 메소드를 찾게 된다.(이것은 오버라이

        딩 메소드라 하더라도 모든 상황에서 통용되는 사실이다.)
        ====================
        멤버 접근:
        상속받은 클래스 메소드(슈퍼클래스에 정의됨)

        예제 :
        class A{
                public static function classMethOfA():Void{
                }
                public function over():Void{
                }
        }

        class B extends A{
                public function over():Void{
                        classMethOfA(); // A.classMethOfA()를 실행함
                }
        }

        설명 :
        컴파일 과정에서 클래스 메소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다. 따라서 classMethOfA()는

        B.classMethOfA()로 결정된다. 비록 서브클래스 B에 classMethOfA()를 정의하지 않았지만 서브클래스에서 상속받은

        클래스 메소드를 사용할 수 있기 때문에 참조하는 것이 가능하다. 따라서 이 예에서는 B.classMethOfA()와

        A.classMethOfA()가 동일한 작업을 수행한다.
        ====================
        멤버 접근:
        오버라이드된 클래스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

        예제 :
        class A{
                public static function overriddenClassMeth():Void{
                }
                public function over():Void{
                        //A.overriddenClassMeth()를 실행함
                        overriddenClassMeth();
                }
        }

        class B extends A{
                public static function overriddenClassMeth():Void{
                }
                public function over():Void{
                        //B.overriddenClassMeth()를 실행함
                        overriddenClassMeth();
                }
        }

        // 사용법
        var aInstance:A = new A();
        var bInstance:B = new B();
        // A의 overriddenClassMeth()를 실행함
        aInstance.over();
        // B의 overriddenClassMeth()를 실행함
        bInstance.over();

        설명 :
        컴파일 과정에서 클래스 메소드에 대한 불분명한 참조는 현재 클래스에 따라 결정된다. 따라서 B의 over()에서

        overriddenClassMeth()는 B.overriddenClassMeth()로 결정된다. A의 메소드를 실행하려면 명확히

        A.overriddenClassMeth()를 사용하면 된다. 불분명한 참조를 사용하면, 메소드를 호출하고 있는 클래스에 존재하는

        것을 사용한다고 생각하면 된다.
        ====================
        A 클래스 메소드와 마찬가지로 클래스 속성에 대해서도 동일한 접근 규칙을 사용한다.



        출처 : 콜린 무크의 Flash ActionScript 2.0에서 발췌

    

설정

트랙백

댓글

상속받은 인스턴스 메소드에서 멤버의 접근

Programming/ActionScript 2.0 2007. 2. 21. 10:55

[상속받은 인스턴스 메소드에서 멤버의 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드

예제 :
class A{
        public function methOfA():Void{
                methOfB(); //Error!
        }
}

class B extends A{
        public function methOfB():Void{
        }
}

설명 :
컴파일타임 오류 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 메소드를 참조할 수 없다. 그리고 클래스 A는 methOfB()를 정의하지 않았기 때문에 참조하지 못한다.
====================
멤버 접근 :
상속받은 인스턴스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public function methOfA():Void{
                //Executes otherMethOfA()
                otherMethOfA();
        }
        public function otherMethOfA():Void{
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//정상적으로 실행된다.

설명 :
어떤 클래스의 메소드가 동일한 클래스의 다른 메소드를 호출하는 것은 가능하다. 서브클래스의 인스턴스를 통해 사용하더라도 호출할 수 있다.

====================
멤버 접근 :
오버라이드된 인스턴스 메소드(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public function methOfA():Void{
                // 클래스 B의 인스턴스에서 실행하면 B의 overriddenMeth()가 호출된다. 클래스 A의 인스턴스에서 실행하면 A의 overriddenMeth()가 호출된다.
                overriddenMeth();
        }
        public function overriddenMeth():Void{
        }
}

class B extends A{
        public function overriddenMeth():Void{
        }
}
//사용법
var aInstance:A = new A();
var bInstance:B = new B();
// A의 overriddenMeth()가 싱행된다.
aInstance.methOfA();
// B의 overriddenMeth()가 실행된다.
bInstance.methOfA();

설명 :
오버라이드된 메소드는 클래스의 인스턴스에 따라서 사용하는 대상이 달라진다.

====================
멤버 접근 :
서브클래스의 인스턴스 속성

예제 :
class A{
        public function methOfA():Void{
                trace(propOfB); // 오류발생!
        }
}

class B extends A{
        public var propOfB:Number = 1;
}

설명 :
컴파일타임 에러 발생. 슈퍼클래스의 메소드는 서브클래스에 정의된 속성을 참조할 수 없다. 클래스 A에는 propOfB가 없으므로 사용할 수 없다.
====================
멤버 접근 :
상속받은 인스턴스 속성(슈퍼클래스에 정의됨)

예제 :
class A{
        public var propOfA:Number = 2;
        public function methOfA():Void{
                trace(propOfA); //출력: 2
        }
}

class B extends A{
}

설명 :
methOfA()와 같은 슈퍼클래스의 메소드는 슈퍼클래스의 속성(propOfA와 같은)에 접근할 수 있다.
====================
멤버 접근 :
오버라이드된 인스턴스 속성(슈퍼클래스와 서브클래스에 모두 정의됨)

예제 :
class A{
        public var overriddenProp:Number = 3;
        public function methOfA():Void{
                trace(overriddenProp);
        }
}

class B extends A{
        public var overriddenProp:Number = 4;
}

// 사용법
var aInstance:A = new A();
var bInstance:B = new B();
aInstance.methOfA(); // 출력 : 3
bInstance.methOfA(); // 출력 : 4

설명 :
비록 클래스 A에서 속성을 접근하지만 B인스턴스에서 methOfA()를 실행하면, 서브클래스에서 오버라이드된 속성의 값(3이 아닌 4)을 사용한다. 왜냐하면 bInstance는 overriddenProp에 단 한 개의 값만을 저장할 수 있기 때문이다.(자바에서는 methOfA()를 실행하면 항상 3을 출력한다.)

====================
멤버 접근 :
서브클래스의 클래스메소드, 불분명한 참조

예제 :
class A{
        public function methOfA():Void{
                classMethOfB(); // 오류발생!
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
컴파일타임 에러 발생. classMethOfB()는 클래스 A에 정의하지 않았고, 슈퍼클래스는 불분명한 참조를 통해 서브클래스에 존재하는 클래스 메소드를 참조할 수 없다
====================
멤버 접근 :
서브클래스의 클래스메소드 분명한 참조

예제 :
class A{
        public function methOfA():Void{
                B.classMethOfB(); // 정상적으로 실행된다.
        }
}

class B extends A{
        public static function classMethOfB():Void{
        }
}

설명 :
B.classMethOfB()는 분명한 참조로서, 컴파일러는 클래스 B에 해당 클래스 메소드가 존재하는 것을 파악할 수 있다(A의 서브클래스 B가 아니라 할지라도, 모든 클래스에서 이와 같이 사용할 수 있다).

====================
멤버 접근 :
상속받은 클래스 메소드(슈퍼클래스에 정의됨)

예제 :
class A{
        public static function classMethOfA():Void{
        }
        public function methOfA():Void{
                //A.classMethOfA()를 실행
                classMethOfA();
        }
}

class B extends A{
}

// 사용법
var bInstance:B = new B();
bInstance.methOfA();
//A.classMethOfA()를 실행

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 따라서 classMethOfA()는 A.classMethOfA()를 참조한다. 서브클래스 B의 인스턴스에서 A.classMethOfA()를 실행하면 정상적으로 동작한다.
====================
멤버 접근 :
오버라이드된 클래스 메소드(슈퍼클래스와 서브클래스에서 모두 정의됨)

예제 :
class A{
        public static function overriddenClassMeth():Void{
        }
        public function methOfA():Void{
                //A.overriddenClassMeth()를 실행
                overriddenClassMeth();
        }
}

class B extends A{
}

//사용법
var bInstance:B = new B();
//A.overriddenClassMeth()를 실행
bInstaince.methOfA();

설명 :
컴파일 과정에서 클래스 메소드의 불분명한 참조는 현재 클래스가 어떤 것인가에 따라 결정된다. 클래스 A에서 overriddenClassMeth()는 A.overriddenClassMeth()로 변경된다. 클래스 A는클래스 B에 존재하는 B.overriddenClassMeth()를 실행할 수 있다.
====================
* 클래스 메소드와 마찬가지로 클래스 속성에 대해서도 동일한 접근 규칙을 사용함.


출처 : 콜린무크의 Flash ActionScript 2.0에서 발췌

    

설정

트랙백

댓글

구글의 구인광고

Programming/Etc 2007. 2. 21. 10:55

이 수학문제를 풀어야 입사지원 된다?

실리콘밸리 중심가 101번 고속도로가 통과하는 곳에 최근 광고판 하나가 달렸다. 광고판에는 아무런 설명없이 수학문제 하나만 덩그러니 담겨있다.


검색업계의 강자 구글이 아무런 표시도, 설명도 없는 광고판을 세운 이유는 이 문제를 풀 수 있는 수학적 두뇌를 가진 사람을 골라 입사 기회를 주기 위해서라고 한다. 수학자 폴 아도스의 유명한 “수학자란 커피를 정리로 변환시키는 장치”라는 말을 연상시키는 채용방법이다.


광고판에는 ‘{첫 10자릿수 솟수 e}.com’이라고 적혀있다. 답은 7427466391이다. 이 문제를 풀어 7427466391.com으로 접속해보면 2번째 관문인 다른 문제가 나오는데, 여기에도 구글이라는 이름은 없다.


2단계 문제까지 풀면 비로소 구글 연구개발부서인 구글랩 페이지로 연결되며, “구글을 키워나가면서 우리가 배운 점 한가지는 우리가 찾고자 하는 상대방 역시 우리를 찾고 있을 때, 그 사람을 더 쉽게 찾게 된다는 것이다. 우리는 세계 최고의 엔지니어를 찾고 있고, 당신은 여기에 와있다”라는 환영메시지를 볼 수 있다.


메시지는 “짐작하겠지만 우리는 엄청난 량의 이력서를 매일같이 받고 있기 때문에 이러한 절차를 이용해 ‘신호대 잡음비’를 개선하려 하는 것”이라는 말로 이어진다.


올해 말 27억달러 규모의 IPO를 준비중인 구글은 깐깐한 채용 과정으로 유명하다. 회사 설립 첫날부터 3월 31일 현재 직원수 1907명에 이르기까지 구글은 자사만의 채용 기준을 엄격히 준수해왔다.


팔로알토 차고에서 운영되던 초창기에 입사한 한 직원은 “면접 볼 때 세르게이 브린과 래리 페이지(이상 구글 공동설립인)의 책상 위에는 8권의 채용관련 서적이 쌓여 있었다”고 말했다.

구글 직원들은 많은 면접 단계를 거쳤으며, 종종 수학이나 사업전략에 대한 테스트도 요구받았다고 한다. 채용조건은 이와같은 단계가 끝난 후에나 알 수 있었다. 최근 2년 동안에는 우수 인력을 영입하기 위해 프로그래밍 대회를 개최하기도 했다.


구글이 시행한 또한가지 독특한 채용방법은 검색결과 페이지의 광고 링크를 이용한 것이다. 예를 들면 아마존의 검색기술 연구팀인 A9의 팀장 우디 맨버(Udi Manber)를 구글에서 검색하면 검색결과 오른쪽 스폰서 링크에 ‘구글에서 일하세요’라는 문구가 뜨고, 구글 구인 페이지로 연결하는 링크가 나타난다.


한편 현재 구글에서 근무하는 컴퓨터 엔지니어들은 대부분 스탠포드 대학 컴퓨터과학도 출신인 것으로 알려졌다. 이번 수학문제 광고판은 산타클라라 방향에서 롤스톤으로 빠지는 길 근처에 세워졌다. 이 회사 관계자는 상황에 따라 광고판을 더 늘릴 수도 있다고 밝혔다.


출처: ZDnet

    

설정

트랙백

댓글

Iterator Design Pattern

Programming/Design Patterns 2007. 2. 21. 10:54
// Iterator interface //

interface Iterator{
public function hasNext():Boolean;
public function next():Object;
}

// Aggregate interface //

interface Aggregate{
public function iterator():Iterator;
}

// Book class //

class Book{
private var name:String = "";
public function Book(name:String){
this.name = name;
}
public function getName():String{
return name;
}
}


// BookShelfIterator class //

class BookShelfIterator implements Iterator{
private var bookShelf:BookShelf;
private var index:Number;
private var book:Book;
public function BookShelfIterator(bookShelf:BookShelf){
this.bookShelf = bookShelf;
this.index = 0;
}
public function hasNext():Boolean{
if(this.index < bookShelf.getLength()){
return true;
}else{
return false;
}
}
public function next():Object{
this.book = bookShelf.getBookAt(this.index);
this.index++;
return this.book;
}
}



// BookShelf class//



class BookShelf implements Aggregate{
private var books:Array;
private var last:Number = 0;
public function BookShelf(){
this.books = new Array();
}
public function getBookAt(index:Number):Book{
return books[index];
}
public function appendBook(book:Book):Void{
this.books[last] = book;
last++;
}
public function getLength():Number{
return last;
}
public function iterator():Iterator{
return new BookShelfIterator(this);
}
}



// Main class //

class Main{
private var bookShelf:BookShelf;
private var it:Iterator;
private var book:Book;
public function Main(){
init();
}
public function init(){
this.bookShelf = new BookShelf();
this.bookShelf.appendBook(new Book("Around the World in 80 Days"));
this.bookShelf.appendBook(new Book("Bible"));
this.bookShelf.appendBook(new Book("Cinderella"));
this.bookShelf.appendBook(new Book("Daddy-Long-Legs"));
this.it = bookShelf.iterator();
while(it.hasNext()){
this.book = Book(it.next());
trace(""+this.book.getName());
}
}
}
    

설정

트랙백

댓글

동적으로 로드한 이미지 Allow smoothing 컨트롤 하기...

Programming/ActionScript 2.0 2007. 2. 21. 10:54

Dcaland.com을 만들면서 사용한 메소드를 하나 올릴까 합니다. 플래시 8 버전에서는 이미지를 외부로 부터 로드를 할 경우에 default로 Allow smoothing(매끄럽게)이 false 값을 가지게 되는데 Allow smoothing이 false일 경우에는 에니메이션(좌표,로테이션등) 할때 이미지가 지글거리는 문제가 있죠. 라이브러리에 등록된 이미지는 속성에서 수동으로 채킹을 해서 사용하면 된다지만 외부에서 동적으로 불러온 이미지를 움직일 때는 문제가 있죠. 아래 메소드는 그 문제를 해결해 주는 메소드입니다. http://www.kaourantin.net/ 에 기술된 내용을 간단하게 수정해서 사용하고 있습니다.







import flash.display.*;

private function loadImg (target : MovieClip, url : String) : Void
{
        var bmc : MovieClip = target.createEmptyMovieClip ("bmc", target.getNextHighestDepth ());
        var listener : Object = new Object ();
        listener.tmc = target;
        listener.onLoadInit = function (mc : MovieClip)
        {
                mc._visible = false;
                var bitmap : BitmapData = new BitmapData (mc._width, mc._height, true);
                this.tmc.attachBitmap (bitmap, this.tmc.getNextHighestDepth () , "auto", true);
                bitmap.draw (mc);
        };
        var loader : MovieClipLoader = new MovieClipLoader ();
        loader.addListener (listener);
        loader.loadClip (url, bmc);
}


BitmapData 를 사용하기 위해서 import flash.display.*; 임포트 시켜서 사용하세요
입맛에 맞게 수정해서 사용하세요 어떻게 보면 약간의 꼼수가 있는거 같지만 8.5 나오기 전까지는 작지만 유용한 메소드가 될듯 싶습니다.

    

설정

트랙백

댓글

jasu'blog 오픈합니다.

Miscellaneous/Story 2007. 2. 21. 10:53

그동안 사용하던 개인 사이트 및 블로그를 정리하고 이것으로 개인 자료를 정리해 보려고 합니다.
여러가지 블로그를 찾아보다가 용량 및 트래픽 무제한으로 제공하는 티스토리로 오게 되었는데 언제까지 그런 지원이 가능할지는 모르겠네요...

앞으로 개인적인 관심 분야 및 기타 자료들을 모아놓을 예정입니다. 참고로 앞으로는 특별히 대외적인 글이 아닌 이상은 글에서의 존칭은 생략하도록 하겠습니다.

감사합니다.

    

설정

트랙백

댓글