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

안녕하세요 . 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();
}
}
}
에러메세지가 뜹니다. 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();
}
}