* 추상 클래스
: 추상 메소드를 포함하는 클래스.
상속만 가능하고 인스턴스화(객체 생성) 시킬 수 없다.
* 추상 메소드
: 호출하는 방법만 있고 실제로 무엇을 하는지는 작성되어 있지 않은 빈 메소드.
파생 클래스에서 오버라이드 했을 때 구체적인 처리를 작성한다.
왜 굳이 번거롭게?
세부적인 부분을 정하지 않고 모호하게 진행하고 싶어서.
abstract class Animal { public string name; public abstract void cry(); } ... class Dog : Animal { public override void cry() { Console.WriteLine("멍"); } public void Main() { ... |
abstract : 클래스 앞에, public(수식자) 뒤에.
; : 추상 메소드는 이거로 끝내야 한다.
override : 반드시 오버라이드 해서 사용한다.
* 인터페이스
: 클래스와 비슷한 구조이나 멤버는 추상 메소드, 추상 속성, 추상 인덱서, 이벤트로 한정된다. 그리고 클래스에 집어넣는 형태로 사용하는데 이걸 '인터페이스의 구현( : )'이라고 한다.
인터페이스의 정의에서 모든 메소드는 public으로 취급하므로 액세스 수식자를 생략한다.
인터페이스는 얼마든지 구현할 수 있다.
한 개의 인터페이스를 복수의 클래스에서 구현할 수 있다.
* 인터페이스 상속 ( : )
: 클래스처럼 상속해서 새 인터페이스 생성 가능.
interface A : B, C, D { ... } |
복수의 인터페이스를 상속받을 수 있다.
interface A { void e(); void f(); } interface B : A { void g; new void f(); } |
new void f() : 상속 원본과 대상에 같은 멤버가 있다면 상속 대상에 new를 붙여서 상속 대상을 우선하게 한다.
* 다형성 (polymorphism)
: 상속한 클래스의 객체는 기본클래스로 취급할 수도 있고 파생클래스로 취급할 수도 있다. 이처럼 한 객체나 메소드가 많은 형태를 가지는 것을 다형성 이라고 한다.
- 기본클래스에 객체 대입
class A { public int m; public virtual void p() { ... ... } class B : A { public int n; public override void p() { ... .... } A a = new A(); B b = new B(); a = b; |
결과, '기본클래스A'의 객체(혹은 파생클래스)a는 b의 값이 들어가고, 'A를 상속받은 파생클래스B'의 객체(혹은 파생클래스)b에는 b가 들어간다.
파생클래스의 객체는 기본클래스의 객체에 대입할 수 있습니다.
그러나 파생클래스의 객체에는 대입할 수 없습니다( b = a; 불가! ).
- 기본클래스로 객체 생성
: 파생클래스의 객체는 기본클래스의 객체 변수에 대입할 수 있다.
A ab = new B();
A는 기본클래스 이름, B는 파생클래스 이름.
- 기본클래스와 파생 클래스의 객체
: 메소드는 객체를 인수로 받을 수 있다. 기본클래스의 객체를 받는 메소드에는 파생클래스의 객체를 전달할 수 있다.
실제로는 객체가 아니라 참조 정보가 전달됩니다.
* override와 new
클래스A와 파생클래스B가 있고, 메소드m이 양쪽에 있다고 할 때 차이점.
- override
: 객체변수의 형에 상관없이 인터페이스의 형에 따라 참조 대상이 결정된다.
- new
: 참조 대상은 객체 변수의 형에 따라 결정된다.
'메타버스기반게임콘텐츠기획 > 스터디(C#이 보이는 그림책)' 카테고리의 다른 글
6장, 클래스의 응용 (문제) (0) | 2021.12.05 |
---|---|
6장, 클래스의 응용 (6-2) (0) | 2021.12.03 |
5장, 클래스의 속성 (문제) (0) | 2021.11.29 |
5장, 클래스의 상속 (5-2) 오버라이드 / 구조체 (0) | 2021.11.29 |
5장, 클래스의 상속 (5-1) 상속 / 액세스 수식자 / static / 이름의 은폐 (0) | 2021.11.28 |