목표
추상화(Abstraction)
- 컴퓨터 과학에서 추상화란 복잡한, 모듈, 시스템으로 부터 공통이 되는 속성이나 기능을 추출하는 것을 말한다.
- 추상화된 클래스는 상속을 통해 공통이 되는 속성이나 기능을 전달 할 수 있지만, 스스로 인스턴스화 할 수는 없다.
- 이러한 클래스를 추상 클래스(abstract class)라 부른다.
- 이 추상 클래스에는 추상 메서드(abstract method)를 선언할 수 있다.
- 만약 추상 클래스가 추상 메서드로만 이루워져 있는 경우 이를 순수 추상 클래스(pure abstract class)라 한다.
추상 클래스(abstract class)
- 다음은 Shape라는 추상화 객체에 대한 예제이다.
- 추상 클래스는 자료형을 멤버로 가질 수 있다.
- 추상 클래스는 추상 메서드와 일반 메서드를 포함할 수 있다.
- 추상 클래스는 생성자를 포함할 수 있다.
- _shape가 protected로 설정되어 있는 부분을 보면, 추상 클래스는 접근 가시자를 설정할 수 있다.
- 일반 메서드의 경우 static으로 선언할 수 있다.
Shape
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public abstract class Shape
{
protected string _shape { get; set; }
public abstract void Draw();
public Shape()
{
Debug.Log("Shape Constructors");
}
public void PrintShape()
{
Debug.Log("Current Shape : " + _shape);
}
public static Shape CreateShapeFactory(int shapeType)
{
if (shapeType == 0)
{
return new Circle();
}
else if (shapeType == 1)
{
return new Sequare();
}
// 미리 정의되지 않은 값이 들어오면 throw를 발생 시킨다.
throw new ArgumentException("Unknown Shape Type");
}
}
Square
- 사각형의 경우, Shape를 상속 받았다.
- 이때 Shape에서 abstract로 선언한 Draw는 반드시 구현해야 한다.
- Draw를 구현할 때는 override 키워드를 사용한다.
- _shape는 Shape에서 proected로 정의되어있기 때문에, Square에서 접근 가능하다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Square : Shape
{
public Square()
{
_shape = "Square";
}
public override void Draw()
{
Debug.Log("draw square");
}
}
Circle
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Circle : Shape
{
public Circle()
{
_shape = "Circle";
}
public override void Draw()
{
Debug.Log("draw circle");
}
}
ShapeSample
- ShapeSample에서는 upcasting을 사용하여 Shape가 Circle로 인스턴스화 하고 있다.
- upcasting : 부모 클래스의 자료형으로 자식 클래스를 카리키는 것
- downcasting : 업케스팅된 자료형을 다시 부모 클래스로 바꿔주는 것
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ShapeSample : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Shape circle = Shape.CreateShapeFactory(0);
circle.Draw();
circle.PrintShape(); // circle
Shape rectangle = Shape.CreateShapeFactory(1);
rectangle.Draw();
rectangle.PrintShape(); // ractangle
}
}