BLOG
C#

C# 8. 클래스 상속 시 base 키워드로 베이스 클래스에 접근하기


March 1, 2022, 10:57 p.m.



앞선 포스팅에서 클래스 상속에 대해서 알아 보았습니다. 오버라이딩에 대해서도 알아 보았는데요, 베이스 클래스를 상속받는 서브 클래스에서 베이스 클래스의 메서드를 변경하여 사용하고 싶을 때 오버라이딩을 사용합니다!

이번 포스팅에서는 base 키워드로 베이스 클래스에 접근하여 상속과 오버라이딩을 더욱 유연하게 구현할 수 있도록 해보겠습니다.


베이스 클래스는 간단하게 base 라는 키워드로 접근 할 수 있습니다. 예를 간단히 들어볼까요?

class Animal {
    public virtual void Eat(Food f) {
        Smell(f); //냄새 맡기
        Taste(f); // 맛 보기
        Diget(f); // 소화 하기
    }
}

class Wolf : Animal {
    public void Hunt(Target t) {
        Food f = Catch(t); // 사냥감 잡기
        base.Eat(f); // 사냥감 먹기
    }
}

먼저 Animal 클래스에서는 Eat() 메서드를 선언하고 있습니다. 음식의 냄새를 맡고 맛을 본 후 소화를 하네요.

Wolf 클래스는 Animal 클래스를 상속받았습니다. Hunt() 라는 메서드를 정의하고 있습니다. 사냥감을 잡아서 음식 객체로 만듭니다. 그 다음이 중요합니다! base.Eat(f)를 사용해서 베이스 클래스의 Eat() 메서드를 사용했네요. 결과적으로는 잡은 사냥감을 냄새 맡고, 맛 보고, 소화하는 과정을 모두 진행하게 됩니다.

메서드를 override 키워드를 이용해 오버라이딩 할 때도 base키워드를 십분 활용할 수 있습니다. 아래의 두가지 경우의 결과는 모두 같습니다.

class Animal {
    public virtual void Eat(Food f) {
        Smell(f); //냄새 맡기
        Taste(f); // 맛 보기
        Diget(f); // 소화 하기
    }
}

class Wolf : Animal {
    public void Eat(Food t) {
        Watch(f); // 음식에 이상이 없는지 관찰하기
        Smell(f); //냄새 맡기
        Taste(f); // 맛 보기
        Diget(f); // 소화 하기
    }
}
class Animal {
    public virtual void Eat(Food f) {
        Smell(f); //냄새 맡기
        Taste(f); // 맛 보기
        Diget(f); // 소화 하기
    }
}

class Wolf : Animal {
    public void Eat(Food t) {
        Watch(f); // 음식에 이상이 없는지 관찰하기
        base.Eat(f); // 음식 먹기
    }
}

첫번째 경우는 Wolf 클래스에서 Animal 클래스의 Eat() 메서드를 아예 새로 정의했네요. 사실 Watch를 빼고는 중복되는 내용입니다.

두번째 경우는 새로 추가되는 Watch() 다음에 베이스 클래스의 Eat() 메서드를 그대로 사용하는 모습을 볼 수 있습니다. 이렇듯 오버라이딩시 base를 사용하면 중복되는 일을 줄일 수 있습니다.

마지막으로 베이스 클래스에서 생성자가 있을 경우에 상속받는 서브 클래스도 생성자를 만들어 주어야 하는데 이때 : base를 사용합니다. 아래 예시를 보겠습니다.

class Burger {
    public int Weight;
    public Burger(int weight) {
        Weight = weight;
    }
}

class Whopper : Burger{
    public Whopper(int weight) 
        : base(weight) {
        //베이스 클래스의 생성자가 먼저 실행됨
        Weight *= 2;
    }
}

보시면 Burger 클래스에서 생성자를 선언하여 햄버거의 무게 Weight를 저장합니다.

Whopper 클래스는 Burger 클래스를 상속받았기 때문에 생성자를 만들어 주어야 하고 위와 같이 Weight을 받아 베이스 클래스의 생성자를 먼저 실행하고 그 후 Whopper 클래스에서 선언한 생성자가 실행됩니다.

즉, Whopper 클래스를 처음 생성할때 weight변수가 저장되고 그후 2배가 되는 것입니다.

이번 포스팅에서는 base 키워드를 이용하여 베이스 클래스에 접근하는 방법, 상속받는 클래스에서의 생성자 구현 방법을 알아 보았습니다.

base



Search