객체지향 - 상속
OOP 2010. 10. 6. 04:32상속이란?
코드 재사용의 한 형태로 기존 클래스를 상속받아 새로운 클래스를 생성할 수 있다.
기존 클래스는 일반적으로 기본 클래스 혹은 슈퍼클래스로 불리며 새로운 클래스는 하위클래스로 명칭한다.
상속의 가장 큰 장점은 기존의 클래스 코드를 그대로 둔 상태에서 기본클래스의 코드를 재사용하는데 있다.
기존의 클래스를 모듈로 취급하고 새로운 속성과 메서드를 추가하여 확장할 수 있다. extends 키워드를 사용하여 상속된 클래스임을 나타낸다.
슈퍼클래스를 상속받은 하위클래스는 슈퍼클래스의 모든 메서드와 속성에 접근할 수 있다.
// 슈퍼클래스 Shape
class Shape
{
public function area():Number
{
return NaN;
}
public function draw(shapeToDraw:Shape)
{
// 그리는 코드
}
}
// Shape 클래스를 상속
class Circle extends Shape
{
private var radius:Number = 1;
override public function area():Number
{
return (Math.PI * (radius * radius));
}
}
// Shape 클래스를 상속
class Square extends Shape
{
private var side:Number = 1;
override public function area():Number
{
return (side * side);
}
}
// 슈퍼클래스를 상속받은 클래스의 인스턴스를 통해 슈퍼클래스의 area() 메서드를 사용할 수 있다.
// 하위클래스는 기본클래스의 모든 속성을 가지므로 하위클래스의 인스턴스를 기본클래스의 인스턴스 대신 항상 사용할 수 있다.
var cir:Circle = new Circle();
trace(cir.area()); // output: 3.141592653589793
var sq:Square = new Square();
trace(sq.area()); // output: 1
// 메서드에 Shape 유형 매개변수가 정의된 경우 Circle 유형의 인수를 전달 할 수 있다.
var myCircle:Circle = new Circle();
draw(myCircle);
액세스 제어 지정자
public 키워드로 선언된 속성 혹은 메서드는 어느 위치에서나 접근이 가능하고,
private 키워드로 선언된 속성 혹은 메서드는 해당 클래스 내에서만 접근할 수 있다.
internal 키워드는 같은 패키지 내에 있는 하위클래스만 접근할 수 있고,
protected 키워드로 선언된 속성 혹은 메서드는 패키지에 관계없이 상속받은 하위클래스에서 접근이 가능하다.
// base 폴더 내의 Base 클래스
package base
{
public class Base
{
public var str:String = "hello";
private var privStr:String = "클래스안에서만 호출됩니다.";
protected var protStr:String = "패키지 달라도 Base 상속하면 사용가능";
// 접근자 키워드가 없으면 자동으로 internal 로 지정된다.
internal var interStr:String = "internal은 같은 패키지내의 하위 클래스에서만";
}
}
// extend 폴더 내의 Extender 클래스
package extend
{
import base.Base;
public Extender extends Base
{
public function getString():String
{
return str;
}
}
}
// 메인 클래스
package
{
import flash.display.Sprite;
import extend.Extender;
public class AccessTest extends Sprite
{
public function AccessTest()
{
var ext:Extender = new Extender();
trace( ext.str ); // hello 출력
trace( ext.privStr ); // error
trace( ext.getString() ); // Base 의 하위클래스 Extender의 메서드로 hello 출력
}
}
}
* var 또는 const 로 선언된 속성, 즉 변수들은 상속은 되지만 재정의는 불가능하기 때문에, getter, setter 를 이용한다.