미리 만들어둔 클래스를 가져와서 새로운 클래스를 만들어 내는 것
=>부모 : 자식 관계로 쉽게 이해 가능하다.
유니티에서 스크립트를 새로 만들면 기본적으로 제공되는 'MonoBehavior'
자동적으로 이 MonoBehavior 클래스를 상속받도록 하여 유니티에서 제공하는 기본 편의 기능들을 사용할 수 있는 것이다.
코드 생성
//MonoBehavior 를 상속하지 않는다
public class Animal
{
public string name;
public float weight;
public int year;
public void Print()
{
Debug.Log("이름 : " + name + ", 몸무게 : " + weight + ", 나이 : " + year);
}
public float GetSpeed()
{
float speed = 100f / (weight * year);
return speed;
}
}
class Animal 은 앞으로 만들 동물 클래스들의 베이스가 될 '부모 클래스'이다.
그럼 이제 실제 동물들을 만들어보자.
코드 추가
//기존 Animal 스크립트에 이어서 작성
public class Dog : Animal
{
public void Hunt()
{
float speed = GetSpeed();
Debug.Log(speed);
weight += 10;
}
}
public class Cat : Animal
{
public void Stealth()
{
Debug.Log("숨었다!");
}
}
Dog 클래스에서는 별다른 선언도, 정의도 해주지 않고 오직 Hunt() 함수만 정의해주었다.
근데 GetSpeed() 함수와 weight 변수를 사용할 수 있는데 왜그럴까?
바로 이번 시간에 다루는 '상속' 때문이다.
Dog 클래스가 Animal 클래스를 상속받으며 사용하기 때문에 ( public class Dog : Animal )
Animal 클래스가 가진 모든 기능을 사용할 수 있는 상태로 클래스 제작이 시작된다.
미리 만들어진 키워드(부모 클래스의 변수/함수) 를 조합하여 자기 자신만의 코드를 만들 수 있다.
예시 코드
public class Test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Cat nate = new Cat();
nate.name = "Nate";
nate.weight = 10f;
nate.year = 3;
Dog jack = new Dog();
jack.name = "Jack";
jack.weight = 15f;
jack.year = 5;
nate.Print();
jack.Print();
}
}
이 코드를 보면 Test 클래스는 Animal 을 상속받지 않은데도 Cat()과 Dog()의 키워드를 통해 각자의 기능을 모두 사용할 수 있다.
이와 같은 이유로 jack.Print()를 통해 Jack 의 정보를 호출할 수도 있다.
Animal 클래스를 보면 동물의 속도를 구하는 함수인 GetSpeed() 가 있다.
근데 이 GetSpeed()의 속도 공식을 자식 클래스인 Dog과 Cat에서 알 이유가 있을까?
Dog과 Cat 은 그저 자신의 속도가 몇인지만 알 수 있으면 된다.
이와 같은 이유로, "정보의 공개 범위" 를 지정할 수 있다.
코드 수정
//public 을 private 로 수정
private float GetSpeed()
{ ~ }
이렇게만 작성하면 될까? 전혀 아니다. 실습을 직접 해보는 사람이라면 바로 알겠지만, 에러가 발생한다.
Why? 상속을 사용하는 '부모 - 자식' 관계여도, private 범위 지정자를 사용한 변수/함수를 상속받아 사용할 수는 없다.
그럼 어떻게 해야할까?
코드 수정
public float GetSpeed()
{
return CalcSpeed();
}
private float CalcSpeed()
{
return 100f / (weight * year);
}
기존 GetSpeed() 에 있던 속도 계산 공식을 새로운 함수 CalcSpeed()를 만들어 그 안에 넣어주고,
이 CalcSpeed()의 범위를 private로 지정한다.
GetSpeed()는 자식 클래스에서도 사용해야 하기 때문에 public으로 진행한다.
이렇게 코드를 수정하면. 속도 계산 공식 자체는 내부로( 부모 클래스 한정으로) 숨기면서도 Dog과 Cat 클래스에 GetSpeed() 함수를 상속시켜, 각자의 속도를 반환할 수 있게 된다.
코드
기존에 작성했던 Test 클래스에 " Jack.GetSpeed(); " 를 입력해보자 : 문제없이 작동한다.
여기서 한가지 이전에 들었던 의문과 마찬가지로, Jack의 속도를 자식 클래스인 Dog 나 Cat 도 아니라 Test 라는 외부 클래스에서 알 필요가 있을까?
코드 수정
//public 을 protected 로 수정
protected float GetSpeed()
{
return CalcSpeed();
}
protected 범위 지정자는 자신을 상속받는 자식 클래스에서는 사용 가능하지만,
외부 클래스에서는 접근할 수 없도록 한다.
이처럼 public / protected / private 와 같은 키워드들을 "범위 지정자" 라고 부른다
1. Public : 내부, 외부 모두 사용 가능
2. Protected : 내부에서만 사용 하능
3. Private : 자기 자신만 사용 가능
여기서의 내부는 자신과 자신을 상속하는 자식 클래스, 외부는 그 외에 연관관계가 없는 외부 클래스까지를 말한다.
이러한 범위 지정자를 구분하는 이유가 무엇일까?
컴퓨터의 성능 or 속도 문제? 아니다.
범위 지정자 구분을 통해 이후의 코드 작성이 더욱 간결해지기 때문이다.
#14. 오버라이드(Override) (0) | 2024.08.03 |
---|---|
#13. 다형성 (0) | 2024.08.03 |
#11. 레이캐스트(RayCast) (0) | 2024.08.01 |
#10. 코루틴(Coroutine) (0) | 2024.07.31 |
#9. 싱글톤(Singleton) (0) | 2024.07.31 |