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가 멈춥니다.");
}
}