2023/08/01 TIL

김도현·2023년 8월 1일
0

TIL

목록 보기
11/76

레트로의 유니티 게임 프로그래밍 에센스 : C#으로 배우는 입문부터 4가지 게임

5장 게임 오브젝트 제어하기

  • 개요
    • 클래스와 오브젝트의 개념을 이해합니다.
    • C# 클래스로 원하는 사물을 정의합니다.
    • 오브젝트를 생성하는 방법을 배웁니다.
    • 참조 변수를 사용하여 유니티의 컴포넌트를 조작합니다.

5.1 클래스와 오브젝트

객체지향 : 사람이 현실 세상을 보는 방식에 가깝게 프로그램을 완성하는 것

5.1.1 클래스

클래스를 묘사할 (추상화) 대상과 관련된 코드 (변수와 메서드 등)를 묶는 틀
-> 쉽게 말해 붕어빵 틀

  • 메서드 : 클래스(Class), 구조체(Struct), 열거형(Enum)에 포함되어있는 함수

5.1.2오브젝트

물건의 설계도인 클래스와 달리 Object는 실제로 존재하는 물건(실체)

  • 인스턴스화 : 클래스라는 틀로 오브젝트를 찍어내 실체화 하는것
  • 인스턴스 : 인스턴스화로 생성된 오브젝트

5.2 C# 클래스 만들기

5.2.1 Animal 클래스 만들기

Animal C# script

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);
    }

}

5.2.2 Animal 오브젝트 만들기

Zoo C# script

void Start()
    {
        Animal tom = new Animal();
        tom.name = "톰";
        tom.sound = "냐옹!";

        tom.PlaySound();
    }

5.2.3 Zoo 스크립트 분석하기

Animal 오브젝트를 생성하고 그것을 Animal 타입의 변수 tom에 할당

new Animal();
  • new 연산자는 클래스로부터 인스턴스를 생성
    new 연산자는 어떤 클래스의 오브젝트를 새로 하나 생성합니다. 여기서는 새로운 Animal 오브젝트를 생성, new 연산자 뒤에는 실행할 클래스의 생성자가 옴
  • Anumal() 메서드는 Animal 클래스의 생성자
    생성자의 이름은 클래스의 이름과 동일, 생성자는 오브젝트를 생성할 때 실행되며 오브젝트가 생성될 때 어떻게 초기화 할지 정의하기 위해 사용하는 특수한 메서드
    • 따로 클래스 안에 선언하여 생성지 자동으로 초기화 될수있도록 또는 어떤 값이 꼭 들어와야 되는지 설정 가능 -> 안해주면 기본 생성자가 암시적으로 생성
    public Animal(초기화 할 값)
    {
    	내용
    }

정리 : new Animal();은 '새로운 Animal 오브젝트(인스턴스)를 탄생시켜라!'

Animal tom = new Animal();

생성된 Animal 오브젝트는 변수 name과 sound를 가짐
-접근법

tom.name = "톰";
tom.sound = "냐옹";


주의사항



5.2.4 멤버와 접근 제한자

public class Animal
{
	// 동물에 대한 변수
    public string name;
    public string sound;
	
    //울음소리를 재생하는 메서드
    public void PlaySound()
    {
        Debug.Log(name + " : "+ sound);
    }

}

클래스의 맴버

어떤 클래스에 속하며, 해당 클래스의 데이터와 행위를 표현하는 요소를 멤버라고 한다
즉 Animal 클래스에 속한 name과 sound, 그리고 PlaySound() 메서드가 Animal의 멤버

클래스의 필드

클래스의 멤버 중에서 변수를 필드라고 부른다
즉 Animal 클래스에 속한 name과 sound가 Animal 클래스의 필드

접근 제한자

  • public : 클래스 외부에서 멤버에 접근 가능
  • private : 클래스 내부에서만 멤버에 접근 가능
  • protected : 클래스 내부와 파생 클래스에서만 멤버에 접근 가능
    기본 private로 선언됨

5.2 참조타입

클래스로 만든 변수는 참조(reference)타입이다.
참조 타입의 변수는 실체화된 오브젝트가 아니고 참조값을 가진 변수이다

  • 참조값 : 메모리 주소값 그 자체는 아님, 참조값은 C# 프로그램을 구동하는 CLR의 인덱스 테이블에 의해 메모리 주소와 대응되는 값
    즉 Animal 타입의 tom 변수는 스택(Stack)에 생성되며(일반 변수들이나 함수들이 여기에 생성됨) 힙(Heap)에 생성되어 있는 Animal오브젝트로 접근하는 참조값을 갖고있다.

5.3.1 두 마리의 동물 오브젝트

Zoo C# Script

 void Start()
    {
        Animal tom = new Animal();
        tom.name = "톰";
        tom.sound = "냐옹!";

        Animal jerry = new Animal();
        jerry.name = "제리";
        jerry.sound = "찍찍!";

        tom.PlaySound();
        jerry.PlaySound();
    }


결과

현재까지의 요약

  • 클래스는 오브젝트를 생성하는 틀
  • new를 사용하여 클래스로부터 오브젝트를 생성함
  • 한 클래스로 여러개의 오브젝트를 만들수 있음

5.3.2 참조값 변경하기

 void Start()
    {
        Animal tom = new Animal();
        tom.name = "톰";
        tom.sound = "냐옹!";

        Animal jerry = new Animal();
        jerry.name = "제리";
        jerry.sound = "찍찍!";

        jerry = tom;
        jerry.name = "미키";

        tom.PlaySound();
        jerry.PlaySound();
    }

예상되는 결과

하지만 실제 결과

5.3.3 참조 타입의 동작

jerry = tom;

클래스는 참조타입으로 값(Value)타입처럼 대입을 통해 실제 오브젝트가 복사되는 것이 아니라 tom에 들어있는 참조값이 jerry변수로 복사된다.
jerry변수를 통해 접근하면 tom 오브젝트로 접근하게 된다.

jerry.name = "미키";


jerry의 원래의 오브젝트는 접근방법을 잃었다.

이렇게 접근방법을 잃은 오브젝트는 실상 존재하지 않는 것과 동일
이런 오브젝트는 C#의 가비지 컬렉터(Garbage Collector)가 틈틈이 자동으로 파괴하여 메모리 누수를 방지

5.3.5 하나의 실체와 여러 개의 참조 변수

참조 타입은 한 사람을 다양하게 부르는 별명과 같다(모든 별명이 가리키는 실체는 하나)

구조체(Struct)타입을 제외하면 우리가 사용할 대부분의 변수는 참조 타입으로 동작

0개의 댓글