목표

  • 추상화에 대해 알아보자.

추상화(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

  • 구현 내용은 Square와 동일하다.
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
    }
}

+ Recent posts