CH.개인기록 노트

C#은 처음이라

C# 추상화(Abstract)

amckdgjs 2024. 3. 6. 15:47

Abstract 추상

클래스를 정의할 때 구체화 시킬 수 없는 기능을 추상적 표현으로 정의한다.

객체 지향에서 추상화는 객체의 공통된 특징을 추출하여 인터페이스나 추상 클래스로 정의하는 것을 의미한다..

추상 클래스(Abstract class)

  • 하나 이상의 추상 함수를 포함하는 클래스
  • 클래스가 추상적인 표현을 정의하는 경우 자식 클래스에서 구체화시켜 구현할것을 염두해야 함
  • 추상 클래스는 인스턴스화 될 수 없으며, 파생 클래스에서 추상 멤버를 구현해야 함
 abstract class Animal//class 앞에 abstract 선언
 {
     //상위클래스에서 구현하기 어려운 기능
     //->무슨 동물이 어떻게 운다는건데? ->그래서 구체화를 시켜야함
     public abstract void Cry();
 }
 class Cat : Animal
 {
     public override void Cry()//override
     {
         Console.WriteLine("애옹애옹");
     }
 }

 

아래 코드에서는 오류가 난다. 이유가 뭘까?

    abstract class Shape
    {
        public abstract void Draw();

        public virtual void Show()
        {
            Console.WriteLine("shape 출력");
        }
    }
    class Circle : Shape
    {
        double radius;
        public Circle(double radius)
        {
            this.radius = radius;
        }
        public override void Draw()
        {
            Console.WriteLine($"반지름{radius}");
        }
    }
    class Rectangle : Shape
    {
        double width;
        double height;

        public Rectangle(double width, double height)
        {
            this.width = width;
            this.height = height;
        }
        public override void Draw()
        {
            Console.WriteLine("ㅇㅅㅇ");
        }
        public override void Show()
        {
            
        }
    }
    static void Main(string[] args)
    {
        //구체화한 자식에서는 인스턴스 생성이 가능하고 기능을 사용할수있음
        Item item = new Potion(); //추상클래스는 인스턴스 생성 X
        item.Use();
        Shape shape = new Circle();
        shape.Draw();

        
    }
}

Shape shape = new Circle();에서 오류가 발생한다. 

Circle 클래스는 Shape 추상 클래스를 상속중인데,추상 클래스는 직접적으로 인스턴스 생성이 불가능하다. 그래서 오류가 발생했다.이 문제를 해결하려면?

Shape shape = new Circle(5);

이렇게 Shape 타입의 변수에 할당하여 Circle의 Draw()라는 메서드를 호출할 수 있다.

인터페이스(Interface)

  • 인터페이스는 추상클래스의 일종으로 동일한 특징을 가지고 있다.
  • 함수에 대한 선언만 하고 이를 포함하는 클래스에서 구체화 한 다음 사용한다.
  • 인터페이스는 다중 상속을 허용한다.

추상클래스와의 공통점:

  • 함수에 대한 선언만 정의한다.
  • 자식 클래스에서 구체화한다.

인터페이스는 다양한 객체가 동일한 동작을 수행할 수 있도록 해준다.밑에 예시처럼 자동차 종류는 여러가지이지만 모두 같은 동작인 출발과 멈춤이라는 동작을 해야한다.이 때 인터페이스를 사용하여 동작을 정의하고 자동차 클래스가 이를 구현한다.

interface ICar
{
    void Start();
    void Stop();
}

class Sedan : ICar
{
    public void Start()
    {
        Console.WriteLine("Sedan이 출발합니다.");
    }

    public void Stop()
    {
        Console.WriteLine("Sedan이 멈춥니다.");
    }
}

class SUV : ICar
{
    public void Start()
    {
        Console.WriteLine("SUV가 출발합니다.");
    }

    public void Stop()
    {
        Console.WriteLine("SUV가 멈춥니다.");
    }
}

 

'C#은 처음이라' 카테고리의 다른 글

C# 문자열(string)  (0) 2024.03.07
C# 가상함수  (0) 2024.03.06
C# 배열 활용  (0) 2024.03.06
C# 캡슐화  (0) 2024.03.06
C# 데이터 형식  (1) 2024.03.04