인터페이스, 추상클래스

삐얅·2024년 5월 2일
0

C#

목록 보기
2/9

1. 개요

오늘 튜터님이 인터페이스와 추상클래스에 대해 설명해주셨다. 아직 완전하게 이해했다고 보기 어렵지만 그래도 기억에 남기기 위해 TIL을 작성해둬야겠다.
튜터님도 나중에도 계속 나오는 개념이니 미리 알아둔다는 느낌으로 정리하라고 하셨다.

2. 추상클래스

먼저 추상클래스는 추상 메서드를 사용한 클래스를 말하며abstract라는 키워드를 사용한다. 구현이 없는 추상 메서드들을 상속받는 클래스들에게 넘겨서 구현해주는 것

  • 하나 이상의 추상 메서드를 포함, 추상 메서드는 선어만 되어 있고 구현은 하위 클래스에서 이뤄짐
  • 직접 인스턴스화(객체화) 될 수 없다. 대신 하위 클래스에서 상속 받고 하위 클래스에서 인스턴스화 가능
  • 추상 메서드 외에도 일반 메서드와 속성을 포함할 수 있다. 이런 일반 메서드와 속성은 하위 클래스에서 그대로 사용하거나 오버라이드 될 수 있다.
  • 다중 상속 불가

구조 개선 및 유연성을 높이며, 공통된 동작이나 속성을 가진 클래스들 사이의 계층 구조를 정의하는데 유용하다는 장점이 있음.

이해를 위해선 클래스와의 비교가 더 도움된다고 하셨는데 이건 나중에 두개를 비교해보는 TIL를 써보려고 한다.

코드 예시

namespace SpartaTest
{
    using System.Collections.Generic;


    public abstract class Parent
    {
        public abstract void Phase1();
        public abstract void Phase2();
        public abstract void Phase3();
    }

    class Child : Parent
    {

    }

    class Program
    {
        
    }
}

이런식으로 작성된다.
Child 클래스에서 Parent를 상속받아 Phase() 추상 메서드들을 Child 클래스에서 구현해주면 된다.
추상클래스의 특징중 하나는 이렇게 추상 메서드를 선언하면 반드시 상속받은 자식 클래스에서 메서드들을 구현해줘야 한다.

그렇지 않으면 이렇게 에러가 출력된다.

namespace SpartaTest
{
    using System.Collections.Generic;

	// 추상 클래스
    public abstract class Parent
    {
    	// 추상 메서드
        public abstract void Phase1();
        public abstract void Phase2();
        public abstract void Phase3();
    }

	// 자식 클래스
    class Child : Parent
    {
        public override void Phase1()
        {
            //구현할 내용
        }

        public override void Phase2()
        {
            //구현할 내용
        }

        public override void Phase3()
        {
            //구현할 내용
        }
    }

    class Program
    {
        
    }
}

이런식으로 작성해주면 된다. 추상메서드는 구현이 없으므로 반드시 파생 클래스에서 내용을 구현해줘야하며 그렇지 않으면 컴파일되지 않으니 override를 사용해줘야한다.
게임을 개발할 때 주로 대화문을 작성할 때 자주 사용한다고 한다.

추상 클래스는 협업할 때 용이하며, 추상 클래스를 사용하면 다른 사람도 자식 클래스를 만들었을 때 구현해야하는 메서드들을 파악하기 쉽다고한다.

3. 인터페이스

인터페이스는 interface 키워드를 사용하며, 클래스에 특정한 동작이나 기능을 강제할 수 있도록 하는데 사용된다. 추상적인 개념을 묶어준다고 생각하면 된다. 예를 들어 물건을 살 때 계산을 현금으로 할지 카드로 할지 정해진게 없는 추상적인 개념이지만 결과는 물건 금액을 지불한다는 추측이 가능한 것이라고 한다.

  • 인터페이스는 추상적인 메서드, 속성, 이벤트 또는 인덱서의 집합으로 이런 멤버들은 구현이 없는 추상 멤버로 선언된다.
  • 클래스가 특정 인터페이스를 구현하면, 해당 인터페이스에 정의된 모든 멤버를 구현해야 한다. 이를 통해 클래스 간 하나의 표준화된 인터페이스를 제공할 수 있다.
  • C#에서는 클래스가 하나의 클래스만 상속 가능하지만, 여러 인터페이스를 구현할 수 있어 다중 상속이 가능하다.
  • 클래스 간의 동일한 동작이나 기능을 공유 가능하며, 이를 통해 다형성을 구현 가능하다.

