Inheritance

class Person
{
private string name; // 파상클래스에 상속 안됨
protected int age; // 파생클래스에 상속 됨

public Person() : this(“HCI”, 20)
{
}

 

public Person(string name, int age)
{
this.name = name;
this.age = age;
}

 

protected string GetName() // 파생클래스에 상속 안됨
{
return name;
}

 

protected void SetName(string name) // 파생클래스에 상속 안됨
{
this.name = name;
}

 

public void Print()
{
Console.WriteLine(“Person Name: {0} Age: {1}”, name, age);
}
}

 

class Student : Person
{
int id;
public Student() // public Student : base()와 같은 의미, 생성자는 상속안됨
{
id = 5208;
}
public Student(string name, int age, int id) : base(name, age)
{
this.id = id;
}
public void Print()
{
Console.WriteLine(“Student Name: {0} Age: {1} Id: {2}”, GetName(), age, id);
}
}

 

class Program
{
static void Main(string[] args)
{
Person p = new Person();
p.Print();
Person p1 = new Person(“HCI2~~~~~~~~~~”, 2013);
p1.Print();

Student s = new Student();
s.Print();
Student s1 = new Student(“학생들~~”, 24, 555);
s1.Print();
}
}

Protected

public class Car
{

// member field
private bool disel;     // disel은 파생 클래스에서 사용하지 못함
protected bool gasoline;// gasoline은 파생 클래스에서 사용가능하나 클래스 외부에서는 호출하지 못함
protected int wheel = 4;// wheel은 파생 클래스에서 사용가능하나 클래스 외부에서는 호출하지 못함

// constructor
protected Car() { disel = true; gasoline = true;  }
protected Car(int wheel) { this.wheel = wheel; disel = false; gasoline = false; }

// method
public void Move()
{
if (disel)
Console.Write(“Car 디젤”);
else
Console.Write(“바퀴 {0} 자동차가 굴러간다.”, wheel);
}

}

public class Sedan : Car
{

// member field
private bool gasoline;  // 파생 클래스에서 기반클래스에 멤버필드명이 같다면 default는 자신의 멤버부터 호출 &
Sedan.gasoline은 Car.gasoline을 숨김 => private new bool gasoline와 같은 의미

// constructor
public Sedan() { gasoline = false;  }  // Sedan() : base() 호출
public Sedan(int wheel) : base(wheel) { gasoline = true; } // Sedan(int wheel) :
base(int wheel)를 호출 – protected 생성자는 기반 클래스의 생성자 호출 base에서 사용됨

// method
public void SedanMove()
{

// base의 gasoline과 this의 gasoline을 구분해야하는 경우
if (base.gasoline)
Console.Write(“Car가솔린”);
if (this.gasoline)
Console.Write(“Sedan 가솔린”);

Console.WriteLine(“바퀴 {0} 세단자동차가 굴러간다.”, wheel);

}

static void Main(string[] args)
{

// error CS1540: ‘Car’형식의 한정자를 통해 보호된 ‘Car.Car()’ 멤버에 액세스할 수 없습니다. 한정자는 ‘Sedan’ 형식이거나 여기에서 파생된 형식이어야 합니다.
//Car myCar = new Car();    // 기반 클래스 생성자 Car()는 상속되지 않음. 따라서 new를 이용하여 객체를 생성할 수 없음.
//myCar.Move();             //  myCar 객체없이 myCar.Move() 호출할 수 없음
//Console.WriteLine(“마이카의 바퀴는 {0}개 이다.”, myCar.wheel); // myCar 객체없이 myCar.wheel 호출할 수 없음

// 바퀴 4개 디젤 자동차
Sedan myCar1 = new Sedan();
myCar1.Move();       // Car를 상속받았기 때문에 Move() 메소드를 사용할 수 있음
myCar1.SedanMove();  // Sedan 자신의 메소드 사용가능
Console.WriteLine(“마이카의 바퀴는 {0}개 이다.”, myCar1.wheel); // 상속된 객체에서 기반 객체의 protected 멤버 필드 호출가능

Console.WriteLine();

// 바퀴 6개 가솔린 자동차
Sedan myCar2 = new Sedan(6);
myCar2.Move();       // Car를 상속받았기 때문에 Move() 메소드를 사용할 수 있음
myCar2.SedanMove();  // Sedan 자신의 메소드 사용가능
Console.WriteLine(“마이카의 바퀴는 {0}개 이다.”, myCar2.wheel); // 상속된 객체에서 기반 객체의 protected 멤버 필드 호출가능

}

}

Class

접근자
-protected 접근 지정자를 사용한 멤버 필드와 메소드는 파생 클래스에서는 사용가능하나 클래스 외부에서는 호출하지 못함

static 필드와 메소드
-static field는 전역 데이터로 클래스당 하나만 할당됨
-static field는 클래스명.정적필드명 형태로 사용
-static method는 class method나 static member field 조작을 위한 메소드
-static method는 instance field는 접근 불가능

constructor (생성자)
-default constructor (기본 생성자)
-constructor overloading (생성자 오버로딩) 생성자를 여러 가지 형태로 정의
-constructor initializer (생성자 초기화 목록) 생성자들 사이의 정의가 비슷한 경우 코드를 간략하게 만들기 위해 사용

-private constructor (private 생성자) 정적 멤버만 포함하는 클래스에서 사용하며 클래스가 인스턴스화 될 수 없음을 분명히 하기 위해 private 접근 지정자를 사용
-static constructor (static 생성자) 정적 데이터 멤버를 초기화하는데 사용

destructor (소멸자)
-객체가 소멸될 때 필요한 정리 작업을 정의하는 부분