본문 바로가기
IT/C#

[C#] 상속

by dya0 2020. 7. 10.

상속 (inheritance)

계층적인 관계

공통적인 특징을 정의하는 부모 클래스(parent class ; base or super)를 두고 자식 클래스(child class)에서 부모의 기능으을 물려 받는 식으로 처리 

    public class Computer {
        bool PowerOn;
        public void Boot() { }
        public void Shutdown() { }
        public void Reset() { }
    }
    public class Notebook: Computer{
        bool fingerScan; // Notebook 타입에 해당하는 멤버만 추가
        public bool HasFingerScanDevice() { return fingerScan; }

    }
    public class Desktop : Computer { }
    public class Netbook : Computer { }

상속받은 클래스는 부모의 속성과 행위를 접근 제한자 규칙에 따라 외부에 제공

 

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

namespace ConsoleApp6
{
    public class Computer {
        bool PowerOn;
        public void Boot() { }
        public void Shutdown() { Console.WriteLine("OK, Bye~"); }
        public void Reset() { }
    }
    public class Notebook: Computer{
        bool fingerScan; // Notebook 타입에 해당하는 멤버만 추가
        public bool HasFingerScanDevice() { return fingerScan; }
        public void CloseLid()
        {
            Console.WriteLine("call Shutdown method");
            Shutdown(); //Netbook에서 추가도니 메서드 내에서 부모의 메서드 호출
        }

    }
    public class Desktop : Computer { }
 
    class Program
    {
        static void Main(string[] args)
        {
            Notebook notebook = new Notebook();
            notebook.Boot();
            notebook.Shutdown();
            notebook.CloseLid();
        }
    }
}
//OK, Bye~
//call Shutdown method
//OK, Bye~

pricate처럼 외부 접근 차단하면서 자식한테 쓰게 하고 싶을 때 protected 사용 

상속 못하게 하고 싶어!! sealed사용 ex)string 타입은 sealed여서 상속 불가능

 

+) 형변환

 정수 -> int -> short 순  일반화 -> 특수화 (형변환)

암시적 형변환

특수화 타입의 변수에서 일반화된 타입의 변수로 값이 대입되는 경우

            short a = 100;
            int b = a; //암시적 형변환 가능
            Console.WriteLine("a  : "+ a+" b : " +b);//a: 100 b: 100
            int c = 100;
            short d = (short)c;//큰거에서 작은거로 갈땐 알려줘야 함
            Console.WriteLine("c  : " + c + " d : " + d);//c: 100 d: 100

명시적 형변환

일반화 타입의 변수에서 특수화된 타입의 변수로 값이 대입되는 경우

 

            Notebook notebook = new Notebook();
            Computer pc1 = notebook;// 암시적 형변환 가능 
            pc1.Shutdown();
            pc1.Boot();

Computer를 상속받은 Notebook을 포함

            Computer pc = new Computer();
            Notebook notebook = (Notebook)pc;// 명시적 형변환, 컴파일은 가능 
            //System.InvalidCastException: Unable to cast object of type 'ConsoleApp6.Computer' to type 'ConsoleApp6.Notebook'.
/*            오류 발생!!!
                왜?
              notebook에는 computer가 안 가진 메서드들을 가지고 있어 
hasFingerScanDevice메서드 호출 시 프로그램 실행이 엉망됨 */

 

각 자식 클래스의 인스턴스를 부모 객체의 배열에 담을 수 있는 것도 암시적 형변환 덕분이다.

 

as, is 연산자

클래스 형변환에서 빠질 수 없는 것이 as

캐스팅 연산자를 사용해서 명시적 형변환을 하는 경우 컴파일 단계가 아니라 프로그램을 실행할 때 오류 발생 

using System;
namespace ConsoleApp6
{
    public class Computer {
        protected bool PowerOn;
        public void Boot() { }
        public void Shutdown() { Console.WriteLine("OK, Bye~"); }
        public void Reset() { }
    }
    public class Notebook: Computer{
        bool fingerScan; // Notebook 타입에 해당하는 멤버만 추가
        public bool HasFingerScanDevice() { return fingerScan; }
        public void CloseLid()
        {
            Console.WriteLine("call Shutdown method");
            Shutdown(); //Netbook에서 추가도니 메서드 내에서 부모의 메서드 호출
        }

    }
    public class Desktop : Computer { }
 
    class Program
    {
        static void Main(string[] args) {
            Computer pc = new Computer();
            Notebook notebook = pc as Notebook;

            if(notebook != null)//if문 안탐
            {
                notebook.CloseLid();
            }

        }
    }
}

as 형변환이 가능하면 지정된 타입의 인스턴스 값을 반환, 불가능하면 null 반환

null 반환 여부를 통해 형변환이 성고했는지 판단할 수 있다.

as 연산자는 참조현 변수에 대해서만 적용할 수 있고 참조형 타입으로의 체크만 가능 

            int n = 5;
            if((n as string )!= null) // 컴파일 오류 발생
            {
                Console.WriteLine("변수 n은 string 타입");
            }
            string txt = "Text";
            if((txt as int)!= null) // 컴파일 오류 발생 
            {
                

모든 타입의 조상 System.Object

object 는 최상위야

 

ToString

ToString 메서드를 호출하면 해당 인스턴스가 속한 클래스의 전체 이름(FQDN)반환

program.ToString();하면 솔루션 명.Program 반환

 

ToString 메서드는 자식 클래스에서 기능을 재정의할 수 있다.

 

GetType

클래스(class) 속성 : 클래스의 이름, 멤버(필드,메서드 프로퍼티)를 담고 있음 

 

GetHashCode

 

System.Array

 

this

 

this와 인스턴스/정적 멤버의 관계

 

 

 


참고문헌

정성태, 시작하세요! C# 7.3 프로그래밍 기본 문법부터 실전 예제까지 (위키북스, 2019), 133-125.

 

'IT > C#' 카테고리의 다른 글

[.NET 교육] Day5 오전  (0) 2020.07.21
[c# 교육]day4 2  (0) 2020.07.20
[C#] C# 클래스 확장  (0) 2020.07.09
[C#] 다형성  (0) 2020.07.08
[C#]인스턴스  (0) 2020.07.08