ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 3주차 4일 배치고사, 인터페이스와 추상클래스
    개발일지/스파르타 코딩클럽 부트캠프 2024. 5. 2. 21:11

    오늘 배운 내용

    • 인터페이스와 열거형
    • 예외 처리, 값형과 참조형
    • 델리게이트
    • 람다
    • LINQ
    • Nullable
    • 문자열 빌더
    • 인터페이스와 추상클래스 특강

    오늘 발생한 문제


    오늘 배치고사를 봤는데 가채점 하면서 오답노트 해봤을 때 큰 문제점이 두개 있었다.

     

    반환에 대한 개념 부족

    class Program
    {
        static int Sum(int[] arr)
        {
            // TODO : 배열의 모든 요소의 합을 계산하는 코드 작성
            
            //////////////////////////////////////////
        }
    
        static void Main(string[] args)
        {
            int[] ints = { 3, 6, 7, 9 };
            Console.WriteLine(Sum(ints));
        }
    }

    이 문제에서 나는 자꾸 Sum에서 오류가 났는데

    반환에 관한 오류였음에도 내 잘못을 알아채지 못했다..

    for (int i = 0; i < arr.Length; i++)
    {
    arr[i] += arr[i];
    }

    난 이렇게 작성했는데 너무 잘못된 방법이었고

    int temp = 0;
    
    for(int i = 0; i < arr.Length; i++)
    {
    	temp += arr[i];
    }
    
    return temp;

    이렇게 비어있는 변수를 만들어 준 후 에 반환값을 만들었어야 했는데

    return을 너무 안써본 것도 있고 반환에 대한 개념이 너무 부족했다.

     

    out과 ref의 정확한 개념 부족

    class Program
    {
        private static void Add(                      )
        {
            result += i;
        }
    
        static void Main(string[] args)
        {
            int total = 10;
            Console.WriteLine(total);
            Add(200,          );
            Console.WriteLine(total);
        }
    }

    두 번째 문제였는데 빈 칸을 채우는 것이었다.

    내 답은

    int i,out int result

    out total 을 했는데.. out을 ref로 바꾸기만 해도 됐는데..

    조금 더 공부해야겠다.

     

    오늘 배운 내용


    인터페이스

     

    배운 내용이 조금 많은데 인터페이스부터 얘기를 해보자..

     

    일단 다중 상속의 문제점부터 알아보자

    • 다이아몬드 문제
    • 설계의 복잡성 증가
    • 이름 충돌과 충돌 해결의 어려움
    • 설계의 일관성과 단순성 유지

    이 정도로 꼽을 수 있는데

    1. 다이아몬드 문제

    출처:제타위키

    다중 상속 하면 가장 먼저 떠오르는 문제점이다. 다중 상속을 허용했을 때

    한 클래스가 두 개 이상의 부모 클래스로부터 동일한 멤버를 상속 받으면 

    어떤 부모의 멤버를 사용해야하는지 어려워지고 코드가 복잡해지고 가독성이 저하된다.

     

    2. 설계의 복잡성 증가

       다중 상속을 허용하면 클래스간의 관계가 복잡해진다.

    어떤 클래스로부터 어떤 멤버를 상속받을지 결정해야해서 코드의 유지 보수성이 저하된다.

     

    3. 이름 충돌과 충돌 해결의 어려움

      여러 부모 클래스로부터 상속받은 멤버들의 이름이 충돌할 수 있다. 이 충돌을 해결하려면

    충돌 멤버들을 재정의하거나 명시적으로 부모 클래스를 지정해야하는데, 코드가 복잡해지고

    오류 발생 가능성을 높인다.

     

    4. 설계의 일관성과 단순성 유지

      C#은 단일 상속을 통해서 설계의 일관성과 단순성을 유지하고자 한다고 한다. 단일 상속으로

    클래스 간의 관계를 명확하게 하고 코드의 가독성과 이해도를 높일 수 있다.

     

    이렇게 다중 상속의 문제점을 알아봤다.

    그럼 왜 인터페이스 전에 다중 상속을 알아봤나?

    인터페이스는 다중상속을 제공한다.

    인터페이스의 특징을 ARABOZA.

     

    인터페이스를 사용하는 이유

     

    1. 코드의 재사용성

      인터페이스를 사용하면 다른 클래스에서 해당 인터페이스를 구현해서 동일한 기능을 공유할 수 있다.

    다양한 클래스가 동일한 동작을 수행함으로써 코드의 재사용성이 향상된다.

     

    2. 다중 상속 제공

      C#에서는 클래스는 단일 상속만을 지원하는데, 인터페이스는 다중 상속이 가능하다.

    클래스가 여러 인터페이스를 구현함으로써 여러 개의 기능을 조합할 수 있다.

     

    3. 유연한 설계

      인터페이스를 사용하면 클래스와 인터페이스 간에 느슨한 결합을 형성할 수 있다.

    클래스는 인터페이스를 구현만 하면 돼서 클래스의 내부 구현에 대한 변경 없이 인터페이스의

    동작을 변경하거나 새로운 인터페이스를 추가할 수 있다.

     

    인터페이스의 특징

    • 인터페이스란 클래스가 구현해야하는 멤버들의 정의하는 것
    • 인터페이스는 클래스의 일종이 아니다. 클래스에 대한 제약 조건을 명시하는 것이다.
    • 클래스가 인터페이스를 구현할 경우, 모든 인터페이스 멤버를 구현해야 한다.
    • 인터페이스는 다중 상속을 지원한다.

    이제 인터페이스의 특징을 힘들게 다 알아봤으니 사용해보자

     

    오늘 튜터님의 강의에서도 비슷하게 다룬 내용인데

    인터페이스에 대한 이해가 가장 쉽게되는 방법이라고 생각한다.

    public interface IPay
    {
        public void PayMent();
    }
    
    class SamsungPay : IPay
    {
        public void PayMent()
        {
            
        }
    }
    
    class KakaoPay : IPay
    {
        public void PayMent()
        {
            
        }
    }
    
    class SpartaPay : IPay
    {
        public void PayMent()
        {
            
        }
    }

    예를 들어 인터페이스는 이런 상황에 유용하다.

    카카오페이와 삼성페이, 그리고 스파르타페이(?)의 공통점은 뭘까?

    바로 결제가 된다는 부분이다.

    세 클래스가 공통적인 기능을 가지고는 있는데 결제가 되는 내부 로직은 다 다를 것이다.

    이럴 때야말로 인터페이스가 활용되는 부분이다.

    IPay 인터페이스를 활용받고 같은 메서드를 사용하는 모습이다.

    그런데 여기서 만약에 카카오페이와 삼성페이는 사용하는 법이 따로 있고

    현재 스파르타 페이는 사용할 수 없다. 그렇다면?

    public interface IUse
    {
        public void Usable();
    }
    public interface IPay
    {
        public void PayMent();
    }
    
    class SamsungPay : IPay, IUse
    {
        public void PayMent()
        {
            
        }
        public void Usable()
        {
        }
    }
    
    class KakaoPay : IPay, IUse
    {
        public void PayMent()
        {
            
        }
    
        public void Usable()
        {
            
        }
    }
    
    class SpartaPay : IPay
    {
        public void PayMent()
        {
            
        }
    }

    이렇게 IUse 인터페이스의 다중상속이 가능하다.

    이는 클래스가 늘어날수록 유용할 것이다.

    상속받은 자식 클래스는 인터페이스의 모든 메서드를 구현해야한다.

    (강제성)

     

    그리고 인터페이스는 여러 장단점이 있지만

    추상클래스와 마찬가지로 자식 클래스가 메서드를 구현해야 한다는

    강제성을 가지기 때문에 현업에서는 가이드라인 느낌으로 많이 사용되는 것 같다.

    유니티에서는 인터페이스 기능을 직접적으로 많이 사용하지는 않지만

    유니티에서 제공하는 기능들이 인터페이스 기능인 경우가 많고,

    위의 예시처럼 공통적인 기능들을 찾는 방식 등으로 사용하면 좋을 거 같다.

     

    협업 때도 유용하게 사용할 수 있을 것 같다.

     

     

Designed by Tistory.