카테고리 없음

[C#]널 봉인한다 sealed 메소드 _쉴드쉴드!!

데브수달 2024. 10. 27. 11:23
728x90
반응형

안녕하세요 . Interface 이후는 sealed입니다!!!!!!!!!!!!!!!!!!!!!!!!!!
interface 공부는 요기 클릭해서 보고오시면됩니다.

2024.10.27 - [[공부&수업]/C#] - [C#] Interface에 대해서

 

[C#] Interface에 대해서

안녕하세요. 오늘 오전 아침에는 어제 저녁에 책을 읽으면서 공부했던 내용의 예제를 구현해보았는데요.1번째로는 추상클래스와 인터페이스의 공통점과 차이점,사용목적에 대해서 어제 표로

exit9509.tistory.com

 

제가 설명할 sealed 메소드는 더 이상 재정의를 원하지 않을 때 봉인하는 메소드입니다.
사용 방법으로는 메소드 앞에 sealed를 붙입니다.

참고로 이 sealed는 최상위 클래스나 최하위 클래스에서 사용할 필요없는, 중간 단계 클래스에서 
해당 메소드를 원치 않을 때, 또는 중간 단계에서 해당 메소드로 인해서 오류가 난다!! 했을 떄

막는 용도로 사용합니다.
참고로, 클래스 전체를 봉인할 수 있고, 그런 경우에는 봉인된 클래스는 더 이상은 상속을 할 수 없게됩니다.

public sealed override void Network()
{
	console.writeLine("네트워크 연결 기능");
}

 

그럼 교재에 나온 것은 한번 생성해볼게요.
이전 interface와 마찬가지로 콘솔앱(.NET Framework) 로 프로젝트 생성하고
이름은 SealedClass 라고 지어줍니다. 봉인클래스 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SealedClass
{
    //폴더폰 클래스
    class FolderPhone
    {
        //가상 메소드 Network  <- virtual 붙이면 가상 메소드이다. 자식클래스에서 override 붙여서 해당 메소드 사용가능
        public virtual void Network()
        {   
            //NetWork메소드의 구현은 아래와 같다.
            Console.WriteLine("위피");
        }
    }
    //3G폰 클래스는 폴더폰을 상속받은 자식 클래스
    class ThreeGPhone : FolderPhone
    {   
        // 가상메소드 NetWork는 자식클래스에서 override 붙인다했죠?
        // override void Network에 봉인을 위한 sealed가 붙었습니다.
        public sealed override void Network()
        {
            Console.WriteLine("와이브로");
        }
    }

    //스마트폰 클래스
    class SmartPhone : ThreeGPhone
    {
        public override void Network()
        {
            Console.WriteLine("와이파이");
        }
    }
    // 실제 프로그램의 구현 부분입니다 
    internal class Program
    {
        // 메인안에서 이제 각 클래스에 대한 객체를 생성하고 메소드를 호출해보겠습니다
        static void Main(string[] args)
        {
            FolderPhone fp = new FolderPhone();
            ThreeGPhone tp = new ThreeGPhone();
            SmartPhone sp = new SmartPhone();
            fp.Network();
            tp.Network();
            sp.Network();
        }
    }
}

앞서서 ThreeGPhone Network() 메소드에 sealed를 걸었었죠! 그렇기에 해당 3G폰을 상속받은 스마트폰 클래스의 네트워크 메소드는 에러가 발생합니다.

 

 

에러메세지가 뜹니다. 3G폰의 Network메소드가 봉인되어 재정의할 수 없다.
가져다 쓸 수없다!!!

 

그렇다면 요기서 이 문제를 해결할 방법으로는 
스마트폰클래스의 네트워크 메소드에 new 지정자를 붙여서 새롭게 만들어주면된다고 합니다.

그럼 new는 어디에 붙이는가?? 바로 지정접근자 뒤[    ] void 메소드명 앞에다가 new를 넣어줍니다.
지정접근자 New void 메소드명() 

에러가 사라졌습니다.
정상적으로 출력되는 것이 확인됩니다.

 

마지막으로 가상메소드의 특성을 이용한 출력을 사용해봅니다.

아까 3G폰은 Sealed 봉인을 이용해서 재정의가 불가능하죠.??
근데 초반에 저희가 정의한 Network()는 virtual 즉 가상메소드였어요.

클래스명1 객체명 = New 클래스명2; 
와 같이 MAIN() 안에 구현해서 
객체명.메소드명; 호출 시 
어떻게 되는지에 대해서 

    internal class Program
    {
        // 메인안에서 이제 각 클래스에 대한 객체를 생성하고 메소드를 호출해보겠습니다
        static void Main(string[] args)
        {
            //FolderPhone fp = new FolderPhone();
            //ThreeGPhone tp = new ThreeGPhone();
            //SmartPhone sp = new SmartPhone();
            //fp.Network();
            //tp.Network();
            //sp.Network();
            
            //wb의 입장에서 ThreeGPhone클래스는 정적 타입 , SmartPhone클래스는 동적 타입입니다.
            // 네트워크는 가상 메소드이므로 동적 타입을 따르게 된다. 
            // 아까 만든 가상 메소드는 3g폰 으로부터 상속 받은 숨겨진 메소드를 뜻하기도 하기에 , 봉인된 메소드는 그대로 상속
            // 받아서 사용하는 수밖에 없다.
            ThreeGPhone wb = new SmartPhone();
            wb.Network();
        }
    }

Three3phone의 console 메세지가 띄어집니다.

 

728x90
반응형