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