위의 설명 중 예시 부분이 좀 이해가 애매하지만 나중에 다시 나오는 개념이니 대략적인 부분만 알아두려고 한다.
아래의 예시 코드는 결제라는 부분을 예로 들어봤다.

예시 코드

namespace SpartaTest
{
    using System.Collections.Generic;


	// 인터페이스 결제
    public interface IPay
    {
        public void Payment();
    }

	// 인터페이스 포인트 추가
    public interface AddPoint
    {
        public void GetPoint();
        
    }

	// 카드로 결제하면 카드 포인트를 적립할 수 있기 때문에 예시로 넣었다.
    // 이처럼 인터페이스는 여러개의 인터페이스를 상속할 수 있다.
    public class Card : IPay, AddPoint
    {
        public void Payment() 
        { 
            // 구현
        }

        public void GetPoint()
        {

        }
    }

    public class Cash : IPay
    {
        public void Payment()
        {
            // 구현
        }
    }


    public class SamsungPay : IPay
    {
        public void Payment()
        {
            // 구현
        }
    }

    public class Program
    {
        Card card = new Card();
        Cash cash = new Cash();
        SamsungPay samsung = new SamsungPay();

        public void main()
        {
            card.Payment();
            cash.Payment();
            samsung.Payment();
        }
    }
}

인터페이스를 사용하면 이렇게 코드를 작성할 수 있다. 여기서 Payment() 메서드들은 결제 수단에 따라 행동이 다르므로 각각 구현해줘야 하는건 같지만 클래스를 사용한다면 결제 수단에 관련된 클래스들을 각각 따로따로 만들어줘야하거나 if문으로 클래스를 비교해야 하는데 이렇게 디면 코드의 길이가 늘어나고, 함수도 결제 수단에 따라 다른 함수를 만들어줘야한다.

다른 예를 들자면 스타크래프트에서 일꾼들이 건물을 지을 때 테란은 건물이 완성될 때까지 건물에 붙어있어야하고, 저그는 일꾼이 건물로 변하고, 프로토스는 일꾼이 포탈만 열어주면 된다. 세 종족 모두 건물을 짓는다는 행위는 같지만 건물을 짓는 방법에서 차이가 있을 때와 같은 경우에 주로 사용한다고 보면 된다.

위 일꾼들을 예시로 들면 클래스로 선언했을 때 일꾼의 다른 역할들을 상속시킬 수 없지만 인터페이스를 사용하면 다른 역할들을 상속시켜서 사용할 수 있다.

위 코드만 봤을 때 클래스를 대체 할만한 이유가 와닿지않지만 클래스는 하나만 상속된다는 특징이 있다. 당장 깊게 이해한게 아니라 대충 이런 개념이다 정도로만 짚고 넘어가겠다.
if문으로 하게 된다면 종족별로 조건을 비교해서 실행하는 것보다 저렇게 함수 하나로 실행가능하다는 것은 알겠다.

4. 정리

추상클래스와 인터페이스 둘 다 객체지향을 다룬다면 알고 넘어가야하는 개념이라는 것을 알게 되었다. 지금 당장 제대로 이해했다고 보기도 어렵고, 예제 코드도 그렇게 와닿는 코드가 아니지만(내가 기억을 더듬어 만든 튜터님의 예제 코드를 제대로 못적은것 같다) 나중에 한 번 더 이해할 수 있게 정리해야겠다.
제대로 다룰 수 있을 지 애매하지만 이번에 만들고 있는 팀 프로젝트 과제에도 적용하면 어떨지 고려해볼 수 있을 것 같다.

0개의 댓글

관련 채용 정보