본문 바로가기

C# 프로그래밍/문법 개념

[C#] 추상화 (Abstraction)

반응형

추상화란 무엇인가?

미술에서 자주 쓰이는 추상화(抽象畫)는 구체적 이미지가 아닌 점, 선, 면같은 단순한 요소로 표현을 하는 하나의 기법이다. 그렇다면 컴퓨터 과학에서 사용하는 추상화(抽象化)란 무엇일까?

 

C#에서는 추상클래스를 통해 추상화를 하고 상속받은 자식 클래스가 추상 메서드 또는 추상 프로퍼티를 오버라이드 하면서 완전한 구현이 이루어진다.

추상 클래스는 미술에서의 추상화처럼 기본적인 요소들로만 이루어진 미완성된 클래스이다.

다시 말해, 추상 클래스라는 미완성 클래스를 이용해서 구체적이지 않은 틀을 제작하고 자식 클래스가 구체적 내용을 작성하게 되는 것이다.


왜 추상화를 사용하는가?

추상화를 하지 않더라도 클래스를 상속하면 virtual과 override를 통해 재정의가 가능하다. 그런데 왜 굳이 추상화라는 기능이 별도로 존재하는 것일까.

 

이유는 간단하다. 추상화를 통해 추상 클래스를 상속받는 자식 클래스가 추상 메서드 혹은 추상 프로퍼티를 오버라이드 하여 재정의 하도록 강제하기 때문이다. 사용의 강제성을 띄기 때문에 프로그래머는 오류를 줄일 수 있게 된다.


어떻게 사용할 수 있는가?

우선 추상클래스를 작성해야 한다. 추상 클래스는 abstract라는 키워드가 붙는다.

그리고 클래스가 추상 클래스라면 추상 메서드를 사용할 수 있다. 마찬가지로 추상 메서드는 abstact키워드가 붙어야 한다.

public abstract class Nationality
{
    public string nationName;
    public int population;
    public float gdp;
    
    public void LogPopulation()
    {
        Debug.Log("population is " + population);
    }
    
    public abstract void PopulationIncrease();
}

나머지 멤버 변수를 일반 클래스와 동일하게 작성할 수 있다.

 

아래 스크립트는 추상 클래스를 상속받은 Asia클래스이다.

public class Asia : Nationality
{
    public bool isHanRiverTouched;
    public int asianGameGoldMedalCount;

    public override void PopulationIncrease()
    {
        //Do something...
    }
}

추상 메서드를 사용하면 상속을 받는 자식 클래스는 해당 메서드를 반드시 override 하여 구체적 내용을 명시하여야 한다.

 

부모 클래스인 Nationality는 어떤 함수를 사용하게 할지 함수의 한정자, 반환 형식, 메서드 이름, 매개변수까지만 작성하였다. 이렇듯 부모 클래스에서는 빈껍데기만 제공하기 때문에 추상(구체의 반대말) 클래스인 것이다. 나머지는 자식 클래스(구체 클래스?)가 작성한다.

 

특히 추상 클래스는 자신의 인스턴스 생성이 불가하고 상속받은 자식을 통한 인스턴스 생성만 가능하도록 되어있는데, 이 때문에 추상 클래스는 상속을 위한 클래스라고 생각하면 될 것 같다.

 

이와 비슷한 것으로 인터페이스가 존재한다.


인터페이스와는 어떠한 차이점이 있는가?

가장 큰 차이점은 다중 상속이 가능하냐는 것이다.

추상 클래스는 클래스이기 때문에 기본적으로 하나의 부모만 가질 수 있다. 이를 통해 죽음의 다이아몬드 문제를 피해 가는 것이다. 

하지만 인터페이스는 하나의 클래스가 여러 개의 인터페이스를 상속할 수 있다.

인터페이스는 어떻게 다중 상속이 가능한 것일까.

 

그 이유는 인터페이스의 모든 멤버 변수 및 함수가 추상 상태이기 때문이다. 아무것도 구현되어 있지 않기 때문에 죽음의 다이아몬드와 같은 문제가 발생하지 않는다. 따라서 다중 상속이 가능하다. 반면 추상 클래스는 일반 메서드나 변수도 선언되어 있기 때문에 다중 상속 시 문제가 발생할 수 있다.

반응형