상속 (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 |