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#] virtual 그리고 override 본문

코딩강좌/c#

[c#] virtual 그리고 override

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

오늘은 virtual 그리고 override에 대하여 알아보겠습니다. 오늘 클래스는 Parent와 Child라는 이름을 가진 두가지의 클래스를 선언해 사용할 예정입니다. 코드는 다음과 같습니다. (잘 보시면 "클래스의 상속, base, sealed, protected에 대하여

" 강의에서 사용한 클래스 코드와 동일합니다.)

class Parent {
    protected string something;
    public Parent(string something){
        this.something = something;
    }
    
    public void same() {
        Console.WriteLine("부모 클래스에서 same이 호출됨");
    }
}

class Child:Parent {
    string something;
    
    public Child(string something):base(something){
        this.something = something;
    }
    
    public void getParentSomething() {
        Console.WriteLine(base.something);
    }
    
    public void same() {
        Console.WriteLine("자식 클래스에서 same이 호출됨");
    }
}

 

virtual, override

코드를 보시면 자식 클래스와 부모 클래스에 똑같이 same이라는 메서드가 동일하게 존재합니다. 이렇게 만들어진 클래스를 사용하는데는 전혀 문제가 없습니다. 그런데, 자식 클래스를 부모 클래스로 형변환을 해서 same 메서드를 호출하면 어떻게 될까요?

Child child = new Child("아무거나 쓰시면 됩니다");
Parent parent = child;
parent.same();

결과는 "부모 클래스에서 same이 호출됨" 입니다. 분명히 자식 클래스를 부모 클래스로 형변환을 했는데 왜 결과가 "자식 클래스에서 same이 호출됨"이 아닌 걸까요? 이 문제를 해결하려면 어떻게 해야 할까요?

 

이 문제를 해결하려면 virtual이라는 예약어를 사용하면 해결할수 있습니다. virtual을 메서드 앞에 붙이면 됩니다. 그러면, 해당 메서드는 가상 메서드로 변경합니다. 그러면 부모 클래스 코드를 위 방법을 적용한 코드로 변경해보겠습니다.

class Parent {
    protected string something;
    public Parent(string something){
        this.something = something;
    }
    
    // 여기 주목!
    virtual public void same() {
        Console.WriteLine("부모 클래스에서 same이 호출됨");
    }
}

부모 클래스의 same 메서드를 virtual 키워드를 써서 가상 메서드로 변경했습니다. 그 이후, 이 메서드를 오버라이드 할 코드, 즉 자식 클래스의 same 메서드 앞에 override 키워드를 붙여주기만 하면 됩니다. 다음과 같이 말이죠

class Child:Parent {
    string something;
    
    public Child(string something):base(something){
        this.something = something;
    }
    
    public void getParentSomething() {
        Console.WriteLine(base.something);
    }
    
    override public void same() {
        Console.WriteLine("자식 클래스에서 same이 호출됨");
    }
}

이렇게 변경한 뒤, 아까 코드를 그대로 실행하면,

Child child = new Child("아무거나 쓰시면 됩니다");
Parent parent = child;
parent.same();

원하던대로 "자식 클래스에서 same이 호출됨"이 뜨게 됩니다. 그럼 오버라이드가 도데체 무슨 말일까요? 오버라이드는 부모 클래스에서 상속받은 메서드를 재정의하는것을 말합니다. 즉, 덮어쓴다고 생각하시면 됩니다. 또한, virtual 키워드가 적용된 메서드(가상 메서드)는 나중에 자식 클래스에서 오버라이딩을 할수 있게 됩니다.

 

오늘은 이렇게 virtual 그리고 override에 대하여 알아보았습니다.

728x90