2024. 3. 5. 17:43ㆍC#
객체 지향 프로그래밍(OOP)의 주요 4개의 특성 중 하나인 상속.
오늘은 C#에서 상속을 어떻게 사용하는지에 대하여 정리해 보는 시간을 가져 보겠다.
상속 (Inheritance)
객체 지향 프로그래밍의 주요 특성 중 하나,
부모 클래스의 모든 기능을 가지는 자식 클래스를 설계하는 방법으로 사용된다.
이때, 상속받은 자식 클래스는 부모 클래스의 모든 기능들을 부여받는다.
이해하기 쉬운 상속 관계 예제
사과와 바나나가 있다고 가정하자.
과일은 사과이다. -> 말이 되지 않음
사과는 과일이다. -> 0
바나나는 과일이다. -> 0
관계식 : 과일⊃ 사과, 과일 ⊃ 바나나
=> 사과와 바나나는 과일에 속하기에 과일의 특성(속성)을 이어받은 자식 관계에 속한다고 볼 수 있다.
상속 방법
class 부모클래스명
{
//부모클래스 인스턴스 필드
}
class 자식클래스명 : 부모클래스명
{
//부모클래스의 모든 변수와 함수들이 전달됨.
//추가적인 기능들을 제작할 수 있다.
}
상속을 이용하면 중복되는 필드값과 함수들을 손쉽게 반복하고 구별할 수 있다.
만약 rpg게임에서 선택할 수 있는 직업군이 여러 가지일 경우,
해당 직업에 따라 다르게 설정해야 하는 중복 필드 값인 체력, 공격력, 기술 등등을 손쉽게 정의할 수 있을 것이다.
접근 제한자
이미 객체 지향 프로그래밍(OOP)을 공부하며 언급했지만,
추가적인 내용도 정리하고 복습도 할 겸 다시 한번 정리해 보겠다.
단, 이미 정리한 내용들이니 별다른 설명 없이 표를 그리는 것으로 넘기겠다.
접근 제한자 | 설명 |
public | 내부, 외부를 구별하지 않고 모든 곳에서 접근을 허용한다. |
private | 내부에서만 접근을 허용한다. |
protected | 내부와 상속받은 클래스에서만 접근을 허용한다. |
internal | 같은 어셈블리 내에서만 접근을 허용한다. |
(같은 어셈블리?)
(같은 프로젝트 내의 모든 파일 및 라이브러리를 의미한다.)
접근 제한자는 객체 지향 프로그래밍(OOP)의 특징 중 하나, 캡슐화와 크게 관련이 있다.
상속과 접근 제한자를 이용한 예시
class Monster
{
//private int hp; //아무리 자식이라고해도 이것을 줄 수 없다.
protected string name; //가족간의 비밀
protected int hp;
public void TakeHit(int damage)
{
hp -= damage;
Console.WriteLine($"{name}이/가 {damage}받아 체력이 {hp}가 되었습니다.");
}
}
class Dragon : Monster
{
public Dragon(string _name)
{
name = _name;
hp = 100;
}
public void Breath()
{
Console.WriteLine($"{name}의 브레스 공격!!");
}
}
class Hero
{
int damage = 3;
public void Attack(Monster m)
{
m.TakeHit(damage);
}
}
설명
Dragon이라는 클래스는 Monster라는 클래스의 자식 클래스로
Monster가 가지고 있는 변수들 name, hp와 함수 TakeHit()을 상속받아 가지고 있다.
(Dragon은 Monster와 같은 heap 주소에 저장되지 않고 각자 독립적인 힙주소를 가지고 있다.)
Monster가 가지고 있는 변수들은 모두 protected 접근 제 한 자인 인스턴스 변수들이다.
접근 제한이 protected라서 자식 클래스인 Dragon은 해당 변수에 접근할 수 있다.
Dragon은 생성자를 통해 속성값을 대입받는다.
Dragon의 Breath() 함수를 통해 자식 클래스는 부모 클래스의 멤버들을 상속받고도
추가적인 함수들과 변수들을 선언할 수 있음을 알 수 있다.
TakeHit() 함수가 public 접근 제한자로 설정되어 있어,
외부 클래스인 Hero에게 선언될 수 있음을 알 수 있다.
'C#' 카테고리의 다른 글
반복기 Iterator (0) | 2024.03.13 |
---|---|
[ C# ] Event (정의와 delegate와의 차이점) (0) | 2024.03.11 |
[ C# ] Delegate (0) | 2024.03.11 |
[ C# ] Getter와 Setter 그리고 Property (0) | 2024.03.05 |
[C#] 값 형식과 참조 형식 (0) | 2024.03.04 |