객체지향 OOP의 3대 특성
은닉성
상속성
다형성
public : 잘 알제? => 공개적이다.
protected : 클래스 외부에서 접근 불가, 파생클래스는 접근 가능.(자식은 가능)
private : 클래스 내부에서만 접근 가능. 파생 클래스도 접근 불가.
internal : 같은 어셈블리에 있는 코드에서만 public으로 접근가능. 다른 어셈블리에 있는 코드에서는 private과 같은 수준의 접근성을 가짐.
protected internal : 같은 어셈블리에 있는 코드에서만 protected로 접근 가능. 다른 어셈블리에 있는 코드에서는 private과 같은 수준의 접근성을 가진다.
private protected : 같은 어셈블리에 있는 클래스에서 상속받은 클래스 내부에서만 접근이 가능하다.
접근 한정자를 수식하지 않은 클래스는 default 값이 private이다.
class Child : Parent
{
}
이러한 자식 클래스가 있다고 치면,
자식 클래스 객체를 생성 할 때, 부모 클래스의 생성자를 호출한 후에 자신의 생성자를 호출하고,
객체가 소멸될때에는
자식클래스 -> 부모 클래스 순서이다.
class Chlid : Parent
{
public Child (string name, int age)
{
}
}
Child c1 = new Child("KNY", 26);
이럴경우 Parent에다가 name, age 어떻게 전달 해 줄수 있을까?
"base" 키워드 사용 => "기반 클래스(부모)"를 가르킨다.
"this"는 자기자신
class Base
{
public Base(string name, int age) {}
}
class Child : Base
{
public Child(string name, int age) : base(name, age)
{ }
}
이런식으로 사용한다.
또한 상속하기 싫을 경우
sealed class Base
{
public Base(string name, int age) {}
}
class Child : Base
{
public Child(string name, int age) : base(name, age)
{ }
}
"sealed" 키워드 사용
class Mammal
{}
class Dog : Mammal
{}
class Cat : Mammal
이렇게 기반클래스와 파생클래스 관계일 경우
Mammal mammal = new Mammal();
mammal = new Dog();
이렇게 가능하고
is, as 를 사용하여 우아하게 형식 변환이 가능함.
is보다는 as사용을 권장한다.
is : 객체가 해당 형식에 해당하는 검사하여 bool값 반환함.
as가 코드를 관리하기가 수월하다.
Mammal m1 = new Mammal();
Cat cat = m1 as Cat;
만약 형식 변환에 실패 했다면 cat은 null값을 가진다.
❗ 단, 참조 형식에 대해서만 사용이 가능하다 ❗