안전한 설계를 위한 추상 클래스, 추상 함수, 인터페이스에 대한 내용
추상 함수 (추상 메소드)
클래스 안에 들어가 있는 함수(메소드)의 구현부가 정의되지 않은 함수.
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 |