본문 바로가기

Unity/▶ Unity Composition

[Unity Composition]#3. 클래스와 오브젝트

728x90
반응형

객체 지향:  '사람이 현실 세상을 보는 방식'

 

일반적으로 사람은 현실의 사물을 분해하여 여러 개 부품의 집합으로 생각하지 않고, 하나의 사물(오브젝트)로써 인식하는데 객체지향은 이러한 오브젝트의 집합으로 구성하는 방식이다.

클래스

클래스: 묘사할 대상과 관련된 코드를 묶는 틀

- 예를 들어 사람을 표현할 때 사람의 특징을 규정하는 변수와 메서드가 구현되고, 이를 하나의 클래스로 묶어두면 관리가 용이하다.

 

다음과 같이 사람에 관한 Human클래스를 만든다고 가정하면 다음과 같다.

class Human{
	string name;
	void Walk();
	// 관련 메서드의 집합
}

클래스의 특징

  • 클래스란 표현하고 싶은 대상을 추상화하여 대상과 관련된 변수와 메서드를 정의한 틀
  • 클래스는 프로그램 속에 실제로 존재하는 사물(오브젝트)가 아니며 일종의 '틀'이다.
  • 즉, 물건은 아니지만 사물(오브젝트)을 만들 수 있게한다.

오브젝트

오브젝트: 물건의 설계도인 클래스와는 다르게 오브젝트는 실제 하는 물건이다.

  • 클래스는 실제로 존재하는 오브젝트는 아니지만, 클래스를 이용하여 실제로 존재하는 오브젝트를 생성할 수 있다.

클래스와 오브젝트의 관계

클래스는 하나만 존재하지만, 클래스를 기반으로 생성한 오브젝트는 여러 개 존재할 수 있다!

 

인스턴스화: 클래스를 이용하여 오브젝트를 생성해 실체화하는 것을 인스턴스화 한다고 하며, 인스턴스화를 이용해 생성된 오브젝트를 인스턴스라고 한다.

오브젝트의 독립성

하나의 원본 클래스에서 생성되었다고 해도 여러 개의 오브젝트를 생성할 수 있는데, 이는 각각의 오브젝트가 서로 독립적이며 구별 가능한 실체이기 때문이다.

Animal 클래스 만들기

Animal 클래스는 동물을 표현하는 클래스이다.

Animal 클래스

유니티 프로그램을 열고 새로운 C# script를 생성한다.

  1. project > Creat > C# script 
  2. Asset > C# script 더블클릭

새로운 C# script

Animal 클래스 완성하기

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

public class Animal {
    
    public string name;
    public string sound;

    public void Playsound(){
        Debug.Log(name + ":" + sound);
    }

}

완성된 Animal클래스는 이름을 저장하는 변수인 name과 울음소리를 저장하는 sound변수를 가지며, 울음소리를 재생하는 메서드 Playsound()를 가진다.

매서드: 각 컴포넌트가 가지고 있는 기능.

이렇게 Animal클래스를 만들었지만 아직은 이를 실행할 수 없다. 클래스는 실체 오브젝트가 아니기 때문이다.

따라서 이 Animal 클래스를 실행하기 위해 Animal 오브젝트를 만드는 Zoo 스크립트를 생성해야 한다.

 

이때 Animal 클래스는 MonoBehaviour 클래스를 상속하지 않기 때문 Animal 클래스는 게임 오브젝트에 컴포넌트로 추가할 수 없다.

MonoBehaviour 클래스: 게임 오브젝트의 컴포넌트로서 필요한 기능들을 제공한다. 
MonoBehaviour는 new를 사용하지 않는다.
  • 유니티에서 작성하는 대부분의 스크립트는 MonoBehaviour를 상속하지만, MonoBehaviour를 상속한 클래스는 new를 이용하여 오브젝트를 상속할 수 없다.
MonoBehaviour를 상속한 클래스 드래그&드롭으로 스크립트를 게임 오브젝트에 컴포넌트로 추가하는 방법으로 만 오브젝트를 생성 할 수 있다.

MonoBehaviour를 상속한 클래스는 컴포넌트로만 동작하며 컴포넌트는 게임 오브젝트의 부품으로만 존재할 수 있다.
C# 기반 new이용 생성 C#에서는 새로운 오브젝트를 생성할 때 new를 사용하는 것이 일반적이지만 유니티는 new를 많이 사용하지 않음.
new 생성자 이용 MonoBehaviour를
상속한 클래스를 오브젝트로 생성한 경우
필요한 초기화 과정과 게임 오브젝트에 추가되는 모든 과정을 생략하기 때문에 프로그램이 정상적으로 작동하지 않음.
MonoBehaviour를 상속하지 않은 클래스를 생성하고,
MonoBehaviour를 상속한 오브젝트에서 생성한 클래스를 참조한다!

Zoo 스크립트 생성하기

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

public class Zoo : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Animal tom = new Animal();
        tom.name = "톰";
        tom.sound = "냐옹";

        tom.Playsound();
    }

  
}

스크립트를 다 작성했다고 해서 프로그램이 동작하는 것은 아니다. 이 코드를 게임 오브젝트에 컴포넌트로 추가해야한다.

  1. 빈 게임 오브젝트 생성(하이어라키 > Creat > Creat Empty)
  2. 프로젝트 창의 Zoo 스크립트를 하이어라키 창의 CodeRunner_Zoo로 이동

이렇게 적용된 걸 확인 후에 재생하면 디버그 창에 실행된다.

클래스 생성 이해하기

new Animal();
  • new 연산자는 어떤 클래스의 오브젝트를 새로 하나 생성한다. 따라서 new 연산자 뒤에는 실행 할 클래스의 생성자가 온다.
  • Animal() 메서드는 Animal 클래스의 생성자이다.(생성자의 이름 = 클래스의 이름)
  • Animal() 기본 생성자는 초기화에 필요한 별다를 입력을 받지 않는다.
생성자: 오브젝트를 생성할 때 실행되며, 오브젝트가 생성될 때 어떻게 초기화할지 정의하기 위해 사용하는 특수한 메서드
새로운 Animal 오브젝트를 생성하라!
Animal tom = new Animal();
  • new 연산자가 Animal 클래스의 오브젝트를 하나 생성하고, 이를 Animal 클래스의 tom에 저장한다.
tom.name = "톰";
tom.sound = "냐옹";
  • tom은 방금 생성한 Animal 오브젝트를 가리키게 되며, 생성된 이 오브젝트(tom)는 두 개의 변수, 이름과 소리를 가진다.
tom.Playsound();

Animal 클래스는 울음소리를 재생하는 메서드인 Playsound를 가지는데, 멤버를 점 연산자로 접근하여 사용한다.

멤버: 오브젝트 내부의 변수나 메서드
Playsound()를 tom의 이름으로 실행한다!

멤버와 접근 제한자

클래스의 멤버 어떤 클래스에 속하되, 해당 클래스의 데이터와 행위를 표현하는 요소.
클래스의 필드 클래스의 멤버 중 변수

클래스

접근제한자: 클래스 멤버의 공개 여부를 정하는 키워드

 

public 클래스 외부에서 멤버 접근 가능
private 클래스 내부에서만 멤버에 접근 가능
protected 클래스 내부와 파생 클래스에서만 멤버에 접근 가능

멤버에 아무 접근제한자를 명시하지 않은 경우 private가 적용된다. (기본값:private)

728x90
반응형
댓글