이 시리즈는 유니티에서 제공하는 튜토리얼을 정리해서 올린 것입니다.
--------------------------------------------------------------------------------------------------------------------------------------------------
상속(Inheritance)
한 클래스가 다른 클래스의 요소를 물려받는 것을 상속받는다라고한다. 반대는 상속한다라고한다.
상속해주는 클래스는 부모클래스 혹은 기반클래스, 상속받는 클래스는 자식클래스 혹은 파생클래스라고 한다.
상속은 객체지향프로그래밍(OOP)에서 아주 중요한 개념이다.
상속받는 자식클래스는 부모클래스의 요소를 모두 사용할수있다.
따라서 코드의 가독성 및 재사용성이 향샹된다.
상속을 다룰때 알아두어야할 접근지정자가 있는데 바로 protected이다.
protected는 public과 private의 혼합형처럼 동작한다.
기본적으로 protected는 클래스외부에서 접근할수없다.
그러나 자신에게 상속받은 클래스, 즉 자식클래스에겐 접근이 허용된다.
우리는 알게모르게 상속을 사용하고 있었다.
우리가 스크립트를 만들때 기본적으로 스크립트는 monobehaviour라는 클래스를 상속받는다.
이는 우리가 유용하게 쓰는 GameObject, Transform, Start(), Update()같은 기능들이
모두 monobehaviour클래스에 포함되어있기 때문이다.
상속은 계층 구조를 생각하면 이해하기 쉽다.
동물의 왕국을 상상해보자
먼저 가장 상단에 위치한 동물 클래스를 생각해보자
이 동물 클래스에선 객체가 동물처럼 행동하도록하는 기능을 포함하고 있을것이다.
그 자식클래스를 보면 척추동물과 무척추동물로 나누어진다.
척추동물과 무척추동물의 행동은 달라지겠지만, 기본적으로는 모두 동물처럼 행동할 것이다.
척추동물은 다시 포유류와 파충류와 양서류로 나누어진다.
포유류와 파충류와 양서류의 행동은 다시 한 번 달라지겠지만 모두 척추 동물처럼행동하고 동물처럼 행동할것이다.
이것이 바로 상속의 핵심이라고 할 수 있다.
--------------------------------------------------------------------------------------------------------------------------------------------------
정리하자면
상속은 is a 관계이다.
자식클래스가(is a) 부모클래스라는 의미이다.
자식클래스는 부모클래스의 모든 기능을 물려받았으니 맞는말이다.
포유류는(is a)척추동물이다.
척추동물은(is a)동물이다.
모두 is a 관계를 표현하는 예시이다.
그러나 그 역은 성립하지 않는다.
포유류는 척추동물이지만
척추동물은 포유류가 아니다.
박스콜라이더는(is a)콜라이더이다.
그러나 콜라이더는 박스콜라이더가 아니다.
자식클래스는(is a) 부모클래스이다.
부모클래스는 자식클래스가 아.니.다
--------------------------------------------------------------------------------------------------------------------------------------------------
모든것을 물려받을 것 같은 상속에도 예외는 있다.
바로 생성자이다.
부모의 생성자는 자식에게 상속되지 않는다.
위 코드에는 부모클래스와 자식클래스가 있다.
심플하게 각 클래스에는 age와name이 있고 부모클래스에는 기본생성자와, 커스텀생성자가 하나씩있다.
위와같은 상태에서 자식의 인스턴스를 생성하고 부모의 나이과 이름을 출력해보자.
부모의 어떤 생성자가 호출되었고, 어떤값을 가질까?
부모클래스의 기본생성자가 호출되었다.
--------------------------------------------------------------------------------------------------------------------------------------------------
생성자는 상속되지 않는다.
자식클래스의 인스턴스를 만들면 부모클래스는 기본생성자를 사용하여 값을 초기화한다.
그렇다면 부모클래스의 커스텀생성자를 사용하는 방법은 없을까?
--------------------------------------------------------------------------------------------------------------------------------------------------
base키워드를 이용한다.
base는 마치 상속처럼 생성자뒤에 콜론을 붙이고 base()를 써주면 된다.
생성자 뒤에 base를 써야하기때문에 생성자가 필요없더라도 귀찮음을 무릅쓰고 기본생성자를 직접 명시해주어야한다.
base뒤에오는 괄호에는 매개변수를 넣을수있다. 이 매개변수는 부모의 생성자를 식별하기위한 매개변수이다
즉 괄호안에 아무것도 적지 않으면 부모의 기본생성자를, 그렇지 않고 매개변수를 형식에 맞게 적으면 형식에 맞는 부모의 생성자를 사용하겠다는 뜻이다.
아 그렇다면 base()라는건 사실 Public ParentClass()같은 의미인가보다.
--------------------------------------------------------------------------------------------------------------------------------------------------
검증을 위해 부모의 커스텀 생성자를 사용해보자
위위 코드에서 부모의 커스텀 생성자의 매개변수는 int형 변수와 string형 변수를 받는 모양이었다.
그리고 자식의 인스턴스를 생성하고 부모의 나이와 이름을 출력해보자
Q . E . D .
--------------------------------------------------------------------------------------------------------------------------------------------------
이런 완벽해보이는 상속에도
다중 상속이 불가능하다는 점
계층구조의 결합성이 강하다는 점
불필요한 기능이 상속될 수 있다는 점 등
단점과 한계는 분명 존재한다.
뭔가 본능적으로 개념은 아는데 글로 적으라고 하면 못할꺼 같아...
자식 클래스 만들땐 생성자 ㅈ까고 만든다 > 자식에 base 쓰면 생성자 고를 수 있다!
@Indie1(211.51) 처럼 쓸 수 있을듯?