오늘의 공부
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 |