게임을 만들면서 연구실 옆에 친구가 추상메소드와 인터페이스를 사용해서 설계를 해보라는 말을 해줘서
처음에 그거 분명히 배웠는데 뭐였지..? 생각이 잘 안나서 이번에 복습을 하게 되었습니다.
추상메소드
추상메소드라는 것은 설계도와 비슷합니다. 집을 지을 때 기둥과 같은 역할을 하는데 이게 무슨 의미냐면
집을 지을 때 깜박하고 기둥을 세우지 않았습니다. 그렇다면 집이 무너지는 큰 사고가 발생하겠죠?
이러한 사태를 방지하기 위해서 꼭 꼭 꼭 만들어야하는 기능을 명시한 것이 추상메소드입니다.
그러므로 추상메소드가 있는 추상 클래스를 참조하게 된다면 반드시
반드시
반드시 기능을 구현해야합니다.
그렇지 않으면 에러가 뜨게 됩니다.
집에서 기둥을 세우지 않아서 야 빨리 기둥 세워야지!! 하고 붉은 줄을 띄워주는 것입니다.
예시를 들자면 다음과 같습니다.
abstract class job{
pulbic abstract void skill();
pulbic void basicSetting(){
//~~~~
}
}
이렇게 추상메소드를 사용할 때 주의할 점은 class에 abstrack를 붙여주어야 한다는 점입니다.
간단한 코드라서 그렇지 정말 긴 코드 5000줄짜리 class라고 가정을 하면 이 class가 추상클래스인지 알기 위해서 ctrl+f를 해서 항상 찾아보거나 그 코드를 쭉 읽어봐야 할 것입니다. 그러한 귀찮은 짓을 하지 않고 프로그래머에게 이 class는 추상메소드를 포함하고 있다라는 것을 알려줍니다.
저 위의 추상클래스를 참조하는 다른 class를 만들어서 예시를 들어보겠습니다.
class warroir: job{
int hp = 100;
int mp = 100;
private void w_skills(){
}
}
위와 같이 코드를 짜면 에러가 뜨게 됩니다. skill이라는 함수를 오버라이딩 정의해주지 않았기 때문입니다.
집을 만들 때 기둥을 꼭 세워라고 했는데 안 세운 경우 입니다.
class warroir: job{
int hp = 100;
int mp = 100;
private void w_skills(){
}
public override void skill(){
Debug.Log("돌진!!");
}
}
이와 같이 재정의를 할 때 override라는 것을 명시를 해주어야합니다.
다양한 예시를 들었는데 꼭 설계를 해야하는 부분에 대해서 까먹지 않고 코드를 짜라고 에러를 띄워가며
강조를 하도록 하는 방법이 추상메소드입니다.
인터페이스
이제 인터페이스를 설명해야하는데 인터페이스의 필요성에 대해서 설명을 드리겠습니다.
그 필요성은 추상클래스는 1개 이상 참조할 수 없기 때문입니다. 예시를 다시 만들어서 보여드리겠습니다.
abstract class Devil_mind {
pulbic void Inner_voice(){
Console.WriteLine("하지마");
}
public abstract void win();
}
abstract class Angle_mind{
public void Inner_voice(){
Console.WriteLine("하고 쉬자");
}
public abstract void win();
}
class Me: devil_mind, angle_mind{
abstract void win(){
Console.WriteLine("아무나 이겨라");
}
}
class main{
Me me = new me();
me.Inner_voice();
me.win();
}
이렇게 코드를 만들었다면 문제점이 생깁니다. 추상클래스는 추상메소드 뿐만 아니라 일반 함수 또한 가지고 있기 때문에 me.Inner_voice()에서 Devil이 말하는지 Angle이 말하는지 모르는 것입니다. 무슨 말을 출력을 해야하는지 모른다는 것입니다. 충돌이 일어날 수 있다는 것입니다.
이렇게 일반 함수 또한 추상클래스에 포함이 되어 있을 수 있어서 추상클래스는 다중상속이 되지 않습니다.
그렇다면 다중상속은 어떻게 하면 할 수 있을까요??
쉽습니다. 일반 함수를 선언 못하는 class를 만들면 다중상속이 됩니다. 추상메소드만 있으면 그 추상메소드 내부는 아마것도 없는 빈껍데기이기 때문에 어디서 불려오든 ovrride할 때 기능을 정해주면 되기 때문입니다.
interface my_friend_cute{
void voice();
void 애교();
}
interface my_friend_angry{
void voice();
void hit();
}
class friend: my_friend_cute, my_friend_angry{
public void 애교(){
Console.WriteLine("이이잉");
}
public void voice(){ //중복 되어 있는 메소드
Console.WriteLine("굵은 목소리");
}
public void hit(){
Console.WriteLine("퍽");
}
}
이러한 방식으로 interface는 다중상속을 해주어도 에러가 뜨지 않습니다.
interface는 일반 함수를 선언할 수 없기 때문입니다.
추상메소드와 인터페이스를 잘 활용하면 잊지 않고 설계를 한 부분에 대해서 코딩을 할 수 있고
에러를 띄워주니까 편안한 마음으로 기획도 할 수 있을 것 같습니다.
'Unity 게임 개발' 카테고리의 다른 글
C# Unity Delegate 설명 및 사용법 (0) | 2021.05.09 |
---|---|
C# Unity [SerializeField]와 [HideInInspector] (1) | 2021.04.19 |
Unity Mathf.Lerp 공부 (0) | 2021.03.29 |
Unity Time.realtimeSinceStartup 설명 및 공부 (0) | 2021.03.28 |
Unity time.time과 time.deltaTime의 설명 및 차이점 (0) | 2021.03.25 |