본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티와 C# 개념 정리_Concept Summary

유니티와 C# 개념 정리_014_클래스_Class

Class(클래스)는 개체지향 프로그래밍(OOP)에서 개체를 만드는데 필수적인 설계도와 같다.

클래스는 변수(필드)와 함수(메서드)의 결합체이다.

유니티로 게임을 만들때도 C#으로 만든 클래스는 개체의 특성과 기능을 구현하는 핵심적인 역할을 담당한다.

 

예를 들어 어떤 게임에서 이름과 체력, 점수를 가진 플레이어가 아이템을 수집한다고 하자.

게임에서 이런 특성들을 사용하기 위해서는 클래스에 변수(필드)를 정의한다.

또한 플레이어가 이동하기, 공격하기, 수집하기 등의 동작을 할 수 있게 하려면 함수(메서드)를 만들 수 있을 것이다.

 

1번줄: using namespace(네임스페이스)이름;

클래스 선언 위쪽에 작성하여 네임스페이스 안에 있는 클래스들을 사용할 수 있다.

3번줄: 클래스 선언과 MonoBehaviour 클래스 상속 선언

4~14번줄: 중괄호 안에 클래스 내용

 

클래스 안에 만들 수 있는 요소는 다음과 같은 것들이 있다.

5~7번줄: 클래스의 필드(변수)를 선언

9, 11, 13번줄: 클래스의 메서드(함수) 선언

 

실제로 유니티에서 테스트용 클래스를 만들어 본다.

 

2D Object - Circle 게임오브젝트를 하나 만들고, ClassCircle.cs 스크립트를 작성하여 Circle 게임오브젝트에 연결하면 위와 같은 화면이 된다.

 

Circle게임 오브젝트에 스크립트를 컴퍼넌트로 연결했기 때문에 유니티를 실행하면 스크립트에 작성된 클래스 내용이 Circle 게임오브젝트에 적용될 것이다.

 

스크립트의 클래스는 다음과 같다.

 

5번줄: 속도를 저장하는 speed 변수를 정의한다.

7~11번줄: 게임오브젝트의 위치 정보를 가져오거나 설정할 수 있는 Property(속성)을 정의한다.

13~18번줄: 게임오브젝트를 움직이게 하는 Move( )메서드를 설정한다.

Move메서드에서는 posotion 속성에서 게임오브젝트의 위치 값을 가져와서 사용한다.

22번줄: 유니티의 Update( )메서드에 Move( )메서드를 넣어서 실행한다.

 

클래스 상속(Inheritance)

 

위 코드에서 보듯이 ClassCircle 클래스는 MonoBehaviour 클래스를 상속하고 있다.

상속하는 클래스를 나타내려면 콜론( : ) 기호 뒤에 상속할 클래스명을 적는다.

상속받는 ClassCircle클래스는 Subclass(서브클래스) 또는 자식클래스라고 하고,

상속하는 MonoBehaviour클래스는 Superclass(슈퍼클래스) 또는 부모클래스라고 부른다.

 

Subclass는 Superclass의 모든 필드와 메서드 등을 물려받아서 사용할 수 있다.

 

위 코드를 상속받는 Subclass를 만들어 본다.

 

유니티에서 2d Objejct- Square 게임오브젝트를 추가로 만든다.

Y위치는 2로 설정한다.

그리고 ClassCircleSub.cs 스크립트 파일을 만들어 Square게임오브젝트에 연결한다.

아래와 같이 ClassCircle 클래스를 Superclass(부모클래스)로 상속받는 코드를 작성하면 클래스명에 빨간줄로 에러가 나타난다.

이것은 ClassCircle 클래스가 공개(public)로 설정되어 있지 않기 때문에 상속할 수 없다는 뜻이다.

이 에러를 해결하려면 ClassCircle 클래스의 class 키워드 앞에 다른 클래스에서 사용할 수 있도록 public을 적어주면 된다.

ClassCircleSub 클래스는 내용이 아무것도 없고 단지 ClassCircle 클래스를 상속받는 상태이다.

이 클래스를 저장한 후 유니티를 실행하면 Square 게임오브젝트는 Circle 게임오브젝트와 같이 움직이는 것을 확인할 수 있다.

 

만약 Square게임오브젝트의 움직임을 Circle게임오브젝트와 다르게 하고 싶으면 움직임을 구현한 Move( )메서드를 다르게 작성하면 된다.

이때는 부모클래스(Superclass)에 있는 메서드는 virtual 키워드를 사용하고,

자식클래스(Subclass)의 메서드는 override 키워드를 사용한다.

 

Superclass(부모클래스)인  ClassCircle 클래스 코드는 아래와 같이 수정한다.

Subclass(자식클래스)는 아래와 같이 수정한다.

5번줄 처럼 Square게임오브젝트에서 Move( ) 메서드에 override를 사용하면 ClassCircle클래스의 Move메서드를 상속받는 다는 것을 나타낸다.

7번줄의 base.Move( ); 가 부모클래스의 Move( )메서드를 똑같이 사용한다는 뜻이다.

즉, 게임오브젝트의 y축의 위치는 ClassCircle 클래스에 있는 Move( )메서드를 그대로 실행한다는 뜻이다.

 

9~11번줄에서 새로 추가한 코드를 작성한다.

Square게임오브젝트 x축의 위치를 유니티의 Mathf 클래스에 있는 삼각함수 Sin( ) 메서드를 사용하여 설정한 예이다.

 

스크립트를 모두 저장한 후 유니티에서 실행해서 두 게임오브젝트가 어떻게 움직이는 지 확인한다.

 

클래스와 관련된 다른 내용들은 게임을 제작할 때 다루기로 한다.

 

끝.

Wraven...