상속을 하면 부모 클래스의 특징을 자식 클래스가 물려 받을 수 있습니다.
그렇기 때문에 상속을 하면 재사용성이 좋아져서 코드가 줄고 유지보수가 좋아집니다.
상속을 받은 클래스는 자식 클래스/파생 클래스/하위 클래스라고 합니다.
상속을 해준 클래스는 부모 클래스/기초 클래스/상위 클래스라고 합니다.
자식 클래스는 따로 정의하지 않아도 부모 클래스의 프로퍼티와 메소드를 사용할 수 있습니다.
단, 접근 지정자가 private인 경우에는 물려 받을 수 없습니다.
이제부터 상속을 한번 사용해보겠습니다!
A라는 클래스가 있고, B라는 클래스가 있다고 가정을 합니다.
A가 B를 상속하려면 [class A : B]를 하면 됩니다. 즉, A가 자식 클래스, B가 부모 클래스가 됩니다.
ChildClass가 A, ParentClass가 B가 됩니다.
이름처럼 ChildClass가 자식 클래스, ParentClass가 부모 클래스가 됩니다.
이젠 ChildClass가 ParentClass의 프로퍼티나 메소드 등을 따로 정의하지 않아도 사용할 수 있습니다.
생성자
자식 클래스의 생성자를 호출하면 자동으로 부모 클래스의 기본 생성자를 호출합니다.
호출 순서는 부모 클래스의 생성자 → 자식 클래스의 생성자 입니다.
예시를 한번 보겠습니다.
부모 클래스와 자식 클래스에 생성자를 만들고,
자식 클래스의 객체를 기본 생성자를 호출해 생성했습니다.
이렇게 부모 클래스의 생성자를 먼저 호출하고, 자식 클래스의 생성자를 호출하는 것을 볼 수 있습니다.
생성자에 this를 사용하자
생성자에도 this 키워드를 사용할 수 있습니다.
클래스 내의 다른 생성자를 호출할 때 사용됩니다.
예시를 먼저 보겠습니다.
부모 클래스는 [그림 1]과 동일합니다.
한 개의 정수를 매개변수로 가진 생성자에 this() 키워드를 사용했습니다.
이제는 ChildClass(int num) 생성자를 호출하면 기본 생성자도 같이 호출됩니다.
기본 생성자가 아닌 ChildClass(int num) 생성자를 호출했습니다.
결과 값을 보면 ChildClass(int num) 생성자가 호출되기 전에 기본 생성자가 먼저 호출되고,
ChildClass(int num) 생성자가 호출되는 것을 볼 수 있습니다.
this()는 기본 생성자를 호출하고,
this(10)은 ChildClass(int num)을 호출합니다. 즉, ChildClass(10)을 호출합니다.
사용방법
ChildClass가 ParentClass를 상속하고 있고,
ParentClass가 변수 num, 속성 name, 멤버 PlusNum()를 가지고 있기 때문에,
ChildClass에서 따로 정의하지 않아도 ParentClass의 변수 num, 속성 name, 멤버 PlusNum()를 사용할 수 있습니다. 그래서 ChildClass의 Test 멤버 함수에서 num, name, PlusNum()을 사용했을 때, 아무런 오류가 나지 않습니다.
테스트를 위해 ChildClass 타입의 인스턴스를 생성해서 Test 함수를 호출했습니다.
생성자가 호출 순서대로 호출된 뒤,
Test() 함수가 잘 실행 되는 것을 볼 수 있습니다.
이렇게 상속을 하면 자식 클래스에서 부모 클래스의 기능들을 가져다 사용할 수 있습니다.
하지만, 접근 지정자가 private이면 자식 클래스에서 사용하지 못한다는 것을 주의해야 합니다.
예를 들어 부모 클래스에서 private int num = 0; 이고,
자식 클래스에서 부모 클래스의 num 변수를 가져온다면, 오류가 납니다.
sealed
sealed 키워드는 더이상 자식 클래스를 만들 수 없게 하는 키워드 입니다.
즉, 상속을 더이상 해줄 수 없습니다.
[sealed class 클래스명] 형식으로 사용하면 됩니다.
sealed를 사용한 ParentClass에서 파생될 수 없다는 오류가 나옵니다.
즉, ParentClass는 자식 클래스를 만들 수 없습니다.
그래서 ParentClass를 상속한 ChildClass가 오류가 난 것 입니다.
제가 공부한 부분을 정리한 내용이기 때문에 틀린 부분 있을 수 있습니다!!
혹시 틀린 부분이 있으면 알려주세요!!
'C#' 카테고리의 다른 글
[C#] Stream을 이용한 데이터 빨리 읽고 쓰기 (0) | 2022.12.08 |
---|---|
[C#] 다형성, virtual과 override (0) | 2022.09.06 |
[C#] 암묵적 구현과 명시적 구현 (0) | 2022.08.23 |
[C#] 추상 클래스와 인터페이스 (0) | 2022.08.19 |
[C#] 객체지향 언어에 대하여(OOP) (0) | 2022.08.10 |