본문 바로가기
game as a service

유니티 연습 4 : 클래스

by jessicahan96 2020. 12. 27.

* 처리를 모아 둔 것이 메서드(함수)라면, 클래스는 메서드와 변수를 모아 둔 것입니다.
* 변수와 메서드를 따로따로 구현하면 어느 변수와 메서드가 연결되어 있는 지 알기 어렵습니다.
* 클래스를 사용하면 관계가 있는 변수와 메서드를 하나로 합칠 수 있으므로 스크립트를 관리하기 용이합니다.

* class 키워드 다음에 클래스명을 쓰고, 그 안에 클래스에서 사용하는 변수와 메서드를 씁니다.
* 클래스에서 사용한 변수를 멤버 변수, 클래스에서 사용한 메서드를 멤버 메서드라고 합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

	// Player 클래스를 선언한다.
public class Player
{
    private int hp = 100;
    private int power = 50;
	// 멤버 변수를 선언한다.

    public void Attack()
    {
        Debug.Log(this.power + "대미지를 입혔다.");
    }
    public void Damage(int damage)
    {
        this.hp -= damage;
        Debug.Log(damage + "대미지를 입었다.");
    }
    // 멤버 메서드를 작성한다.
}

public class Test : MonoBehaviour
{
    void Start()
    {
        // Player 클래스의 인스턴스를 만들어 사용한다.
        
        Player myPlayer = new Player();
        //Player형의 myPlayer 변수를 선언한다.
		//이 단계에서는 Player 형의 상자를 만들었을 뿐이므로 Player형의 실체인 인스턴스를 작성해 대입해야 한다.
        //인스턴스를 만들려면 new 키워드 다음에 클래스명()을 쓴다.
        //이로써 Player 클래스의 인스턴스가 만들어지고 이것을 myPlayer 변수 안에 대입한다.
        
        myPlayer.Attack();
        //인스턴스를 가진 Attack 메서드를 myPlater.Attack()의 변수명.멤버메서드명()형태로 호출한다.
        
        myPlayer.Damage(30);
        //Damage 메서드를 호출한다.
        
    }
}

* 작성한 클래스는 int나 string 등 데이터형으로 사용할 수 있습니다. 즉, Player 클래스를 만들면 Player형을 사용할 수 있습니다.

int num;을 쓰면 int형의 num 변수를 만들 수 있고, Player myPlayer;을 쓰면 Player형의 myPlayer 변수를 만들 수 있습니다. 이 상태에서 myPlayer 변수의 상자 안은 비어 있죠.

int형의 num 변수에는 2나 1500 같은 숫자를 대입합니다. 한편 Player형의 myPlayer 변수에는 플레이어의 실체를 대입하는데, 이 실체를 인스턴스라고 합니다.

*myPlayer 변수가 가진 멤버 메서드나 멤버 변수를 사용하려면 myPlayer.멤버 메서드명(또는 멤버 변수명)을 씁니다.

 

실행결과

 

💡접근 수식자

Player 클래스의 멤버 변수와 멤버 메서드 앞에 public이나 private 키워드가 붙어 있죠? 이것을 접근 수식자라고 합니다.

public이 붙어 있는 멤버는 다른 클래스에서도 호출할 수 있지만, private이 붙어 있는 멤버는 다른 클래스에서 호출할 수 없습니다.

Attack 메서드에서는 public이 붙어 있으므로 myPlayer.Attack( )이라고 써서 Attack 메서드를 호출할 수 있습니다. 반면 hp 변수에는 private이 붙어 있으므로 myPlayer.hp라고 써도 hp 변수에 접근 할 수 없죠.

 

접근 수식자를 생략하면 private으로 간주되므로 공개하고 싶은 변수와 메서드가 있다면 public 수식자를 붙이는 것이 좋습니다.

접근 수식자접근 가능 클래스
public모든 클래스에서 접근 가능
protected같은 클래스와 해당 클래스의 서브 클래스에서 접근 가능
private같은 클래스에서만 접근 가능

this 키워드

this는 자신의 인스턴스를 가리키는 키워드입니다. 즉, this.power는 자신의 인스턴스가 가진 power 변수(Player 클래스의 인스턴스가 가진 power 변수)를 나타내죠.

 

사실 this를 붙이지 않아도 자기 클래스의 멤버 변수를 사용할 수 있습니다. 다만 Attack 메서드에서 다음과 같이 멤버 변수와 동일한 이름의 로컬 변수(power)를 선언했다고 할 때, power라고만 쓰면 로컬 변수의 값이 우선해서 사용됩니다. 따라서 멤버 변수를 쓸 때는 명시적으로 this를 붙여야 오류를 막을 수 있죠.

public void Attack()
{
	int power = 9999;
    Debug.Log(power + "대미지를 입혔다");
    //로컬 변수가 우선 쓰이고, 9999 대미지를 주게 된다.
}

이 절에서 설명한 내용을 프로그래밍에서는 객체 지향이라고 합니다. ( 객체 지향의 3대 요소는 상속, 접근 수식자에 의한 캡슐화, 다형성 입니다.)

여기서는 public 및 private 등 접근 수식자를 쓴 '캡슐화'를 소개했습니다.

상속

Test 클래스의 선언 부분 뒤에 붙은 : MonoBehaviour는 상속이라고 합니다. 이 부분은 유니티가 미리 준비한 MonoBehaviour 클래스의 기능을 Test 클래스에 집어 넣겠다고 선언하는 과정이죠.

MonoBehaviour 클래스는 게임 오브젝트를 구성하는 기본 기능을 멤버 변수와 멤버 메서드로 준비한 클래스입니다. 따라서 게임 오브젝트에 붙여 실행하는 스크립트는 MonoBehaviour 클래스(또는 MonoBehaviour를 바탕으로 한 클래스)를 상속해야 합니다.