UNITY/C#

C# Statements :: using, yield

램플릿 2024. 6. 24. 19:39

 

오늘의 공부


using

관리되지 않은 리소스 해제를 위한 매커니즘이 작동하여 using문으로 선언된 변수가 올바르게 폐기됩니다.

using문으로 선언된 변수는 읽기 전용입니다. 재할당하거나 ref 또는 out 매개변수로 전달할 수 없습니다.

using ( var resource = new ~~ )	//컨트롤이 using문의 블록을 벗어나면 인스턴스가 해제됩니다.
{ 
	//use resource ...
	//using문의 블록 내에서 예외가 발생하더라도 인스턴스가 삭제되도록 합니다.
}
//using문을 벗어난 후에 해당 인스턴스를 추가로 사용하면 예외(예:ObjectDisposedException)가 발생합니다.
static IEnumerable<int> LoadNumbers(string filePath)
{
	//지역 변수로 using선언된 경우 선언된 범위 끝에서 삭제됩니다.
    using StreamReader reader = File.OpenText(filePath);
    
    var numbers = new List<int>();
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
    return numbers;
} //end of the scope

 

 

 

 

yield

yield return

데이터 클래스 안에 데이터가 있을 때 Inumeration을 통해 return할 수 있게끔 하기 위해 yield return을 많이 사용합니다.

데이터의 양이 많거나 연속적으로 계속 들어오는 데이터를 처리할 때 사용될 수 있습니다.

 

yield break

반복 종료를 명시적으로 알립니다

 

 

 

반복문 내에서의 yield문 사용

foreach (int i in EvenNumber())
{
	Console.Write(i + " ");
}
// Output : 0 2 4 6 8

IEnumerable<int> EvenNumber()
{
	for (int i=0; i <= 10; i += 2)
    {
    	yield return i;
        Debug.Log("iteration "+i);
	}
}

 

~~이하 chatGPT에게 물어본 내용~~

'yield return'과 'return'의 차이점

return은 메서드 전체의 실행을 종료하고 값을 반환하는 데 사용되고, yield return은 iterator에서 값을 하나씩 반환하고 다음 값 생성을 위한 상태를 유지하는 데 사용됩니다.

따라서, return은 값을 반환한 후 해당 함수를 종료하는데, yield return은 리턴 된 위치를 기억하고 다시 돌아온 후에 그 다음문장을 이어나갑니다. 

    IEnumerator TestCoroutine(float delay)
    {
        yield return new WaitForSeconds(delay);
        //WaitForSeconds(delay) : delay초만큼 기다리기

        //그냥 리턴하면 함수를 빠져나가지만
        //yield를 쓰면 "잠시" 권한을 넘겨줌

        Debug.Log("Test Success");
    }

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(TestCoroutine(5));
    }

 

 

 

return:

  • return은 메서드나 함수에서 값을 반환하고, 해당 메서드의 실행을 종료합니다.
  • 메서드가 호출된 곳으로 값을 반환하고, 메서드 내의 다음 코드를 실행하지 않고 바로 종료됩니다.
  • return은 한 번만 사용할 수 있으며, 메서드의 반환 타입과 일치하는 값을 반환해야 합니다

yield return:

  • yield return은 iterator 또는 enumerator 메서드에서 사용됩니다.
  • yield 키워드를 통해 한 번에 하나씩 값을 반환하도록 하며, iterator의 상태를 유지하고 다음 값을 생성할 수 있게 합니다.
  • yield return은 여러 번 사용할 수 있으며, 반복자가 반환할 값의 시퀀스를 정의할 수 있습니다.
  • 반복자에서는 yield return을 사용하여 값을 생성하고, 호출자는 반복자를 통해 값을 순차적으로 가져올 수 있습니다.

 

'yield break'와 'break'의 차이점

`break`는 반복문에서 나가는 데 사용되고, `yield break`는 iterator를 종료하는 데 사용됩니다.


1. break :
   - `break`은 일반적으로 반복문 (`for`, `foreach`, `while`, `do-while`) 내에서 사용됩니다.
   - 반복문을 강제로 종료하고, 반복문을 빠져나가게 합니다.
   - `switch` 문에서도 사용되며, 특정 case를 실행하고 나서 switch 문을 빠져나가도록 합니다.

   for (int i = 0; i < 10; i++)
   {
       if (i == 5)
       {
           break; // 반복문을 강제로 종료
       }
       Console.WriteLine(i);
   }



2. yield break :
   - `yield break`은 주로 iterator 또는 enumerator 구현에서 사용됩니다.
   - `yield` 키워드를 사용하여 값을 하나씩 생성하는 메서드 (`IEnumerable<T>` 또는 `IEnumerator<T>`를 반환하는 메서드)에서 사용됩니다.
   - `yield break`은 현재 iterator를 종료하고 다음 값을 생성하지 않도록 합니다.

   public IEnumerable<int> CountToFive()
   {
       for (int i = 1; i <= 10; i++)
       {
           if (i > 5)
               yield break; // 현재 iterator 종료
           yield return i; // 값 반환
       }
   }



🎓 yield 가 리턴할수 있는 다양한 요소들

- yield return null // 유니티에서는 연산 수행 FPS 한번 당 1회 가능. 
- yield return new WaitForSeconds(5); //5초만큼 대기
- yield return new WaitUntil(조건) //조건이 참이 될때까지 대기
- yield return new WaitWhile(조건) //조건이 거짓이 될때까지 대기

e.g. yield return new WaitWhile() => (i<10)  {} );



 


참고 자료
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/statements/using
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/statements/yield
https://www.youtube.com/watch?v=VXaEluyEUhI&t=16s