레트로의 유니티 게임 프로그래밍 에센스 : C#으로 배우는 입문부터 4가지 게임
객체지향 : 사람이 현실 세상을 보는 방식에 가깝게 프로그램을 완성하는 것
클래스를 묘사할 (추상화) 대상과 관련된 코드 (변수와 메서드 등)를 묶는 틀
-> 쉽게 말해 붕어빵 틀
물건의 설계도인 클래스와 달리 Object는 실제로 존재하는 물건(실체)
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);
}
}
Zoo C# script
void Start()
{
Animal tom = new Animal();
tom.name = "톰";
tom.sound = "냐옹!";
tom.PlaySound();
}
Animal 오브젝트를 생성하고 그것을 Animal 타입의 변수 tom에 할당
new Animal();
public Animal(초기화 할 값)
{
내용
}
정리 : new Animal();은 '새로운 Animal 오브젝트(인스턴스)를 탄생시켜라!'
Animal tom = new Animal();
생성된 Animal 오브젝트는 변수 name과 sound를 가짐
-접근법
tom.name = "톰";
tom.sound = "냐옹";
주의사항
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 클래스의 필드
클래스로 만든 변수는 참조(reference)타입이다.
참조 타입의 변수는 실체화된 오브젝트가 아니고 참조값을 가진 변수이다
tom
변수는 스택(Stack)에 생성되며(일반 변수들이나 함수들이 여기에 생성됨) 힙(Heap)에 생성되어 있는 Animal오브젝트로 접근하는 참조값을 갖고있다.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();
}
결과
현재까지의 요약
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();
}
예상되는 결과
하지만 실제 결과
jerry = tom;
클래스는 참조타입으로 값(Value)타입처럼 대입을 통해 실제 오브젝트가 복사되는 것이 아니라 tom에 들어있는 참조값이 jerry변수로 복사된다.
jerry변수를 통해 접근하면 tom 오브젝트로 접근하게 된다.
jerry.name = "미키";
jerry의 원래의 오브젝트는 접근방법을 잃었다.
이렇게 접근방법을 잃은 오브젝트는 실상 존재하지 않는 것과 동일
이런 오브젝트는 C#의 가비지 컬렉터(Garbage Collector)가 틈틈이 자동으로 파괴하여 메모리 누수를 방지
참조 타입은 한 사람을 다양하게 부르는 별명과 같다(모든 별명이 가리키는 실체는 하나)
구조체(Struct)타입을 제외하면 우리가 사용할 대부분의 변수는 참조 타입으로 동작