
리스트까지 unit에 있는 move()메서드를 출력하였다. 과연 zergling클래스에 다르게 ## 가상 메서드와 추상 메서드
추상 메소드와 가상 메소드를 오늘 배웠는데 둘의 성격이 비슷하면서 다른 것 같고 앞으로 class를 많이 사용하게 될탠데 그때 자식class도 따라서 많이 쓰게 될 것이다. 거기에 쓰는 메소드 종류이다.
아래 코드를 봐보자.
internal class Program
{
public class Unit
{
public void Move()
{
Console.WriteLine("두발로 걷기");
}
public void Attack()
{
Console.WriteLine("Unit 공격");
}
}
public class Marine : Unit
{
}
public class Zergling : Unit
{
public void Move()
{
Console.WriteLine("네발로 걷기");
}
}
static void Main(string[] args)
{
List<Unit> list = new List<Unit>();
list.Add(new Marine());
list.Add(new Zergling());
foreach(Unit unit in list)
{
unit.Move();
}
}
}
아까와 조금 다른 점이 보일 것이다. 이 코드에서는 Zergling이라는 자식class에 Move메서드를 부모메서드랑 다르게 만들어 두었다. 아래에 list를 활용하여 marine()과 zergling()을 리스트에 추가해주고 foreach문을 이용하여 추가된만들어둔 "네발로 걷기"가 나올까? 한번 디버그 해보자.

아쉽게도 바꾼 "네발로 걷기"가 나오지 않았다.
여기서 virual의 기능을 알아야한다.
라는 뜻이다. 여기서 참조의 형태(unit), 실형태(Marine(),Zergling())이다.
연결해서 설명하자면 virual을 사용하면 실형태인 Marine(),Zergling()가 재정의 되어있는지 확인하고 재정의 되어있으면 그것을 사용해라. 라는 뜻이 된다. 재정의 하려면 재정의 메서드에 override를 꼭 써야한다. 코드를 고쳐서 다시 써보면
public virtual void Move()
{
Console.WriteLine("두발로 걷기");
}
public class Zergling : Unit
{
public override void Move()
{
Console.WriteLine("네발로 걷기");
}
}
이렇게 되면 재정의된 "네발로 걷기"가 잘 출력이 될 것이다.

아래 코드를 보자.
abstract class Shape
{
public abstract void Draw();
}
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a circle");
}
}
class Square : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a square");
}
}
class Triangle : Shape
{
public override void Draw()
{
Console.WriteLine("Drawing a triangle");
}
}
abstract로 shape 추상 클래스를 생성하였다. 반드시 자식 클래스에서 구현되어야 하기 때문에 Shape를 상속받는 자식 클래스들은 반드시 Draw()메서드를 구현 해야한다. 그렇기 때문에 모든 자식 클래스에 override 쓰고 Draw()메서드가 있는 것을 볼 수가 있다.
추상 메서드와 가상 메서드를 알아보았는데 공부하면서 한가지 느낀 것은 먼가 영어 배울때 must와 should의 차이점이랑 비슷해 보였다. 영어에서도 must는 반드시라는 느낌이 라면 should는 같은 해야한다지만 반드시는 아니고 해도 되고 안해도 되는 느낌이라고 배웠는데, 이거 배울때도 추상이 must, 가상이 should라는 느낌이 들어서 알아듣는데에 그렇게 오래걸리지 않았던 것 같다. 아직 이것에 대해 활용할 수 있을지는 잘 모르겠지만 조금 더 공부해서 코드에 적용할 수 있도록 노력해야겠다.