Unity Chapter 7-6. C# 프로그래밍 [중급] (2/2) : 추상 클래스
카테고리: Unity Lesson 1
태그: C Sharp Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 7. C# 프로그래밍 : 중급 (2/2)
🔔 추상 클래스 abstract class
추상 클래스란?
- 일반 클래스와 인터페이스의 중간 정도
- 인터페이스 같은 면
- 모든 자식들이 반드시 오버라이딩해야 하는 함수 껍데기 (프로토타입)을 가지고 있다.
- 따라서 추상클래스 스크립트는 컴포넌트로서 오브젝트에 붙일 수 없다.
- 일반 클래스 같은 면
- 인터페이스와 다르게 어느 정도 실제 구현 부분도 포함할 수 있다.
- 멤버 변수도 가질 수 있고 멤버 함수를 바디까지 구현할 수 있다.
- 인터페이스와 다르게 어느 정도 실제 구현 부분도 포함할 수 있다.
- 인터페이스 같은 면
abstract
키워드
abstract
키워드를 클래스 이름 앞에 붙이면 추상 클래스가 된다.abstract
를 함수 이름 앞에 붙이면 이 함수는 껍데기 뿐이므로 반드시 자식 클래스에서 오버라이딩 해야 한다는 의미다.- 함수의 프로토타입만 작성한다.
public abstract class BaseMonster : MonoBehaviour { public abstract void Attack(); }
abstract
와 virtual
의 차이점
virtual
은{}
중괄호, 즉 함수의 바디를 가진다.- 자식 클래스가 이 함수를 오버라이딩 하도록 권장할 뿐
- 자식 클래스가 이 함수를 오버라이딩 하지 않으면 부모가 정의한 바디 내용대로 실행된다.
abstract
은 함수의 바디를 가지지 않는다. 프로토타입 뿐.- 모든 자식 클래스에서 이 함수를 반드시 오버라이딩 하도록 강제한다.
- 오버라이딩 하지 않으면 에러 남.
📜BaseMonster.cs (추상클래스)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class BaseMonster : MonoBehaviour
{
public float damage = 100f;
void Update()
{
if(Input.GetKeyDown(KeyCode.Space))
{
Attack();
}
}
public abstract void Attack();
}
- 추상클래스는 보다시피 멤버 변수(damage)도 가질 수 있고 구현된 함수(void update())도 가질 수 있다.
- 자식 클래스에서
abstract
함수인 Attack() 함수를 반드시 오버라이딩 해야한다.
📜Goblin.cs
- 📜BaseMonster를 상속 받는다.
- public class Goblin : BaseMonster
- 멤버 변수
- public float damage = 100f; (상속 받음)
- 멤버 함수
- void Update() (상속 받음)
- 스페이스바 누르면 공격
- public abstract void Attack(); 오버라이딩
- void Update() (상속 받음)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Goblin : BaseMonster
{
public override void Attack() // 오버라이딩
{
Debug.Log("한 캐릭터를 공격했다. 공격력: " + damage);
}
}
📜Orc.cs
- 📜BaseMonster를 상속 받는다.
- public class Orc : BaseMonster
- 멤버 변수
- public float damage = 100f; (상속 받음)
- 멤버 함수
- void Update() (상속 받음)
- 스페이스바 누르면 공격
- public abstract void Attack(); 오버라이딩
- void Update() (상속 받음)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Orc : BaseMonster
{
public override void Attack()
{
Debug.Log("광격 공격을 했다. 공격력: " + damage);
}
}
📜Goblin과 📜Orc를 각각 오브젝트에 붙여주면 같은
Attack()
이라고 둘이 다르게 동작하는 것을 볼 수 있다.
📜Test.cs
다형성을 사용하여 📜BaseMonster 타입으로 자식들을 한방에 관리해보자.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
public BaseMonster[] monsters;
void Start()
{
for(int i = 0; i<monsters.Length; i++)
{
Debug.Log(monsters[i].gameObject.name);
}
}
}
- public BaseMonster[] monsters;
- 부모 타입(추상클래스)인
BaseMonster
하나로 자식 클래스(📜Goblin과 📜Orc)에 접근할 수 있게 되었다. - 유니티에서 슬롯에 📜Goblin과 📜Orc 스크립트가 붙어있는 오브젝트를 드래그 앤 드롭하여 넣어주기.
- 부모 타입(추상클래스)인
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기