[C#] 추상클래스 & 인터페이스

추상클래스 & 인터페이스

참고 블로그 를 바탕으로 작성하였습니다.

메서드는 선언부와 구현부로 구성되어있습니다. 선언부만 작성하고 구현부는 작성하지 않은 메서드를 추상메서드 라고 합니다.

추상클래스와 인터페이스는 모두 추상메서드를 포함하며 상속을 위한 클래스이기 때문에 객체를 생성할 수 없습니다.

즉 상속받은 클래스에서 선언된 메서드를 구현하게 됩니다.

  • 추상클래스 (abstract class)

    • 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스로 미완성 설계도 라고 할 수 있습니다.
    • 구현부를 지닌 일반 메서드 또는 멤버변수를 가질 수 있고, 클래스 구현부 내부에 추상메서드가 하나 이상 포함됩니다.
    • abstract 키워드로 정의해서 사용하고, 상속을 통해 자식클래스에서 extends 키워드를 통해 완성됩니다.
  • 인터페이스 (Interface)

    • 인터페이스는 추상클래스보다 추상화 정도가 높으며 오직 추상메서드와 상수만을 가질 수 있습니다.

      즉, 구현부를 지닌 일반 메서드 또는 멤버변수를 가질 수 없고 이에 따른 제약 조건이 있습니다.

      1. 모든 멤버변수는 public static final 이며 생략가능
      2. 모든 메서드는 public abstract 이며 생략가능

      생략된 제어자는 컴파일러가 컴파일 단계에서 추가해줍니다.

      단 static메서드와 디폴트 메서드는 예외 (jdk1.8부터)

    • interface 키워드로 정의하고 접근지정자도 사용할 수 있으며, 상속을 통해 자식클래스에서 implements 키워드를 통해 완성됩니다.

    • 클래스가 아니기 때문에 다중상속이 가능합니다.

    • 인터페이스를 사용하는 이유 : 클래스는 다중 상속이 불가능 하기 때문에 여러 인터페이스의 메서드를 상속받아 사용하기 위해 사용합니다.

이와 같은 차이점에 따라 사용하는 의도가 나뉘게 됩니다.

C# / JAVA 의 특성상 한개의 클래스만 상속이 가능하기 때문에

  • 추상클래스의 상속으로 클래스의 구분을 해결
  • 기능들을 인터페이스로 구현

으로 나누어 사용합니다.

인터페이스의 장점

그러면 인터페이스를 사용하는 이유는 무엇일까?

1. 개발시간을 단축시킬 수 있다.

  • 개발자들이 각각의 부분을 완성할 때까지 기다리지 않고
    서로 규약만 정해두어 각자의 부분만 따로 나눠서 작성된 코드를 컴파일 할 수 있다.

2. 표준화가 가능하다.

  • 클래스의 기본틀을 제공하여 개발자들에게 정형화된 개발을 강요할 수 있다.

3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

  • 코드의 종속성을 줄이고 유지보수성을 높이도록 해준다.
    즉 클래스들끼리의 쓸데없는 상속을 줄일 수 있다.

4. 독립적인 프로그래밍이 가능하다.

  • 클래스와 클래스간의 직접적인 관계를 인터페이스를 통해 간접적인 방법으로 변경하면,
    한 클래스의 변경이 다른 클래스에 영향을 미치지 않는 독립적인 프로그래밍이 가능하다.

추상클래스 예제

다음은 추상클래스의 예제이다.

public class Animal extends AnimalValue {

    String sound;

    // 추상메서드 구현(재정의)
    @Override
    void sound(String sound) {
        this.sound = sound;
    }

    @Override
    void behavior() {
        System.out.println(sound);
    }

    public static void main(String[] args) {
        Animal tiger = new Animal();

        tiger.sound("어흥");
        tiger.behavior();
    }
}

// 추상클래스
abstract class AnimalValue {
    abstract void sound(String sound);
    abstract void behavior();
}

@Override는 어노테이션 종류 중 하나인데, 간단히 설명하자면, 이것이 붙은 메서드는 반드시 부모클래스나 인터페이스에 명시되어야 한다. 재정의를 할때 오타로 인한 오류를 막아주는 역할이라고 생각하면 편하다.

인터페이스 예제

interface interfaceExample {
 int NUMBER = 1; // public static final int NUMBER = 1;

    void getNumber(); // public abstract void getNumber()
  ;
}

class useInterface implements interfaceExample {

 @Override
    public void getNumber() {
        // 재정의...
    }
}

'SW > C# & WPF' 카테고리의 다른 글

[C#] Callback, Delegate  (0) 2021.06.01
[WPF] Thread와 Dispatcher를 이용한 멀티스레딩  (0) 2021.06.01
[C#] HTTP 통신  (0) 2021.06.01
[C#] 싱글톤패턴  (0) 2021.05.28
[C#] 비동기식 프로그래밍 TAP  (0) 2021.05.19