글로벌 객체지향 프로그래밍 9주차 - 상속
상속
상위 클래스의 속성 메소드를 상속하여 새로운 클래스를 생성하는 것
자바나 C#에서는 다중 상속을 지원 하지 않음 (인터페이스의 경우 다중 상속을 지원함)
- C++에서는 다중 상속을 지원함
상속의 장점
중복 코드를 매 클래스마다 사용할 필요가 없어짐
클래스 변경 및 확장이 용이
사용 방법
1
2
3
4
5
6
7
8
class 부모클래스{
//내용
}
class 자식클래스 : 부모클래스{
//부모 클래스의 모든 상태, 내용이 전달됨
자식 클래스만의 메소드
자식 클래스만의 데이터
}
부모 클래스의 private 속성과 생성자는 생성되지 않음
사용 예시
RPG 게임에서 총, 칼, 활을 사용 할 경우 필요한 내용
| 총 | 칼 | 활 |
|---|---|---|
| 함수: 공격, 재장전 | 함수 : 공격 | 함수 : 공격 |
| 변수: 공격력, 탄창 | 함수: 공격력 | 함수: 공격력, 사거리 |
3개 무기 모두 공격이라는 함수, 공격력이라는 변수가 중복이 됨
But, 재장전이라는 함수, 탄창과 사거리라는 변수는 모든 무기에서 사용되지 않음
무기를 여러 개 추가 할 경우 동일 함수, 변수를 만들어야함
해결 방법: 공통 함수와 변수를 상위 클래스에 두고, 하위 클래스에서 상속받아 구현
1
2
3
4
5
6
7
8
9
10
11
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; }
Base
**예시 **
1
2
3
4
5
6
7
class Base{
public void BaseMethod() {}
}
class Derived : Base{
public void DerivedMethod(){ base.BaseMethod(); }
}
Sealed
봉인 된다는 뜻으로, 상속으로부터 보호되어 외부에서 변경이나 수정이 불가능함
- Sealed가 Class 앞에 있을 경우
- 클래스 상속이 불가능
- Sealed가 메소드 앞에 있을 때
- 메소드 상속(오버라이딩)이 불가능
예시 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
sealed class Parent{
public int num;
public Parent() { Console.WriteLine("부모 클래스의 생성자가 호출 되었습니다."); }
}
class Child : Parent{
public int num;
public Child(int num) {
this.num = num;
Console.WriteLine("자식 클래스의 생성자가 호출되었습니다.");
}
public void DisplayValue(){ Console.WriteLine("num의 값은 {0}입니다.", num); }
}
결과
1
2
3
심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태
오류 CS0509 'Child': sealed 형식 'Parent'에서 파생될 수 없습니다.
ConsoleApp1 LocalPath\Program.cs 14 활성
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.