본문 바로가기
프로그래밍/C#

[C#] 추상화 abstract, interface

by 아임코딩 2023. 5. 5.
728x90
반응형

소개

안녕하세요 아임코딩입니다.

 

이번에는 C#에서 사용하는 추상화에 대해서 알아보겠습니다.

 

유튜브 링크

https://youtu.be/tZoe_tdgMEY

 

 

추상화

  • 추상이란 사물이나 표상(表象)을 어떤 성질·공통성·본질에 착안하여 그것을 추출(抽出)하여 파악하는 것
  • 결국 어떤 공통적인 성질이나 본질을 추출하여 파악하는 것이 추상화의 핵심입니다.
  • 추상화의 핵심은 구체적인 사물을 추상적으로 표현하는 것입니다. 객체 지향 프로그래밍에서는 추상화를 통해 클래스를 정의하고, 인스턴스를 생성하여 사용합니다.

 

 

C#에서 추상화

  • 클래스 : 현실에 있는 다양한 사물들을 공통성, 본질을 추출하여 데이터와 메서드로 만들어서 제공합니다.
  • 추상 클래스 : 클래스들에서 공통적으로 사용되는 변수나 메서드를 추출하여 추상 클래스를 만들 수 있습니다. 추상 클래스는 객체를 만들 수 없고, 상속을 하는 역할로만 사용합니다. 추상 클래스에는 추상 메서드를 선언하는데 정의하지는 않고 추상 메서드의 정의는 자식 클래스에서 진행합니다.
  • 인터페이스 : 인터페이스는 추상 클래스와 비슷하지만, 모든 멤버가 추상 메서드와 상수로만 이루어져 있습니다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의한 모든 메서드를 반드시 구현해야 합니다. 인터페이스는 다중 상속을 지원하며, 클래스의 계층 구조를 유연하게 설계할 수 있도록 도와줍니다.
  • 클래스 : class 키워드를 사용합니다.
  • 추상 클래스 : abstract 키워드를 사용합니다.
  • 인터페이스 : interface 키워드를 사용합니다.

 

 

 

클래스

클래스는 일상에 있는 사물들의 특성을 추출하여 데이터 필드와 메서드로 나타낸 것으로 실제 사물들을 추상화한 결과라고 할 수 있습니다.

클래스에 대한 자세한 내용은 이전에 발행한 클래스에 대한 글을 참조해주시기 바랍니다.

2023.05.05 - [프로그래밍/C#] - [C#] 클래스

 

[C#] 클래스

안녕하세요 아임코딩입니다. 이번에는 C#의 핵심이라고 할 수 있는 클래스에 대해서 알아보겠습니다. 객체 지향 프로그래밍에서 가장 중요한 개념 중 하나가 클래스입니다. 클래스는 데이터와

imcoding-official.tistory.com

 

 

 

추상 클래스

C#에서는 추상 클래스를 제공합니다. 추상 클래스는 클래스들의 공통점을 모아서 상속할 부모 클래스를 만들 때 주로 사용합니다. 추상 클래스에는 추상 메서드와 일반 메서드가 함께 존재할 수 있습니다. 

 

추상 클래스는 다음과 같은 형식을 가집니다.

abstract class [클래스 이름]
{
	//필드
    //메서드
}

 

 

C# 코드 상에서 추상 클래스를 구현해보고 상속받아 사용해보겠습니다.

 

추상 클래스 부모 클래스

    abstract class Parent       //추상 클래스
    {
        public string name = "tom";

        public abstract void printName();   //추상 메서드
        
        public void nomalMethod()   //추상 클래스의 일반 메서드
        {
            Console.WriteLine("Parent 클래스의 일반 메서드입니다.");
        }
    }

abstract 키워드로 추상 클래스를 만들 수 있습니다.

추상 클래스는 일반 클래스와 유사하게 필드, 메서드를 갖지만 차이점은

추상 메서드를 가진다는 점입니다.

추상 메서드는 반드시 자식 클래스에서 재정의 해야합니다.

추상 메서드를 자식 클래스에서는  override 키워드를 사용해서 추상 메서드를 재정의합니다.

 

추상 클래스 자식 클래스

Parent 클래스를 상속받는 Child 클래스의 예입니다.

    class Child : Parent
    {
        public override void printName()
        {
            Console.WriteLine(name);
        }
    }

 

Child 클래스는 Parent 클래스의

private string name = "tom;

public abstract void printName();

public void nomalMethod()

세 가지 모두를 상속받습니다.

하지만 printName() 메서드는 추상 메서드이기 때문에 반드시 자식 클래스에서 재정의 해줘야 합니다.

 

그래서 Child 클래스에서 override 키워드를 이용하여 printName() 메서드를 재정의 해줬습니다.

 

추상 클래스 프로그램 전체 코드

이제 프로그램의 전체 코드를 살펴보겠습니다.

using System;
namespace CSTistory
{
    abstract class Parent       //추상 클래스
    {
        public string name = "tom";

        public abstract void printName();   //추상 메서드
        
        public void nomalMethod()   //추상 클래스의 일반 메서드
        {
            Console.WriteLine("Parent 클래스의 일반 메서드입니다.");
        }
    }

    class Child : Parent
    {
        public override void printName()    //부모 클래스의 추상 메서드 재정의
        {
            Console.WriteLine(name);
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child();

            child.printName();      //자식 클래스에서 재정의한 추상 메서드 호출
            child.nomalMethod();    //부모 클래스의 일반 메서드 호출
        }
    }
}

Main 함수에서 

Child 클래스의 객체를 생성하고

child.printName() 에서 자식 클래스에서 재정의한 추상 메서드를 호출합니다.

child.nomalMethod() 에서 부모 클래스의 일반 메서드를 호출합니다.

따라서 결과는 두 메서드가 실행한 결과인

"tom"

"Parent 클래스의 일반 메서드입니다."

가 출력되는 것입니다.

 

 

인터페이스

인터페이스는 추상 메서드만 모아놓은 것이라고 생각하면 쉽다.

필드와 일반 메서드를 가지지 않는 추상 클래스라고 생각해도 괜찮다.

다른 말로 하면 추상 메서드만 가지고 있는 추상 클래스라고 생각해도 된다.

인터페이스에서 선언한 함수는 abstract 키워드를 사용할 필요가 없다.

인터페이스에서 상속받은 함수는 재정의할 때 override 키워드를 사용할 필요가 없다.

 

인터페이스 형식

인터페이스는 다음과 같은 형식으로 선언한다.

[접근제한자] interface [인터페이스 이름]
{
	//메서드 선언
}

 

관례적으로 인터페이스의 이름에는 I 접두사를 붙여준다.

 

 

인터페이스를 간단하게 구현해보면 다음과 같다.

인터페이스 내에 추상 메서드를 선언할 때는 abstract 키워드가 필요없다.

    public interface IMyInterface
    {
        public void myPrint();
    }

 

인터페이스 상속

인터페이스를 상속받은 클래스의 예는 아래와 같다.

    public class MyClass : IMyInterface
    {
        public void myPrint()
        {
            Console.WriteLine("인터페이스를 통해 상속받은 메서드를 재정의한 함수입니다.");
        }
    }

인터페이스에서 상속받은 메서드를 재정의할 때는 override 키워드를 사용할 필요가 없다.

 

 

인터페이스 전체 프로그램 코드

위에서 구현한 인터페이스와

인터페이스를 상속받는 클래스의 객체를 만들고

자식 클래스에서 재정의한 함수를 호출하는 프로그램을 확인해보겠습니다.

using System;
namespace CSTistory
{
    public interface IMyInterface   //인터페이스
    {
        public void myPrint();      //메서드 선언
    }

    public class MyClass : IMyInterface //인터페이스 상속
    {
        public void myPrint()       //인터페이스 추상 메서드 구현
        {
            Console.WriteLine("인터페이스를 통해 상속받은 메서드를 재정의한 함수입니다.");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();    //MyClass 클래스 객체 생성

            myClass.myPrint();                  //재정의한 함수 호출
        }
    }
}

 

Main 함수에서

MyClass 클래스의 myClass 객체를 생성하고

인터페이스에서 상속받아 재정의한 함수인 myPrint() 함수를 호출합니다.

따라서 결과는 다음과 같이 나오는 것을 확인할 수 있습니다.

 

이상으로 C#에서 구현할 수 있는 추상화에 대해서 알아봤습니다.

728x90
반응형