250x250
Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

minjea.dev의 코딩블로그

[c#] 클래스의 상속, base, sealed, protected에 대하여 본문

코딩강좌/c#

[c#] 클래스의 상속, base, sealed, protected에 대하여

minjea.dev 2022. 4. 14. 12:00
728x90

클래스의 상속에 대하여 알아보겠습니다. 여기서 상속을 받는 클래스를 부모 클래스라고 하고, 상속을 하는 클래스를 자식 클래스라고 하겠습니다. 자식 클래스는 다른 말로 부모 클래스에서 파생되었다 해서, 파생 클래스라고도 합니다.

 

상속을 받은 클래스는, 부모 클래스의 기능과 속성을 물려받습니다. 따라서, 대부분 중복되는 특성을 부모 클래스에 정의하고 그것을 상속받는 식으로 코딩하기도 합니다.

 

클래스를 상속받으려면 클래스 이름 옆에 콜론(:)과 부모 클래스의 클래스명을 작성해주시면 됩니다. 다음과 같이 말이죠. 참고로 c#에서는 다중 상속이 불가능합니다.(클래스당 하나의 클래스만을 상속받을수 있습니다)

class Parent {}
class Child:Parent {}

넘어가기 전 먼저 protected 접근제한자에 대하여 말씀드리겠습니다. protected 접근제한자를 적용한 메소드나 인스턴스는 외부에서는 사용할수 없지만(private 처럼), 자식 클래스(자신을 상속 받은 클래스)에서는 사용이 가능합니다. 따라서, 자식 클래스에서는 사용이 가능하도록 허가하고싶으나, 외부에서는 사용이 불가능하게 하고 싶은 경우 protected 접근제한자를 적용하면 됩니다. 다만, private가 적용된 필드나 메서드에는 자식 클래스라고 하더라도 접근이 불가능합니다.

 

자 이제 다시 돌아와서, 부모 클래스의 필드나 메서드에 접근하는 방법을 알아보겠습니다. 자식 클래스에서는 부모 클래스의 필드나 메서드에 this를 통해 접근이 가능합니다. 다음과 같이 말이죠.

Child c = new Child("this is something");
c.getSomething();

class Parent {
    protected string something;
    public Parent(string something){
        this.something = something;
    }
}

class Child:Parent {
    public Child(string something){
        this.something = something;
    }
    
    public void getSomething() {
        Console.WriteLine(this.something);
    }
}

그런데 위의 경우는, 부모클래스에만 something이 존재하고, 자식클래스에는 something이라는 필드가 존재하지 않아, this를 통해서도 접근이 가능했습니다. 그렇다면 자식 클래스에도 동일한 이름의 필드가 존재했다면 어떻게 접근해야 할까요? 바로 base를 통해 가능합니다.

 

base

base 키워드는 부모 클래스를 가리키는 예약어로써, 부모 클래스의 생성자, 필드, 메서드등을 불러오는데 사용됩니다. 자식 클래스에 부모 클래스와 중복되는 이름의 필드나 메서드가 존재하지 않는다면 this를 사용하여 접근하거나 아예 this를 생략하고 접근해도 잘 작동하지만, 그 반대의 경우라면 어떨까요?

 

바로 base를 사용하면 됩니다. 코드를 다음과 같이 바꾸면 잘 작동할 것입니다.

Child c = new Child("this is something");
c.getParentSomething();

class Parent {
    protected string something;
    public Parent(string something){
        this.something = something;
    }
}

class Child:Parent {
    string something;
    
    public Child(string something):base(something){
        this.something = something;
    }
    
    public void getParentSomething() {
        Console.WriteLine(base.something);
    }
}

그런데 14번째 줄을 보시면 base(something) 이라는 코드가 보이실 겁니다. 이건 무슨 코드일까요? 바로 부모 클래스의 생성자를 호출하는 코드입니다. 자식 클래스에서 일일이 base.something = something처럼 복잡하게 코드를 짜지 않고 부모 클래스의 필드는 부모 클래스에서 정의한 생성자를 이용하여 쉽게 초기화하는 것이죠.

 

sealed

sealed는 클래스를 상속받지 못하도록 할때 사용하는 키워드입니다. 다음과 같이 클래스에 sealed를 적용해 상속을 더이상 받지 못하게 할수 있습니다.

sealed sealedClass {}

public class Child:sealedClass {} // 에러

sealed가 적용된 클래스는, 다른 클래스에서 상속을 받으려고 할 때 오류를 발생시킵니다.

728x90

'코딩강좌 > c#' 카테고리의 다른 글

[c#] virtual 그리고 override  (0) 2022.04.16
[c#] 형변환  (0) 2022.04.15
[c#] 네임스페이스 그리고 using  (0) 2022.04.13
[c#] 접근제한자란?  (0) 2022.04.12
[c#] 정적 필드, 정적 메서드, 정적 생성자  (0) 2022.04.11