객체 지향: '사람이 현실 세상을 보는 방식'
일반적으로 사람은 현실의 사물을 분해하여 여러 개 부품의 집합으로 생각하지 않고, 하나의 사물(오브젝트)로써 인식하는데 객체지향은 이러한 오브젝트의 집합으로 구성하는 방식이다.
클래스
클래스: 묘사할 대상과 관련된 코드를 묶는 틀
- 예를 들어 사람을 표현할 때 사람의 특징을 규정하는 변수와 메서드가 구현되고, 이를 하나의 클래스로 묶어두면 관리가 용이하다.
다음과 같이 사람에 관한 Human클래스를 만든다고 가정하면 다음과 같다.
class Human{
string name;
void Walk();
// 관련 메서드의 집합
}
클래스의 특징
- 클래스란 표현하고 싶은 대상을 추상화하여 대상과 관련된 변수와 메서드를 정의한 틀
- 클래스는 프로그램 속에 실제로 존재하는 사물(오브젝트)가 아니며 일종의 '틀'이다.
- 즉, 물건은 아니지만 사물(오브젝트)을 만들 수 있게한다.
오브젝트
오브젝트: 물건의 설계도인 클래스와는 다르게 오브젝트는 실제 하는 물건이다.
- 클래스는 실제로 존재하는 오브젝트는 아니지만, 클래스를 이용하여 실제로 존재하는 오브젝트를 생성할 수 있다.
클래스는 하나만 존재하지만, 클래스를 기반으로 생성한 오브젝트는 여러 개 존재할 수 있다!
인스턴스화: 클래스를 이용하여 오브젝트를 생성해 실체화하는 것을 인스턴스화 한다고 하며, 인스턴스화를 이용해 생성된 오브젝트를 인스턴스라고 한다.
오브젝트의 독립성
하나의 원본 클래스에서 생성되었다고 해도 여러 개의 오브젝트를 생성할 수 있는데, 이는 각각의 오브젝트가 서로 독립적이며 구별 가능한 실체이기 때문이다.
Animal 클래스 만들기
Animal 클래스는 동물을 표현하는 클래스이다.
유니티 프로그램을 열고 새로운 C# script를 생성한다.
- project > Creat > C# script
- Asset > 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();
}
}
스크립트를 다 작성했다고 해서 프로그램이 동작하는 것은 아니다. 이 코드를 게임 오브젝트에 컴포넌트로 추가해야한다.
- 빈 게임 오브젝트 생성(하이어라키 > Creat > Creat Empty)
- 프로젝트 창의 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)
'Unity > ▶ Unity Composition' 카테고리의 다른 글
[Unity Composition]#6. Vector (0) | 2022.03.07 |
---|---|
[Unity Composition]#5. 변수와 컴포넌트 (2) | 2022.02.03 |
[Unity Composition]#4. 참조 타입 (0) | 2022.02.02 |
[Unity Composition]#2. C#과 C언어와 차이점 (0) | 2022.01.26 |
[Unity Composition]#1. C# Script 생성 (0) | 2022.01.08 |