클래스 상속(Inheritance)
- 부모 객체의 멤버를 자식 객체가 물려 받는 것
- 코드의 재사용
- 코드의 확장
- 상속(Inheritance)
- 파생(Derive)
- 확장(Extend)
- 슈퍼(super)클래스 - 서브(sub)클래스
- 부모클래스 - 자식 클래스
- 기본 클래스 - 파생 클래스
코드의 재사용 하기위해서 상속 개념 이용
상속시..
- public 은 상속이 가능하고, 자식클래스에서도 public이 된다.
- private은 상속은 가능한데, 자식클래스조차도 접근 불가능!!
- protected은 상속이 가능하고, 자식클래스에서만 접근 가능
- public(공개) > protected
> private(비공개)
상속관계에서는 public 처럼 작동하는것이 protected
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Inheritance
{
static void Main(string[]
args)
{
Childe c = new
Childe();
c.n = 10;
c.Hello();
//protected가 private 처럼 작동
//c.o;
Descendant d = new
Descendant();
d.Hello();
}
}
//부모 클래스
class Parent
{
//멤버변수
public int n;
private int m;
protected int o;
//멤버 메서드(정적은 상속 개념이 없다.)
public void Hello()
{
Console.WriteLine("ㅎㅇ~ 숫자 : {0}", this.n);
}
}
//자식 클래스
class Childe
: Parent
{
public void Test()
{
//this.m?
//1. 상속이 안되는건지?
//2. 상속은 됐는데 안보이는건지? O
//부모클래스에서 선언된 protected
this.o = 10;
}
}
class Descendant
: Childe
{
}
}
Object
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class object01
{
static void Main(string[]
args)
{
Test t = new Test();
Random rnd = new Random();
t.
//System.Object
// - 닷넷의 존재하는 모든 클래스의 최상위 클래스
// - 단군할아버지(시초)
}
}
class Test
: System.Object
{
}
}
오버라이딩(Overriding)
- 최우선의, 가장 중요한; 압도적인
- 클래스 상속관계에서 구현 가능한 기술
- 부모 클래스의 메서드를 자식에게 물려줬는데... 자식도 동일한
이름의 메서드 정의할때
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleEx
{
//Ex91_overriding.cs
class Ex91_overriding
{
static void Main(string[]
args)
{
Parent p = new Parent();
p.Test();
Child c = new Child();
//부모의 메서드의 자식의 메서드가 이름이 같으며 항상 자식객체를 통해서 접근하는 메서드는
자식의 메서드가 된다.!!
c.Test();
}
}
class Parent
{
public int a;
public void Test()
{
Console.WriteLine("a : " + this.a);
}
}
class Child
: Parent
{
public int b;
public void Test()
{
Console.WriteLine("b : " + this.b);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleEx
{
//Ex92_Overriding.cs (2012_2_22_7st)
(print 예제는 Overriding 아님)
class Ex92_Overriding
{
static void Main(string[]
args)
{
Printer p = new Printer("홍길동", "LG1100");
p.Print();
HP640 hp = new HP640();
hp.Print();
Random rnd = new Random();
int n =
rnd.Next(1, 101);
UserRandom
rnd2 = new UserRandom();
int m =
rnd2.AAA();
}
}
class UserRandom
: Random
{
public int AAA()
{
return this.Next(1, 101);
}
}
//신형 프린터 -> 상당수의 기능이 Printer와 유사
class HP640
: Printer
{
//HP640만의 멤버 추가 -> 기능 확장(변수, 메서드)
public int ink; //잉크량 저장하는 멤버 추가
//향상된 출력 -> 부모보다 좋은 기능(개량)
// new : 부모의 메서드를 감추겠습니다. (new 를보고
부모클래스에도 같은 메서드이름인 Print가 있다고 예상 할수있다.)
public new void Print()
{
Console.WriteLine("HP640 출력기능 : {0},{1},{2}", this.owner,
this.name, this.ink);
}
}
//프린터 클래스
class Printer
{
protected string owner; //소유자
protected string name; //모델명
public Printer()
{
this.owner = "";
this.name = string.Empty; //Empty :
public으로 열려있는 멤버변수라고 생각하자.
}
public Printer(string owner, string
name)
{
this.owner =
owner;
this.name = name;
}
//프린터 -> 출력(기능) -> 메서드 ->
Print()
public void Print()
{
Console.WriteLine("Print 클래스 출력 기능: {0}, {1}", this.owner,
this.name);
}
}
}