jasu's blog
블로그 메뉴글
상속받은 인스턴스 메소드에서 멤버의 접근
[상속받은 인스턴스 메소드에서 멤버의 접근]
====================
멤버 접근:
서브클래스의 인스턴스 메소드
예제 :
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에서 발췌