레이블이 C#한정자인 게시물을 표시합니다. 모든 게시물 표시
레이블이 C#한정자인 게시물을 표시합니다. 모든 게시물 표시

2022년 1월 23일 일요일

C# 봉인(sealed) 클스 virtual, sealed, new, override 한정자, 시샵학원, C#학원, 닷넷학원, 닷넷교육, C#교육동영상

 

C# 봉인(sealed) 클스 virtual, sealed, new, override 한정자, 시샵학원, C#학원, 닷넷학원, 닷넷교육, C#교육동영상


http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=400 


C# 봉인(sealed) 클래스 virtual, sealed, new, override 한정자

C# 봉인(sealed) 클래스 virtual, sealed, new, override 한정자봉인(sealed)클래스virtual, sealed, new 한정자C# 봉인 클래스(Sealed Class) 및 sealed, virtual 한정자봉인 클래스(Sealed Class) : C#에서 클래스를 상속하는 것

ojc.asia

https://www.youtube.com/watch?v=zBOKgEgBINI&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=11 

https://www.youtube.com/watch?v=rZcrIFB0yiE&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=1 





봉인(sealed)클래스 

virtual, sealed, new 한정자





C# 봉인 클래스(Sealed Class) 및 sealed, virtual 한정자


  • 봉인 클래스(Sealed Class) : C#에서 클래스를 상속하는 것은 매우 쉽다. 클래스 : 기반클래스 형식이다. 상속을 고려하지 않고 설계된 클래스는 추후 무분별한 상속으로 인해 어려움이 나타날 수 있다. 이의 해결을 위해 C#에서는 봉인(Sealed)된 클래스를 지원한다. 즉 상속을 하지 못하게 막은 클래스 이다.  


sealed class A { }
class MyDerivedC: A { } // Error

다음과 같은 오류 메시지가 나타난다.
'MyDerivedC' cannot inherit from sealed class 'A'.


추상 클래스는 추상 메소드를 자식 클래스에서 상속해야 하므로 봉인 클래스와 함께 abstract 한정자를 사용하면 오류가 발생한다. 


  • sealed 한정자 : 기본 클래스의 가상 메소드나 속성을 재정의하는 메소드 또는 속성에 sealed 한정자를 사용할 수도 있는데, 이전에 virtual 표시되었던 특정 클래스 메소드를 재정의 하면서 더 이상의 재정의를 방지할 수 있다. 메소드나 속성에 sealed 한정자를 적용하는 경우 항상 override를 함께 사용해야 하며 구조체 또한 암시적으로 봉인되므로 상속할 수 없다. 






[실습 : sealed 한정자 실습]

class A
{
    public virtual void a() { Console.WriteLine("A.a"); }
    public virtual void b() { Console.WriteLine("A.b"); }
}

class B : A
{
    public override void a() { Console.WriteLine("B.a"); }
    public sealed override void b() { Console.WriteLine("B.b"); }
}

class C : B
{
    public override void a() { Console.WriteLine("C.a"); }

    static void Main()
    {
        A a = new C();
        a.a();  //C.a
        a.b();  //B.b

        ((B)a).a();  //C.a
        ((B)a).b(); //B.b

        ((C)a).a();  //C.a
        ((C)a).b(); //B.b

        B b = new C();
        b.a();  //C.a
        b.b();  //B.b
    }
}




    



  • virtual 한정자 :  virtual 키워드는 메소드, 속성, 인덱서 또는 이벤트 선언을 한정하는 데 사용되며 자식, 파생 클래스에서 재정의될 수 있다. 


  • 가상 메소드가 호출되면 재정의 함수에 대해 개체의 런타임 형식이 검사되는데, 가장 많이 파생되는 자식 클래스의 재정의된 멤버 메소드가 호출되므로 멤버를 재정의한 파생 클래스가 없을 경우에는 원래 멤버가 호출될 수도 있다. virtual 한정자는 static, abstract, private 또는 override 한정자와 함께 사용할 수 없으며 일반 메소드는 비 가상 메소드이며  재정의 할 수 없다. 또한 추상 메소드(abstract method)는 virtual 키워드를 사용하지 않지만 자동으로 virtual이 된다.


[실습 : virtual 한정자 실습]

class A
{
    public virtual void a() { Console.WriteLine("A.a"); }
    public virtual void b() { Console.WriteLine("A.b"); }
}

