본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 26. 클래스의 핵심 상속

이번 강의는 객체지향의 꽃이라고 볼수있는 상속을 알아보도록 하겠다.

객체지향의 꽃이 상속이다 (?)


1. 상속 (inheritance)

지금까지 주구장창 마리오만 사용했으니 조금 다르게

RPG게임을 만든다고 해보자

캐릭터는 마리오 게임에서 만든 클래스를 재사용 하자! (와! 클래스의 재사용성을 알았다)


RPG게임이라면 모름지기 무기를 가지고 있어야한다.

일단 간단하게 총 칼 활 무기 3개 클래스를 만들었다


근데 생각해보니까 3개다 무기라 공통된점이 너무 많다 

그렇다고 같은 클래스로 퉁치기에는 총이랑 칼이랑 활은 너무 다르다.


아 무기를 서너개 더만든다면 또 똑같은 공격함수를 짜고 공격력 변수를 만들고...

너무 화가나서 더이상 게임 제작하기 싫을것이다.



프로그래머가 개발도중에 도망가는것을 막기위해 C#은 상속을 지원한다.

아 다 공통개념을 묶어 웨폰 클래스를 만들고 고걸 고대로 사용할수 있게하되 약간의 기능만 추가해서 새로운 클래스를 만들수가 있다.


class Weapon
{
public void Attack() { }
protected int power;
}
class Gun : Weapon
{
public void Reload() { }
private int magazine;
}
class Knife : Weapon
{

}
class Bow : Weapon
{
private int reach;
}

다음과 같이 클래스를 선언할때 class Gun : Weapon 처럼 뒤에 : 부모클래스이름

을 적어 해당 클래스를 상속받을수 있다.

여기서 부모 클래스는 protected 접근 지정자를 사용하여 자식 클래스만 접근가능하게 접근을 제한 할 수 있다.

여기서 중요한것은 자식 클래스라도 부모의 private에 접근할수없다.

그렇지만 자식이 만들어질때 해당 자식에 부모의 private가 없는것은 아니다..


class Weapon
{
public void Attack() { }

public int power_public;
protected int power_protected;

private int power_private;

public int power_property
{
get { return power_private; }
set { power_private = value; }
}

public Weapon()
{
this.power_protected = 10;
this.power_public = 10;
this.power_private = 10;
this.power_property = 10;
}

}
class Knife : Weapon
{
public Knife()
{
this.power_public = 10 ;
this.power_protected = 10;
this.power_property = 10;
}
}
class Program
{

static void Main(string[] args)
{
Knife k = new Knife();
k.power_public = 10;
k.power_property = 10;
}
}

각각 public, protected, private 변수가 있을때 사용할수있는 범위를 나타낸것이다.





namespace ConsoleApp3
{
class Weapon
{
public void Attack() { Console.WriteLine("공격!!!!"); }
private int power;
}
class Gun : Weapon
{
public void Reload() { }
private int magazine;
}
class Knife : Weapon
{

}
class Bow : Weapon
{
private int reach;
}


class Program
{

static void Main(string[] args)
{
Gun g = new Gun();
Knife k = new Knife();

Console.WriteLine("Gun의 공격 호출");
g.Attack();
Console.WriteLine("Knife 의 공격 호출");
k.Attack();
}
}
}

weapon의 attact 함수는 공격!! 을 출력하게 해놓았다.
bow와 knife 모두 어택 함수가 잘 동작하는 모양이다.



이제 해당 무기를 캐릭터가 가지고있게 해야겠다

2. has-a
class Character
{
private Knife weapon = new Knife();
}

캐릭터가 Knife를 무기로 가지게 되었다.

이런 관계를 소유의 관계(has - a 관계) 라고 한다
더 깊이들어가면 명칭도 몇개 있는데.. 생략하도록 하겠다.



3. 생성 순서

부모를 상속받으면 해당 클래스는 부모의 변수와 함수를 가지게된다.

이걸 가지게 되는 이유는 컴파일러가 우리몰래 코드를 손봐서 거기에 똑같이 동작하도록 함수와 변수를 삽입해주는것이 아니다.


자식이 만들어지면 그냥 부모도 만들어버린다


간단한 예제를 살펴보자


class Weapon
{
public Weapon()
{
Console.WriteLine("부모 생성자");
}
~Weapon()
{
Console.WriteLine("부모 소멸자");
}
}
class Gun : Weapon
{
public Gun()
{
Console.WriteLine("자식 생성자");
}
~Gun()
{
Console.WriteLine("자식 소멸자");
}
}



class Program
{

static void Main(string[] args)
{
Gun g = new Gun();
}
}



생성자 순서 부모 - 자식순

소멸자 순서 자식 - 부모 순

728x90