Unity Chapter 5-5. C# 프로그래밍 [중급] (1/2) : static
카테고리: Unity Lesson 1
태그: C Sharp Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!
Chapter 5. C# 프로그래밍 : 중급 (1/2)
🔔 static 변수, static 함수
- 외부에서 클래스이름.변수이름,클래스이름.함수이름으로 사용, 접근이 가능하다.- ex) Math.sqrt 우리가 이렇게 바로 Math클래스의 sqrt 함수를 사용할 수 있었던 이유는 sqrt가 Math 클래스의 static 함수이기 때문이다.
 
static 변수
- static변수 : 모든 오브젝트가 공유하는 단 하나의 변수.
📜 Dog.cs 스크립트
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dog : MonoBehaviour // class Dog
{
    public string nickName;
    public float weight;
    public void Bark()
    {
        Debug.Log(nickName + ": Bark");
    }
}
- 3개의 오브젝트를 만들어 준 후 📜 Dog.cs를 각각 붙여준다.
- 오브젝트 이름과 슬롯에서 nickName,weight을 다음과 같이 설정해준다.- “Jack (Dog)”
        - nickName= Jack
- weight= 10
 
- “Alen (Dog)”
        - nickName= Alen
- weight= 8
 
- “Nate (Dog)”
        - nickName= Nate
- weight= 2
 
 
- “Jack (Dog)”
        
- 메모리에는 현재 Dog 오브젝트가 3개 있는 상황이며 각각 독립적으로 메모리상에 존재한다.
    - class Dog로- Jack,- Alen,- Nate라고 부리는 3개의 오브젝트를 찍어낸셈.
 
만약 Dog 오브젝트를 세는
count라는 변수를 가지고 있어서 다른 Dog 오브젝트의 정보를 알아야 할땐 어떻게 할 수 있을까?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dog : MonoBehaviour // class Dog
{
    public string nickName;
    public float weight;
    public int count = 0;
    void Awake()
    {
        count = count + 1; // 자기 자신의 수를 더해 줌
    }
    void Start()
    {
        Bark();
    }
    public void Bark()
    {
        Debug.Log("모든 개들의 수 : " + count);
        Debug.Log(nickName + ": Bark");
    }
}
- void Awake()- Start()와 비슷한데 Start()보다 먼저 실행되는 시작 함수다.
        - Start 함수의 이전 및 프리팹의 인스턴스화 직후에 호출
 
- 오브젝트가 생성 되자마자 실행하는 1회 동작 함수
 
- Start()와 비슷한데 Start()보다 먼저 실행되는 시작 함수다.
        
- 위 상태에서 Dog스크립트가 붙은 오브젝트를 3개 만들면 count = 3 이라고 나오는게 아니라 각자 count = 1 이라고 나온다.
    - count변수가 각 오브젝트마다 별개라서- count메모리를 세 오브젝트가 공유하는게 아니기 때문이다.- count 변수를 static으로 선언해주면 이제 이 변수를 모든 Dog 오브젝트들이 동시에 공유할 수 있게 된다.- static으로 선언하게 되면 count변수가 이제 각 오브젝트에 속하는게 아니라- 클래스 변수로서 class Dog에 소속되게 된다.
- 정적 변수라고도 불린다. 처음부터 정적으로 메모리 어딘가에 자리를 차지하고 있기 때문!
 
- 초기화는 최초에 한번만 이루어진다.
 
- count 변수를 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dog : MonoBehaviour // class Dog
{
    public string nickName;
    public float weight;
    public static int count = 0;
    void Awake()
    {
        count = count + 1; // 자기 자신의 수를 더해 줌
    }
    void Start()
    {
        Bark();
    }
    public void Bark()
    {
        Debug.Log("모든 개들의 수 : " + count);
        Debug.Log(nickName + ": Bark");
    }
}
- public staticint count = 0;- 이제 오브젝트들을 생성할 때마다 count 값이 증가하여 차례로 1, 2, 3을 출력할 것이다.
        - 각 오브젝트들이 count를 공유할 수 있게 되었기 때무이다.
 
 
- 이제 오브젝트들을 생성할 때마다 count 값이 증가하여 차례로 1, 2, 3을 출력할 것이다.
        
static 함수
개별 오브젝트와 상관없이 각 오브젝트들이 동시에 사용할 수 있는 함수 static 변수와 비슷하게 static 함수 또한 개별 오브젝트에 종속되지 않는다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dog : MonoBehaviour // class Dog
{
    public string nickName;
    public float weight;
    public static int count = 0;
    void Awake()
    {
        count = count + 1; // 자기 자신의 수를 더해 줌
    }
    void Start()
    {
        Bark();
    }
    public void Bark()
    {
        Debug.Log("모든 개들의 수 : " + count);
        Debug.Log(nickName + ": Bark");
    }
    public static void ShowAnimalType()
    {
        Debug.Log("이 친구는 개입니다.");
    }
}
- public staticvoid ShowAnimalType()- static 함수
 
static 변수와 함수는 개별 오브젝트에 종속되지 않기 때문에 오브젝트 생성 없이 바로 사용할 수도 있다.
📜Test.cs 아무 오브젝트 하나 만들어서 Test.cs를 붙여주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour // class Dog
{
    void Start()
    {
        Debug.Log("모든 개들의 수 : " + Dog.count);
        Dog.ShowAnimalType();
    }
}
- Dog 오브젝트가 없는 상태인데도 바로 클래스이름 + .으로 Dog의 static 변수, static 함수를 사용할 수 있다.- Dog.Count,- Dog.ShowAnimalType()
- 개별 오브젝트에 종속되지 않기 때문
- public Dog Alen; 이렇게 만든 후 Alen.Count 이런식으로 쓰지 않아도 된다.
 
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
 
      
    
댓글 남기기