본문 바로가기
UNITY/C#

C# Statements :: using, yield

by 램플릿 2024. 6. 24.

 

오늘의 공부


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

'UNITY > C#' 카테고리의 다른 글

=> 연산자 (람다 표현식)  (0) 2024.10.21
C# 특수 문자 :: $(문자열 보간)와 @(약어 식별자)  (0) 2024.06.24