안전한 설계를 위한 추상 클래스, 추상 함수, 인터페이스에 대한 내용


추상 함수 (추상 메소드)

클래스 안에 들어가 있는 함수(메소드)의 구현부가 정의되지 않은 함수.

 

abstract class 추상클래스
{
	// 추상 함수
	public abstract void 함수이름();
    
    // 일반함수
    public void 함수이름()
    {
    
    }
}

설계도(추상 함수)를 상속받은 자식클래스에게 구현을 넘긴다.

클래스에 필수적으로 구현되어야하는 기능을 추상함수로 설계하여 구현을 강제할 수 있다. (오류를 줄일 수 있음)

 

abstract class 직업
{
	string 이름;
    int hp;
    int mp;
    int attackPower;
    
    // 일반 함수
    public void 공격()
    {
    	무기 휘두르기
    }
    
    // 추상 함수
    public abstract void 특수공격(); // 직업마다 고유한 기능이 구현되어야 한다.
}

class 전사 : 직업
{
	public override void 특수공격() // 부모 클래스의 추상 함수를 구현
    {
    	점프해서 2번 연속 공격하는 기능
    }
}

class 마법사 : 직업
{
	new public void 공격() // 부모 클래스의 일반 함수 오버라이딩
    {
    	매직 에로우 날리기
    }

	public override void 특수공격() // 부모 클래스의 추상 함수를 오버라이딩하여 구현
    {
    	거대한 파이어볼을 날리는 기능
    }
}

abstract 를 사용하여 추상 클래스, 추상 함수를 선언할 수 있다.

자식 클래스는 override 를 사용하여 추상 함수를 오버라이딩하여 구현할 수 있다.

* new 를 사용하면 일반 함수를 오버라이딩 할 수 있다.

 

 

추상 클래스 vs 인터페이스

C#에서는 죽음의 다이아몬드 현상으로 인하여 클래스의 다중상속이 불가능하다.

추상 클래스에도 일반함수가 포함될 수 있기 때문에 다중 상속이 불가능하다.

따라서 여러 추상 클래스를 활용한 다양한 기능들을 강제하는 설계가 불가능하다.

 

그렇기에 일반 변수와 일반 함수가 구현될 수 없는 설계도(추상 함수)만 존재하는 인터페이스가 탄생하게 되었다.

인터페이스는 추상 함수만 존재하기 때문에 abstract 키워드를 붙이지 않아도 된다.

인터페이스에 구현된 추상 함수는 추상 클래스의 추상 함수와 동일하게 구현을 강제한다.

abstract class 캐릭터
{
	int hp;
    int mp;
    int attackPower;
    
    public abstract void 공격();
}

interface 직업
{
	void 특수공격(); // abstract를 사용하지 않아도 된다.
}

interface 종족
{
	void 종족스킬(); // abstract를 사용하지 않아도 된다.
}


class 엘프궁수 : 직업, 종족
{
	// 추상 클래스 오버라이딩
    public override void 공격()
    {
    	화살을 쏘는 기능
    }

	// 인터페이스 오버라이딩
	public void 특수공격() // override를 사용하지 않아도 된다.
    {
    	하늘에서 화살이 떨어지는 기능	
    }
    
    // 인터페이스 오버라이딩
    public void 종족스킬() // override를 사용하지 않아도 된다.
    {
    	캐릭터가 은신하는 기능
    }
}

 

 

 

728x90

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

가상함수와 업캐스팅, 다운캐스팅  (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