class B : A
{
    public override void a() { Console.WriteLine("B.a"); }

    static void Main()
    {
        A a = new B();
        a.a();   //B.a, 자식B가 재정의 했으므로 재정의된 B의 a가 실행
        a.b();  //A.b, 자식B가 재정의 하지않았으므로 A의 b가 실행
    }
}



  • new 한정자 :  new 키워드는 기본 클래스에서 상속된 멤버를 명시적으로 숨긴다. 상속된 부모클래스의 멤버를 숨기면 자식 클래스의 멤버로 기본 클래스 버전의 멤버를 대신하게 된다. new 한정자를 사용하지 않고 public 또는 protected 멤버를 숨길 수도 있지만, 컴파일러 경고가 발생하는데 new를 사용하여 멤버를 명시적으로 숨기면 이 경고가 발생하지 않는다.


[실습 : new 한정자 실습]

public class A
{
    public static int x = 1;
    public void Invoke() { Console.WriteLine("A.Invoke"); }
    public static int z = 9;
}
public class B : A
{
    new public static int z = 999;

    //A의 Invoke는 숨겨짐. B의 입장에서 Invoke는 이것하나뿐
   //A의 Invoke를 호출하려면 new A().Invoke로 호출
    new public void Invoke() { Console.WriteLine("B.Invoke"); }

    static void Main()
    {
        // new로 정의한 z
        Console.WriteLine(z);   //999

        // 숨겨진 A의 z
        Console.WriteLine(A.z);  //9

        // A의 숨겨지지 않은 x
        Console.WriteLine(x);  //1

        new B().Invoke();  //B.Invoke
        new A().Invoke();  //A.Invoke
    }
}



[실습2 : sealed, virtual 실습]

아래 예제에서 Z는 Y에서 상속하지만 Z는 X에 선언되고 Y에 봉인된 가상 함수 F를 재정의할 수 없다.


아래 예제를 작성하고 결과를 예측해 보자.

using System;


namespace SealedVirtualTest

{

    class X : object

    {

        public virtual void F1() { Console.WriteLine("X.F1"); }  //가상메소드, 자식이 재정의 가능

        public virtual void F2() { Console.WriteLine("X.F2"); }


        public virtual void F3() { Console.WriteLine("X.F3"); }


        public void F5() { Console.WriteLine("X.F5"); }  //일반 메소드 비가상 메소드

    }

    class Y : X

    {

        //F1 메소드는 자식이 재정의 불가

        sealed public override void F1() { Console.WriteLine("Y.F1"); }

        public override void F2() { Console.WriteLine("Y.F2"); }


        public virtual void F4() { Console.WriteLine("Y.F4"); }


        //public override void F5() { Console.WriteLine("Y.F5"); }   //오류

        public void F5() { Console.WriteLine("Y.F5"); }   //new 한정자를 사용하지 않아 경고뜸

    }

    class Z : Y

    {

        public override void F2() { Console.WriteLine("Z.F2"); }

        public new void F4() { Console.WriteLine("Z.F4"); }

    }


    public class Test

    {

        static void Main()

        {

            X x1 = new Z();

            x1.F1();   //Y.F1

            x1.F3();   //X.F3

            x1.F2();   //Z.F2

            x1.F5();   //X.F5


            Y y1 = new Z();

            y1.F1();   //Y.F1

            y1.F2();   //Z.F2

            y1.F3();   //X.F3

            y1.F4();   //Y.F4

            y1.F5();   //Y.F5            


            X x2 = new Y();

            x2.F1();   //Y.F1

            x2.F2();   //Y.F2

            x2.F3();   //X.F3

            x2.F5();   //X.F5

            if (x2.Equals(x1))

            {

                Console.WriteLine("같다...");

            }

            else

            {

                Console.WriteLine("다르다...");

            }


            Z z1 = new Z();

            z1.F1();   //Y.F1

            z1.F2();   //Z.F2

            z1.F3();   //X.F3

            z1.F4();   //Z.F4

        }

    }

}



#봉인클래스, #sealedClass, #sealed클래스, #virtual, #new, #sealed, #C#한정자, #C#교육, #C#학원, #닷넷교육, #닷넷학원, #시샵교육, #시샵학원, 봉인클래스, sealedClass, sealed클래스, virtual, new, sealed, C#한정자, C#교육, C#학원, 닷넷교육, 닷넷학원, 시샵교육, 시샵학원, 

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...