본문 바로가기
Unity 게임 개발

C# 추상메소드와 인터페이스 설명

by daisy0461 2021. 4. 14.

게임을 만들면서 연구실 옆에 친구가 추상메소드와 인터페이스를 사용해서 설계를 해보라는 말을 해줘서
처음에 그거 분명히 배웠는데 뭐였지..? 생각이 잘 안나서 이번에 복습을 하게 되었습니다.

 

추상메소드

추상메소드라는 것은 설계도와 비슷합니다. 집을 지을 때 기둥과 같은 역할을 하는데 이게 무슨 의미냐면

집을 지을 때 깜박하고 기둥을 세우지 않았습니다. 그렇다면 집이 무너지는 큰 사고가 발생하겠죠?

이러한 사태를 방지하기 위해서 꼭 꼭 꼭 만들어야하는 기능을 명시한 것이 추상메소드입니다.

 

그러므로 추상메소드가 있는 추상 클래스를 참조하게 된다면 반드시

반드시

반드시 기능을 구현해야합니다. 

그렇지 않으면 에러가 뜨게 됩니다.

집에서 기둥을 세우지 않아서 야 빨리 기둥 세워야지!! 하고 붉은 줄을 띄워주는 것입니다.

 

예시를 들자면 다음과 같습니다.

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는 일반 함수를 선언할 수 없기 때문입니다.

 

추상메소드와 인터페이스를 잘 활용하면 잊지 않고 설계를 한 부분에 대해서 코딩을 할 수 있고

에러를 띄워주니까 편안한 마음으로 기획도 할 수 있을 것 같습니다.