객체지향 - 상속

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 를 이용한다.


: