TIL7. 4/23 가상 메서드와 추상 메서드

김진영·2024년 4월 23일

스파르타코딩

목록 보기
6/39
post-thumbnail

리스트까지 unit에 있는 move()메서드를 출력하였다. 과연 zergling클래스에 다르게 ## 가상 메서드와 추상 메서드
추상 메소드와 가상 메소드를 오늘 배웠는데 둘의 성격이 비슷하면서 다른 것 같고 앞으로 class를 많이 사용하게 될탠데 그때 자식class도 따라서 많이 쓰게 될 것이다. 거기에 쓰는 메소드 종류이다.

1) 가상 메서드

  • 가상 메서드는 기본적으로 부모 클래스에서 정의되고 자식 클래스에서 재정의할 수 있는 메서드.
  • 가상 메서드는 virtual키워드를 사용하여 선언되며, 자식 클래스에서 필요의 따라 재정의 될 수 있음
  • 이를 통해 자식 클래스에서 부모 클래스의 메서드를 변경하거나 확장 가능

아래 코드를 봐보자.

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의 기능을 알아야한다.

  • virtual -> 실형태가 다를 수 있으니 실형태에 재정의가 되어있는지 확인해봐라

라는 뜻이다. 여기서 참조의 형태(unit), 실형태(Marine(),Zergling())이다.
연결해서 설명하자면 virual을 사용하면 실형태인 Marine(),Zergling()가 재정의 되어있는지 확인하고 재정의 되어있으면 그것을 사용해라. 라는 뜻이 된다. 재정의 하려면 재정의 메서드에 override를 꼭 써야한다. 코드를 고쳐서 다시 써보면

public virtual void Move()
        {
            Console.WriteLine("두발로 걷기");
        }
        public class Zergling : Unit
    {
        public override void Move()
        {
            Console.WriteLine("네발로 걷기");
        }
    }

이렇게 되면 재정의된 "네발로 걷기"가 잘 출력이 될 것이다.

2) 추상 메서드

  • 추상 클래스는 직접적으로 인스턴스를 생성할 수 없는 클래스
  • 주로 상속을 위한 베이스 클래스로 사용
  • 추상 클래스는 abstract 키워드를 사용하여 선언되며, 추상 메서드를 포함할 수 있음
  • 추상 메서드는 구현부가 없는 메서드로, 자식 클래스에서 반드시 구현되어야 함

아래 코드를 보자.

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()메서드가 있는 것을 볼 수가 있다.

3) 회고

추상 메서드와 가상 메서드를 알아보았는데 공부하면서 한가지 느낀 것은 먼가 영어 배울때 must와 should의 차이점이랑 비슷해 보였다. 영어에서도 must는 반드시라는 느낌이 라면 should는 같은 해야한다지만 반드시는 아니고 해도 되고 안해도 되는 느낌이라고 배웠는데, 이거 배울때도 추상이 must, 가상이 should라는 느낌이 들어서 알아듣는데에 그렇게 오래걸리지 않았던 것 같다. 아직 이것에 대해 활용할 수 있을지는 잘 모르겠지만 조금 더 공부해서 코드에 적용할 수 있도록 노력해야겠다.

0개의 댓글