C#/이것이 C#이다

[C# 기초강의] Ch 05. 흐름 제어

냠냠쿠 2023. 8. 9. 13:22
728x90

https://www.youtube.com/watch?v=GcYz5Pv6Joc&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=6

📌 흐름제어란?

  • 코드의 실행 순서를 결정하는 것

◾ 여러 흐름으로 분기하기

1. 분기란?

  • 흐름을 여러갈래로 나누는 것
    → 프로그램은 한번에 하나의 갈래만 실행 가능


#### 2. if문 - 조건을 만족하는 경우에만 분기 수행

3. switch문

  • 입력식/값이 어떤 사례(case)와 매치 되는지 평가하여 분기 수행
  • 분기 수행 후 break문을 이용하여 switch문 탈출

4. switch식

  • 분기를 거쳐 결과를 내놓는 식
  • switch문과 동일하게 switch 키워드 이용
    case와 break 필요 없음
//switch 식
string grade = score switch 
{
 90 >= "a",
 80 >= "b",
 70 >= "c",
 ...
}

 

◾ 흐름 반복

1. 반복이란

  • 특정 구간의 제어 흐름을 반복 수행

2. while문

  • 조건을 만족하는 동안 반복 수행

3. do while

  • 코드 먼저 실행 후 조건을 평가하여 반복 수행

4. for

  • 조건을 만족하는 동안 반복 수행


### ◾ 흐름 점프 #### 1. 점프 - 흐름을 특정 위치로 이동

2. break

  • 반복문이나 switch문 실행을 중단

3. continue

  • 반복을 건너뛰어 반복을 수행 (반복문이 중단 되지 않음)

4. goto

  • 지정한 레이블로 제어를 이동
console.WriteLine("A");

if( 조건1) 

console.WriteLine("B");

레이블 1:
console.WriteLine("C");

5. return

6. throw

◾ 패턴 매칭

  • 식이 특정 패턴(형태)와 일치하는지 검사
  • 분기문을 간결하게 만들어 줌

1. 선언 패턴

  • 주어진 식이 특정 형식(int, string 등)과 일치하는지 평가
object foo ="23";

//변수 bar 선언 
if( foo is int bar ) 
{
	Console.WriteLine(bar);
}

2. 형식 패턴

  • 선언 패턴과 비슷한 방식으로 동작
    단, 변수 생성 없이 형식 일치 여부만 확인
object foo =23 ;

//foo가 int형식인지 판단
if( foo is int ) 
{
	Console.WriteLine(foo);
}

3. 상수 패턴

  • 식이 특정 상수와 일치하는지 검사
var GetCountryCode = (string nation) => nationswitch
{
	"KR" => 82,
    "US" => 1,
    "UK" => 44,
    _ => throw new ArgumentExcetion("Not supported code");
}

//foo가 int형식인지 판단
if( foo is int ) 
{
	Console.WriteLine(foo);
}

4. 프로퍼티 패턴

  • 식의 속성이나 필드가 패턴과 일치하는지 검사
class Car
{
	public string Model (get; set;}
    public DataTime producedAt { get; set }
}

static string GetNickname (Car car) 
{
  var GenarateMessage = ( Car car, String nickname ) =>
  	$"|car.Model} produced in {car.produced. year } is {nickname}";
    
    if( car is Car { Model : "Mustang". ProductedAt.Year: 1967})
    	return GenerateMessage (car, "Fastback");
    if( car is Car { Model : "Mustang". ProductedAt.Year: 1976})
    	return GenerateMessage (car, "Cobra II ");
     else 
     	return GenerateMessage (car, "Unknown");
        
}

5. 관계패턴

  • 관계 연산자를 이용하여 입력받은 식을 상수와 비교
static string GerGrade (double score) => score switch 
{
  < 60 => "F",
  >= 60 and < 70 => "D"
  ...
  _ => "A",
};

6. 논리패턴

  • 복수의 패턴을 패턴 논리 연산자 (and, or, not)로 조합
...

  OrderItem { Amount : 0 } or OrderItem {Price : 0}
  	=> 0.0 ,
  OrderItem { Amount : >= 100 } or OrderItem {Price : 0?= 10_000}  
    => orderItem.Amount * orderItem.Price * 0.8,
  
...

7. 괄호 패턴

  • 괄호로 패턴을 감싼다
odject age = 30;
if (age is (int and > 19 ))
	console.WriteLine("Major");

8. 위치 패턴

  • 식의 결고를 분해하고 분해된 값들이 내장된 복수의 패턴과의 일치여부를 검사
  • 내정되는 패턴에는 모든 패턴 사용 가능
Tuple<String, int> itemPrice = new Tuple<string, int> ("espresso", 3000);

if( itemPrice is ("espresso", <5000))
{
	Console.WriteLine("This espresso");
}

9. var 패턴

  • null을 포함한 모든 식의 패턴 매칭을 성공시키고 그 식의 결과를 변수에 할당
  • 식의 결과를 임시 변수에 할당한 뒤 추가 연산 수행시 유용하게 사용 할 수 있다.
//평균이 60점 이상인 경우만 Pass

var IsPassed = 
	(int[] scores) => scores.Son() / scores.Length is var average
    && average >= 60;
    
    ...

10. 무시 패턴

  • var 패턴처럼 모든 식과 패턴 일치 검사를 성공
  • is식에서는 사용 불가
  • switch 식에서만 사용 가능

var GetCountryCode = (string nation) => nation switch
{
	"KR" => 82.
    "US" => 1,
    ...
    
    //무시 패턴 매칭 
	_ => throw new ArumentExeption ("Not supported Code")
    
    ...

11. 목록 패턴

  • 배열이나 리스트가 패턴의 시퀀스가 일치하는지 검사
  • 패턴의 시퀀스는 대괄호 사이에 패턴 목록을 입력하여 생성

var match = (int[] array) => array is [int, >10, _];
728x90