" /> 글로벌 객체지향 프로그래밍 9주차 - 상속 | BlackWerf's Blog
포스트

글로벌 객체지향 프로그래밍 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
    
    base.부모메소드();
    


  • 생성자에서 호출되며, 부모 클래스의 생성자를 호출하고 자신의 생성자를 호출

  • Child 생성자 : 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 라이센스를 따릅니다.