다형성을 위한 가상함수와 업캐스팅, 다운캐스팅

완벽하게 이해하려면 직접 설계해봐야 할 듯..


업캐스팅

특정 객체가 하위 클래스의 형에서 상위 클래스의 형으로 캐스팅(형변환) 되는 것

하나의 매개변수의 형으로 여러 형을 받을 수 있다.

 

인터페이스와 추상클래스의 업캐스팅 차이

interface 인터페이스
{
	void 추상함수1();
}

public abstract class 추상클래스
{
	public abstract void 추상함수2();
}

public class 하위클래스 : 추상클래스, 인터페이스
{
	public void 추상함수1() // 인터페이스 오버라이딩
    {
    }
    
    public override void 추상함수2() // 추상클래스 오버라이딩
    {
    }
}

public class MainClass
{
	public static void Main()
    {
    	하위클래스 하위 = new 하위클래스();
        
        // 인터페이스 업캐스팅
        인터페이스 up1 = 하위; // 인터페이스: 상위클래스
        
        // 추상클래스 업캐스팅
        추상클래스 up2 = 하위; // 추상클래스: 상위클래스
        
    }
}

 

가상함수

상위클래스는 virtual을 사용하여 가상함수로 함수를 선언할 수 있다.

하위클래스는 override를 사용하여 가상함수를 오버라이딩할 수 있다.

오버라이딩 된 가상함수는 업캐스팅을 통해 상위 클래스가 사용할 수 있다.

가상함수의 조건 : 오버라이딩 된 상태 + 업캐스팅 된 상태

class 부모
{
	public void 아빠차() // 일반함수
    {
    	구닥다리 옛날차
    }
    
	public virtual void 엄마차() // 가상함수
    {
    	구닥다리 옛날차
    }
}

class 자식 : 부모
{
	new public void 아빠차() // 일반함수 오버라이딩
    {
    	튜닝한 슈퍼카
    }

	public override void 엄마차()  // 가상함수 오버라이딩
    {
    	튜닝한 슈퍼카
    }
}

class MainClass
{
	public static void Main()
    {
    	부모 아빠 = new 부모();
        자식 아들 = new 자식();
        
        아빠 = 자식; // 업캐스팅
        
        아빠.아빠차(); // 구닥다리 옛날차
        아빠.엄마차(); // 튜닝한 슈퍼카
    }
}

 

 

업캐스팅, 다운캐스팅

업캐스팅

상위클래스 up = new 하위클래스(); // 암시적 형변환

up.상위클래스합수();

하위클래스가 오버라이딩한 함수가 동작한다.

 

다운캐스팅

이미 업캐스팅 된 상태에서 다시 하위클래스로 들어가는 경우

상위클래스 up = new 하위클래스();

하위클래스 down = (하위클래스)up; // 명시적 형변환

down.상위클래스함수();

down.하위클래스고유함수();

하위클래스가 오버라이딩한 함수가 동작한다.

하위클래스고유함수를 사용할 수 있다.

 

* 이게 맞나?

하위클래스는 상위클래스를 상속받아 상위클래스 데이터를 포함하고 있기 때문에 암시적 형변환이 가능하나

상위클래스는 하위클래스 고유의 데이터를 갖고 있지 않기 때문에 명시적으로 형변환하여야 한다?

 

그래서...

가상함수를 사용하는 이유는 업캐스팅, 다운캐스팅을 통해 다형성을 지원하기 위함이라고 한다.

728x90

'Program > C (C++,C#)' 카테고리의 다른 글

추상 클래스 vs 인터페이스  (0) 2023.02.07
[C#] Property  (0) 2022.08.16
[C#] 대리자와 이벤트  (0) 2022.08.11
[C#] 파일 다루기  (0) 2022.08.10
[C++] 해시 테이블  (0) 2022.07.06

+ Recent posts