|
1.
제가 얼마전에 플래시 학원을 다녔었는데요 거기서는 AS1.0을 배웠었거든요
거의 비슷하고 조금 다르다는 소리는 들었지만
제가 복습할때는 항상 AS2.0로 했는데도 안되는거 하나 없이 똑같이 구현 됐었거든요
AS1.0과 AS2.0이 어떻게 다른건가요??
구체적으로 무엇이 안됐었고 무엇이 추가 됐는지 이런식으로 알려 주시면 감사하겠습니다.
답변
AS 1.0은 자바스크립트와 동일한 문법을 사용 합니다. 객체지향의 구현도 자바스크립트와 동일하며
사실 완전한 객체지향 언어라고 볼 수는 없습니다. 절차지향적인 언어라고 보시면 됩니다.
AS 1.0과 AS2.0의 가장 큰 차이는 데이터 타입의 유무 라고 볼 수 있습니다. 사실 AS 2.0은 AS1.0과
컴파일 된 이후에 플래시 플레이어에서 실행 될 때는 동일한 로직으로 실행되고 있지만 AS 1.0의 단점이었던
데이터 타입을 추가하고 Class 작성 규칙을 다른 객체지향 언어(Java등) 와 비슷한 형식으로 .as파일에 분리
작성 하도록 개수 보완한 것이 AS 2.0이라고 보시면 됩니다.
데이터 타입이 적용 된 이유는 컴파일 타임에 오류를 보다 정밀하고 쉽게 검출 하도록 해주기 때문입니다.
데이터 타입의 적용으로 다이나믹 클래스의 데이터형이 아닌이상 모든 데이터 타입은 임의로 속성을
추가 할수 없게 된 점도 2.0과 1.0의 차이 입니다.
그러나 AS 2.0의 데이터 타입은 컴파일 된 이후의 내부 코드에서는 존재하지 않습니다.
실제 차이점을 코드로 살펴보면 다음과 같습니다.
AS 1.0
var num = 10; //num변수에 숫자 10을 대입
num = "ten" //num변수에 다시 문자열 "ten"을 대입
위와같이 작업하더라도 전혀 오류가 발생하지 않습니다.
만약 작업자가 num변수를 숫자형으로만 써야 하는데 실수로 문자열을 대입 할 경우에도 오류는 발생하지
않으므로 문제가 발생하면 찾기가 어렵습니다.
위 코드를 AS 2.0의 데이터 타입을 적용하면 다음과 같습니다.
AS 2.0
var num:Number = 10; //num변수를 Number형 변수로 선언하고 10을 대입
num = "ten" // num변수에 문자열 "ten"을 대입, 컴파일타임에 오류 발생
그러나 AS 2.0에서 1.0과 같이 작업하려 하면 타입 미스매치 오류를 컴파일 시점에 발생하여
작업자에게 선언한 변수에 다른 형태의 데이터를 대입하려 했다는 오류를 표시하고 컴파일을
중지 합니다.
다음은 AS 1.0의 객체지향과 AS 2.0의 객체지향 코드의 차이 입니다.
기초적인 속성과 메소드 추가만 살펴보면 다음과 같습니다.
AS 1.0
function ClassName() //생성자 함수
{
this.a = 10; //속성추가
this.b = 20;
}
ClassName.prototype.method0 = function()
{
//메소드 추가
trace(this.a);
trace(this.b);
}
//객체 생성
var classNameObject = new ClassName();
className.method0(); //결과는 10, 20출력
AS 2.0
//ClassName.as파일로 외부에 저장
class ClassName
{
public var a:Number; //public 속성 선언
public var b:Number;
pubilc function ClassName() //생성자
{
init(); //객체가 생성 되면서 내부 메소드 실행.
}
private function init():Void //내부 메소드 init
{
this.a = 10;
this.b = 20;
}
public function method0():Void //메소드
{
trace(this.a);
trace(this.b);
}
}
//같은 디렉토리의 fla파일의 타임라인에서 객체생성
var classNameObj:ClassName = new ClassName();
classNameObj.method0(); //결과 출력 10 , 20
2.
그리고 AS3.0은 잘 모르겠지만 확실히 바뀌었다는게 느껴 지더군요
책 좀 읽어 봤는데 먼소린지 하나도 모르겠어서요,,
AS3.0은 기존의 것과는 달리 어떤식으로 바뀌게 되었는지 좀 알려주세요~~.
답변
AS 3.0의 문법은 기존 2.0의 문법과 크게 차이는 없습니다. 그러나 내장 Class가 AS 1.0과 2.0에서
용하던 내장 함수나 내장 클래스는 사용 할 수 없습니다.
내장 클래스가 1.0, 2.0의 것을 모두 버리고 새로 작성되었기 때문에 3.0 내장 함수와 클래스의 기능들을
파악하고 사용법을 익혀야만 3.0을 사용 할 수 있습니다.
3.0의 내장 클래스 구조를 이해하려면 객체지향의 상속과 다형성을 알고 있어야 합니다.
AS 3.0이 2.0과 코드 형식, 규칙상 크게 달라진 점은 변수를 사용할 때 항상 선언을 해야 한다는 것 외에
클래스의 작성, 사용 규칙이 미묘하게(미묘하지만 매우 큰차이입니다.) 달라졌다는 정도 입니다.
그리고 AS 3.0에서는 컴파일 이후에도 데이터 타입이 존재합니다. 따라서 메모리의 제한적인
할당이 가능해졌습니다.
3.0에서 변화한 부분중 많은 차이가 있는것은 플래시에서 가장 많이 사용되는 객체인 화면에 표시되는
그래픽 객체 요소들의 종류와 제어(생성, 표시, 제거) 방식의 변화 입니다.
2.0에서는 MovieClip오브젝트 만으로 디스플레이 요소 들을 생성 표시 제거했지만 3.0에서는
Shape, Sprite, MovieClip이 존재 합니다. 3.0의 내장 클래스들은 복잡해보이지만 객체지향적인 면에서
2.0보다 훨씬 규칙이 잘 잡혀있습니다.
그리고 이벤트가 콜백함수 이벤트에서 리스너 이벤트 모델로 변경되었습니다. 이벤트 리스너는 2.0에서도
나중에 사용 되긴 했습니다만 알고 있는 사람만 사용 했고 또 내장 클래스의 대부분이 콜백함수 이벤트를
사용하고 있었으므로 리스너를 몰라도 2.0에서는 전혀 무리가 없었습니다만 3.0의 이벤트 리스너는 매우
중요하며 이벤트 발생 클래스의 상속 구조를 필수로 이해해야만 합니다.
자세한 설명을 하자면 너무 긴 답변(지금도 충분히 길지만..)이 될 것이므로 이정도면 답변이 된것 같습니다.
========================================================
3.
그리고 액션 스크립트1.0, 2.0, 3.0 이 모두 객체지향인가요??
객체지향이란 개념이 아직 확실히 와닿진 않아서 잘 모르겠지만
액션스크립트에서 변수 쓰고 함수 쓰고 이런거 보면 객체 지향같은데,, 아닌가요??
답변
1.0은 절차지향 언어이며 클래스를 작성하고 객체를 생성 할 수는 있지만 불완전한 객체지향 문법입니다.
2.0은 1.0에 분리된 클래스 작성 문법을 도입하여 객체지향 언어로 변화 했습니다만 내장클래스는 여전히
1.0의 클래스들을 그대로 사용하고 있습니다.
3.0은 확실한 객체지향 언어입니다.
그러나 3.0으로도 절차지향 코드를 작성 할 수 있으며 2.0역시 절차지향 코드를 작성 할 수 있습니다.
변수와 함수는 절차지향에서도 사용하는 것이므로 변수 함수를 사용한다고 해서 객체지향으로 볼 수 없습니다.
절차지향에서는 변수와 함수를 선언하고 함수를 로직의 흐름 순서에 따라 함수를 호출하여 프로그래밍 하지만
객체지향은 어떤 기능을 하는 클래스를 프로그래밍하고 그 클래스를를 필요한 상황에 생성(객체화)하여
사용하게 됩니다.
객체지향은 말 그대로 객체를 지향한다는 것으로 프로그래밍을 로직의 순서대로 작성하는 것이 아닌
현실에서의 사물처럼 어떤 객체를 프로그래밍으로 표현 하는 것이 객체지향 프로그래밍 입니다.
또한 객체는 같은 클래스에서 생성되지만 객체와 객체는 서로 다른 성격(속성)을 가질 수 있게 됩니다.
자동차를 예로 들어 봅시다. 자동차는 객체입니다. 자동차의 기능들은 모두 동일하지만 성능이나
외부 모양새는 분명히 각각 차이가 있게 됩니다. 이것이 객체입니다. 하지만 분명히 자동차는
자동차라는 범주에 들어가며 공통적인 특징과 속성들을 갖고 공통적인 기능을 가지고 있습니다.
이것을 정의하는 것이 클래스를 작성하는 것 입니다.
자동차의 기능을 생각해 봅시다.
달리고(run) 가속하고(accelerate) 감속하고(break) 주차하고(park) 더 있겠지만 이정도로 하구요.
속성을 생각해보면
최대속도(maxSpeed), 현재속도(currentSpeed), 상태(state, 주차냐 주행이냐..등)
차의종류(carType, 버스,트럭,승용등..) 등..
위와 같이 자동차라는 객체를 기능과 속성들을 생각하고 나면 클래스를 작성할 수 있습니다.
AS 1.0을 배우셨다니까 AS 1.0의 클래스 작성규칙에 따라서 지금 생각해본 자동차 클래스를 생성해보면
다음처럼 간단하게 작성해 볼 수 있습니다.
function Car()
{
this.maxSpeed = 120;
this.currentSpeed = 0;
this.carType = "";
this.state = "park";
}
Car.prototype.run = function()
{
if(this.state != "run") //가속중에 런을 실행하면 다시 속도가 10으로 설정되는것을 막음
{
trace("달린다");
this.currentSpeed = 10; //현재 속도를 10으로 설정하여 달리기 시작함
this.state = "run" //상태를 달리는 상태로 표시
}
else
{
trace("지금 달리고 있습니다.");
}
}
Car.prototype.accelerate = function()
{
trace("가속");
if(this.state != "park") //주차 상태에서 가속 할 수는 없으므로
{
this.state = "run";
var speedNum = this.currentSpeed + 10; //현재 스피드에 10을 가속하여 speedNum 지역 변수에 저장
if(speedNum <= this.maxSpeed ) //만약 최대 스피드보다 작거나 같다면
{
this.currentSpeed = speedNum; //현재 속도에 적용
}
else //그렇지 않고 최대 스피드 보다 크다면
{
this.currentSpeed = this.maxSpeed; //최대 스피드로 현재 속도를 적용하여 속도 제한
}
}
else
{
trace("지금은 주차 중이므로 가속 할 수 없습니다.");
}
}
Car.prototype.breaking = function()
{
var breakNum = this.currentSpeed - 10; //현재 속도에서 10을 감소하여 breakNum지역 변수에 대입
if(breakNum >= 0) //breakNum이 0보다 크거나 같다면
{
this.currentSpeed = breakNum; //현재 속도에 적용
if(this.currentSpeed == 0)
{
this.state = "stop"; //속도가 0일경우 상태는 "stop";
}
}
else //그렇지 않고 0보다 작다면 브레이크를 밟을 때 속도가 -가 될 수는 없으므로
{
this.currentSpeed = 0; //속도를 0으로 설정
//만약 현재 상태가 주차가 아니라면, 주차일 경우 브래이크를 밟는다고 해도 주차상태가 변하지 않으므로
if(this.state != "park")
{
this.state = "stop" //속도가 0이므로 멈춤 상태로 표시
}
}
}
Car.prototype.parking = function()
{
if(this.state == "stop") //차가 멈춰 있지 않다면 주차 할 수 없으므로
{
this.stae = "park";
}
else if(this.state == "run")
{
trace("주행 중이므로 주차 할 수 없습니다. 속도를 줄이세요.");
}
}
위와 같이 1.0방식으로 자동차의 기능과 속성에 따라 클래스를 만들었습니다. 그리고 다음처럼
객체화 하고 사용합니다.
var car = new Car();
//카 타입에 따라 내부적으로 속성이 변화 하게 한다면 즉 최대 스피드 등이 변화 하게 할 수 있을 것입니다.
//위의 클래스에서 구현하지는 않았습니다.
car.carType = "승용차" //일단 승용차라고 해두죠.
car.run(); //주차를 해제하고 달리기 시작, 현재속도는 10이겠네요.
car.accelerate(); //가속을 했지요. 현재속도 20
car.parking (); //주차하려 했지만 가속했기 때문에 주차 할 수 없다고 나오겠네요.
car.breaking (); //-10감속 현재속도 10이겠죠
car.breaking (); //다시 -10감속. 현재속도 0, 현재상태 "stop"이되었을 겁니다.
car.breaking (); //브레이크를 세번이나 밟았네요. 멈춘상태에서 밟았으니 변화는 없습니다.
car.parking (); //이제 주차가 됩니다.
car.accelerate(); //주차 상태에서 액셀을 밟았지만 달릴 수 없다고 출력 될 것이겠죠.
위 처럼 자동차 클래스를 만들고 자동차 객체를 생성해서 달리고 멈추고 주차하고를
해 보았습니다. 만약 자동차가 여러대 필요 한 상황이라면 게다가 트럭과 승용이 필요하다면
다음과 같이 하면 되겠지요.
var car0 = new Car();
car0.carType = "트럭"
var car1 = new Car();
car1.carType = "승용차"
이처럼 다양한 객체를 하나의 클래스로 생성하고 필요한 기능을 하도록 프로그래밍 하는것이
객체지향 프로그래밍 인것입니다. 여러가지 타입의 자동차를 정의하는것은 부모클래스에서
상속하여 다형성화 하는것이 객체지향에 적합하지만 상속에 대해 설명하자면 안그래도 긴
답변이 엄청나게 길어지므로 직접 책을 찾아 보시기 바랍니다.
절차지향에서는 데이터의 타입이라는 개념이 없었음 대신 구조체라는 개념이 있었는데
기본적인 컴퓨터에쓰이는 데이터 타입을 그룹으로 묶어서 메모리에 구성을 만드는 방식이었음
그 구조체가 발전해서 지금의 객체지향의 객체가 된거고 구조체는 기능이 없지만 객체는 기능이 있지
구조체는 그냥 데이터의 저장 배열 형태고 객체는 데이터도 저장하고 함수도 가질 수 있음 절차지향에서 함수를 function 이라고 불렀는데 객체지향에서는 Method 라고 하고 절차지향에서는 변수 상수만 있었지만 객체지향에서는 외부속성과 내부속성 내부상수 전역상수.. 종류도 겁나 많어 좀 공부를 많이 해야 되지만 이해하고나면 코딩하기 편해진다