추상 클래스
추상 클래스란 클래스 앞에 abstract 키워드를 붙인 클래스입니다.
추상 클래스는 인스턴스를 생성할 수 없는 클래스이고, 접근하려면 다른 클래스에서 상속받아야 합니다.
또, 상속된 자식 클래스는 부모 클래스의 추상 메서드를 반드시 오버라이드 해야 합니다.
abstract 키워드는 클래스와 추상 클래스의 메소드, 추상 클래스의 프로퍼티에 사용할 수 있습니다.
추상 클래스는 일반 메서드와 추상 메소드를 만들 수 있고, 일반 프로퍼티와 추상 프로퍼티를 만들 수 있습니다.
Test_Abstract라는 추상 클래스를 만들었습니다.
추상 클래스 안에는 변수와 추상 프로퍼티, 일반 프로퍼티, 추상 메소드, 일반 메소드가 있습니다.
Test_Abstract는 추상 클래스이기 때문에 인스턴스 생성을 하면 오류가 나는 것을 볼 수 있습니다.
Test1 클래스는 Test_Abstract의 자식 클래스입니다.
Test1의 객체를 생성할 때, 부모 클래스인 Test_Abstract 타입을 참조해서 인스턴스 생성할 수 있습니다.
추상 메소드와 추상 프로퍼티
추상 메소드는 추상 클래스에서만 만들 수 있고, 내용이 없고, 중괄호를 사용하지 않습니다.
자식 클래스에서 무조건 오버라이드 해야 합니다.
static이나 virtual 키워드와 함께 사용할 수 없습니다.
추상 프로퍼티는 추상 클래스에서만 만들 수 있고, 자동 구현 프로퍼티로 구현하면 됩니다.
자식 클래스에서 무조건 오버라이드 해야 합니다.
추상 클래스의 자식 클래스
부모 클래스의 추상 메소드, 추상 프로퍼티를 구현해야 합니다. 일반 메소드와 일반 프로퍼티는 구현하지 않아도 됩니다.
추상 메소드와 추상 프로퍼티의 내용은 자식 클래스에서 구현합니다.
Test1 클래스와 Test2 클래스는 모두 Test_Abstract 클래스를 상속받았습니다.
Test1 클래스는 Test_Abstract의 추상 메소드와 추상 프로퍼티를 오버라이드 해서 잘 작동하는 것을 볼 수 있습니다.
일반 메소드와 일반 프로퍼티는 구현하지 않았어도 오류가 나지 않는 것을 볼 수 있습니다.
Test2 클래스는 Test_Abstract의 추상 메소드와 추상 프로퍼티를 오버라이드 하지 않아서 오류가 나옵니다.
추상 클래스의 다중 상속
기능에 따라서 클래스를 중복해서 상속받고 싶을 수도 있습니다. 추상 클래스를 중복해서 상속해봤습니다.
여러 개를 상속할 수 없다는 오류가 나옵니다.
이렇게 여러 클래스를 중복해서 상속하고 싶을 때, 인터페이스를 사용하면 됩니다.
인터페이스
C#에서는 한 클래스에서 부모 클래스가 여러 개 존재할 수 없지만,
인터페이스를 사용하면 다중 상속이 가능하게 됩니다.
인터페이스는 메소드의 이름만 미리 구현하고, 자식 클래스에서는 메소드 이름만 받아 재정의합니다.
interface 이름 형태로 만들면 됩니다. 일반적으로 이름 맨 앞에 I를 붙입니다.
인터페이스 안에 메소드와 프로퍼티에 접근 한정자 같은 키워드를 붙일 필요가 없습니다. 기본적으로 public입니다.
인터페이스는 인스턴스를 생성할 수 없습니다.
하지만 자식 클래스를 통해서 접근할 수 있습니다.
Test4 클래스는 ITest_Interface 인터페이스의 자식 클래스 입니다.
Test4의 객체를 ITest_Interface 타입으로 참조해서 인스턴스 생성할 수 있다는 것을 볼 수 있습니다.
메서드의 반환 타입이 인터페이스 타입이라면,
반환 값은 해당 인터페이스를 구현한 클래스의 인스턴스를 반환하면 됩니다.
인터페이스 내 메소드와 프로퍼티
위의 코드를 메소드와 프로퍼티에 접근 한정자가 없습니다. 결과적으로 보면 메소드와 프로퍼티는 public입니다.
메소드와 프로퍼티를 보면 형태만 존재하며, 내용이 없습니다.
인터페이스의 자식 클래스
인터페이스에서 정의한 메소드와 프로퍼티를 자식 클래스에서 구현해야 합니다.
Test4와 Test5는 똑같이 Test1과 ITest_Interface를 상속받고 있습니다.
Test4는 ITest_Interface의 메소드와 프로퍼티를 모두 구현했기 때문에 오류가 없습니다
Test5는 ITest_Interface의 메소드와 프로퍼티를 구현하지 않았기 때문에 오류가 나는 것을 볼 수 있습니다.
Test4에서 메소드와 프로퍼티를 모두 public으로 구현했습니다.
인터페이스에서는 접근 한정자가 필요 없었습니다.
Test4에서 구현한 메소드를 인터페이스처럼 접근 한정자를 지정해주지 않는다면 어떻게 되는지 확인해봤습니다.
TestInterface 메소드를 보면 접근 한정자를 지정해주지 않았습니다. 즉, Test4의 TestInterface 메소드는 public이 아닙니다.
오류를 확인해보면,
'Test4'은(는) 'ITest_Interface.TestInterface()' 인터페이스 멤버를 구현하지 않습니다. 'Test4.TestInterface'은(는) public이 아니므로 인터페이스 멤버를 구현할 수 없습니다' 라는 오류 메세지가 나옵니다.
즉, Test4.TestInterface()의 접근 한정자를 public으로 구현해야 한다는 것을 알 수 있고,
인터페이스 안의 메소드나 프로퍼티에 접근 한정자를 붙여주지 않아도 기본적으로 public으로 구현된다는 것을 알 수 있습니다.
제가 공부한 부분을 정리한 내용이기 때문에 틀린 부분 있을 수 있습니다!!
혹시 틀린 부분이 있으면 알려주세요!!
'C#' 카테고리의 다른 글
[C#] 다형성, virtual과 override (0) | 2022.09.06 |
---|---|
[C#] 상속을 해보자 (0) | 2022.08.27 |
[C#] 암묵적 구현과 명시적 구현 (0) | 2022.08.23 |
[C#] 객체지향 언어에 대하여(OOP) (0) | 2022.08.10 |
[C#] CopyTo를 사용하자 (0) | 2022.07.27 |