1 / 53

04 장 . 제어문과 예외처리

C#. 04 장 . 제어문과 예외처리. 학습 목표. 제어문의 종류와 쓰임새를 이해한다 조건문을 사용하여 문장을 작성한다 반복문을 사용하여 문장을 작성한다 점프문을 사용하여 문장을 작성한다 예외 처리를 이해하고 적절한 예외 처리를 다루어본다. 목차. 코드 블록과 제어문의 종류 조건문 반복문 점프문 예외처리. 1. 코드 블록과 제어문의 종류. 코드블록 이란.

Download Presentation

04 장 . 제어문과 예외처리

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C# 04장. 제어문과 예외처리

  2. 학습 목표 • 제어문의 종류와 쓰임새를 이해한다 • 조건문을 사용하여 문장을 작성한다 • 반복문을 사용하여 문장을 작성한다 • 점프문을 사용하여 문장을 작성한다 • 예외 처리를 이해하고 적절한 예외 처리를 다루어본다

  3. 목차 • 코드 블록과 제어문의 종류 • 조건문 • 반복문 • 점프문 • 예외처리

  4. 1. 코드 블록과 제어문의 종류 • 코드블록 이란 여러 명령문을 논리적으로 결합해야 할 때 중괄호 ({ })를 사용하여 명령문 그룹을 만들어 표현한다. 이러한 명령문 그룹을 코드 블록(code block)이라고 한다. 코드 블록 안에는 변수를 선언할 수 있고 다른 코드 블록을 포함할 수도 있다

  5. 1. 코드 블록과 제어문의 종류 using System; namespace Operators { class CodeBlock { static void Main(string[] args) { int outer; { int inner; outer = 5; inner = 10; } outer = 6; inner = 12; //오류 ; inner는 위의 블럭안에서 사용되고 소멸됨 } } }

  6. 1. 코드 블록과 제어문의 종류 • 제어문의 종류 제어문이란 프로그램을 실행할 때는 논리적인 흐름이 필요한데, 이러한 문장의 논리적인 흐름을 통제해 주는 것. 제어문은 성격에 따라 조건문, 반복문, 그리고 점프문으로 구분할 수 있다

  7. 2 조건문 조건문은조건식의 값에 따라 각각에 해당되는 명령문을 수행한다. 조건문에는if문과 switch문이 있다 • If ~ Else 문 • -if 문은 조건식에 따라 각각에 해당하는 명령문을 실행한다 if(조건식) 명령문1 ; // 조건식이 참일 때 실행 else 명령문2 ; // 조건식이 거짓일 때 실행

  8. 2 조건문 • If ~ Else 문의 순서도 if(조건식) 명령문1 ; // 조건식이 참일 때 실행 else 명령문2 ; // 조건식이 거짓일 때 실행

  9. 2 조건문 • 다중 if문 if (point >=0 && point <=100){ if (point >50) result = “Pass”; } else{ Console.WriteLine(“에러:범위를 벗어났습니다.”); } If가 여러 번 쓰일 경우는 코드블록{}을 이용하여, 조건식의 참/거짓시의 실행문을 명확히 한다.

  10. 2 조건문 if 문 예제1 using System; namespace If_Statement { class If_Statement { static void Main(string[] args) { int age; bool login = false; age = 25; // age에 값 할당 if (age > 18) { login = true; Console.WriteLine("당신을 환영합니다"); } else { login = false; Console.WriteLine("성인만 입장이 가능합니다!"); } } } }

  11. 2 조건문 if 문 예제2 using System; namespace If_Statement2 { class If_Statement2 { static void Main(string[] args) { int point; string result; point = 82; // point에 82 값 할당 if (point > 90) { result = "A"; } else if (point > 80) { result = "B"; } else if (point > 70) { result = "C"; } else if (point > 60) { result = "D"; } else { result = "F"; } Console.WriteLine("당신의 점수는 {0}입니다.", point); Console.WriteLine("그리고 학점은 {0}입니다.", result); } } }

  12. 2 조건문 • Switch 문 switch(조건변수){ case 값1 : // 조건변수의 값이 값1과 일치할 때 실행 명령문1 ; break ; …. … . case 값n : // 조건변수의 값이 값n과 일치할 때 실행 명령문n ; break; default : // 어떠한 값도 만족하지 않을 때 실행 명령문z ; break; }

  13. 2 조건문 using System; namespace Switch_Statement { class Switch_Statement { static void Main(string[] args) { int num = 23; switch (num % 5) { case 1: Console.WriteLine("나머지의 값은 1입니다."); break; case 2: Console.WriteLine("나머지의 값은 2입니다."); break; case 3: Console.WriteLine("나머지의 값은 3입니다."); break; case 4: Console.WriteLine("나머지의 값은 4입니다."); break; default: Console.WriteLine("5의 배수입니다."); break; } } } }

  14. 2 조건문 switch문에서 점프문을 사용하지 않은 경우 using System; namespace Switch_Statement2 { class Switch_Statement2 { static void Main(string[] args) { int num = 23; switch (num % 5) { case 1: Console.WriteLine("나머지의 값은 1입니다."); break; case 2: Console.WriteLine("나머지의 값은 2입니다."); break; case 3: Console.WriteLine("나머지의 값은 3입니다."); // 에러 : 모든 case 문의 블록 끝에는 break 문, // return 문, throw 문, goto문 등이 와야 한다. case 4: Console.WriteLine("나머지의 값은 4입니다."); break; default: Console.WriteLine("5의 배수입니다."); break; } } } }

  15. 2 조건문 조건변수에 적절하지 못한 형식을 사용한 경우 using System; namespace Switch_Statement3 { class Switch_Statement3 { static void Main(string[] args) { double number = 3.14; switch (number) // 에러: 조건변수에 double형을 사용할 수 없다. { case 3.14: Console.WriteLine(3.14); break; case 3.15: Console.WriteLine(3.15); break; } } } }

  16. 3 반복문 • While문 while 문은 조건식을 만족하는 동안, 반복적으로 명령문을 실행한다. 조건식이 false가 되야지만, while{}구문을 빠져 나간다 while (조건식) { 명령문1 ; 명령문2 ;         … 명령문n ; }

  17. 3 반복문 while 문 예제 using System; namespace While_Statement { class While_Statement { static void Main(string[] args) { inti = 0; while (i < 10) { Console.Write("{0} ", i); i++; } Console.WriteLine(); } } }

  18. 3 반복문 • Do While문 Do While문은 명령문을 먼저 실행한 후에 조건을 검색해야 하는 경우에 사용한다 do { 명령문1 ; 명령문2 ;         … 명령문n ; } while (조건식) ;

  19. 3 반복문 앞의 예제를 do … while 문으로 수정한 예제 using System; namespace DoWhile_Statement { class DoWhile_Statement { static void Main(string[] args) { inti = 0; do { Console.Write("{0} ", i); i++; } while (i < 10); Console.WriteLine(); } } }

  20. 3 반복문 • for 문 while 문과 do …while문이 조건에 따라 반복 수행 한다면 for문은 반복 회수가 먼저 결정되었을 때 사용한다 • for 문 문법 for(초기값; 조건식; 증감){ 명령문1 ; 명령문2 ;         … 명령문n ; }

  21. 3 반복문 앞의 예제를 for 문으로 수정한 예제 using System; namespace While_Statement { class While_Statement { static void Main(string[] args) { inti = 0; while (i < 10) { Console.Write("{0} ", i); i++; } Console.WriteLine(); } } }

  22. 3 반복문 블록 밖에서 블록 내의 i변수 사용 using System; namespace For_Statement2 { class For_Statement2 { static void Main(string[] args) { for (int i = 0; i < 10; i++) { Console.WriteLine("{0} ", i); } // 에러 : 변수i는 for 문 안에서만 유효하다. Console.WriteLine(i); } } }

  23. 3 반복문 같은 코드 블록 내에 I 변수 2번 선언 using System; namespace For_Statement3 { class For_Statement3 { static void Main(string[] args) { inti; for (int i = 0; i < 10; i++) { //에러: 이미 변수i가 선언되었다. Console.Write("{0} ", i); } } } }

  24. 3 반복문 • foreach문 일련의 데이터를 하나의 객체에 저장하고자 할 때 배열이나 컬렉션 객체를 이용한다. foreach 문은 이런 배열과 컬렉션 객체 내의 데이터에 순차적으로 접근할 때 사용된다

  25. 3 반복문 foreach문 예제 using System; using System.Collections; class foreachTest { static void Main(string[] args) { ArrayList numbers = new ArrayList(); for (int i = 0; i < 10; i++) { numbers.Add(i); } // foreach문 foreach (int number in numbers) { Console.Write("{0} ", number); } Console.WriteLine(); } }

  26. 4 점프문 • goto문 goto문은 프로그램 실행의 제어권을이동 시킨다. goto문이 지시하는 레이블은 반드시 존재해야 하고 goto문이 접근 가능한 위치여야 한다. goto문은 사용된 곳보다 상위 코드 블록으로는 제어권을 이동 할 수 있지만 하위 코드 블록으로는 제어권을 이동할 수 없다. goto문을 사용하면 자칫 프로그램의 흐름을 혼란스럽게 만들 수 있기 때문에 switch 문 외에는 사용을 자제하는 편이 좋다. • Break, continue문 break 문의 역할은 반복문의 코드 블록밖으로 제어권이 나오게 하는 것이다. 이와 비슷하지만 continue 문은 제어권을 반복문의 조건식으로 이동시킨다. 문장에서 break 문을 만나면 반복문(while, do ... while, for, foreach 문)이나 switch 문은 실행을 멈춘다. 이에 반해 continue 문을 만나면 반복문의 조건식을 다시 조사하여 실행여부를 결정한다.

  27. 4 점프문 continue 문 예제 using System; namespace Continue_Statement { class Continue_Statement { static void Main(string[] args) { for (int i = 0; i < 10; i++) { if (i % 2 == 1) continue; Console.Write("{0} ", i); } Console.WriteLine(); } } }

  28. 4 점프문 break 문 예제 using System; namespace Break_Statement { class Break_Statement { static void Main(string[] args) { for (int i = 1; i < 10; i++) { if (i % 3 == 0) break; Console.Write("{0} ", i); } Console.WriteLine(); } } }

  29. 5. 예외처리 • Try/catch문 프로그램이 실행 중에 에러가 나거나 멈출 수 있는데, 이러한 현상을 통틀어 예외현상(Exception)이라고 함 예외현상을 사전에 방지하기 위해 예외현상이 발생가능한 지점에 try/catch문을 적용 한다

  30. 5. 예외처리 • Try/catch문 문법 try { 예외처리가 필요한 구문 } catch(예외종류) { 예외현상 발생 시 실행할 명령 } finally() { 예외 현상이 발생하는지에 상관없이 항상 실행하는 명령 }

  31. 5 예외처리 using System; namespace TryCatch_Statement { class TryCatch_Statement { static void Main(string[] args) { int a, b; float c = 0; a = int.Parse(Console.ReadLine()); b = int.Parse(Console.ReadLine()); try { c = a / b; } catch (Exception) { Console.WriteLine("변수의 값이 올바르지 않습니다."); Environment.Exit(0); } finally { Console.WriteLine("프로그램이 실행 되었습니다."); } Console.WriteLine("A/B값은 {0}입니다.", c); } } } try/catch finally문 예제

  32. 5 예외처리 보충 자료 • 예외 : 프로그램의 정상적인 흐름을 벗어나게 만드는 잘못된 조건이나 상태 • 예) 읽을 파일이 없거나, 잘못된 자료 입력 • 예외에 대한 근본적인 처리 방법은 없다. • 전통적인 예외 처리 방법 : 조건문 이용 • 문제점 : 실제 작업 코드와 예외 처리 작업 코드가 섞여 있으므로 가독성이 떨어진다. • 조건문이 많아지면 최초 호출한 함수로 리턴 값을 넘기기 위해서 추가적인 문장이 필요할 수도 있다.

  33. 5 예외처리(보충자료) 예외 처리의 키 • try : 예외가 발생할 만한 블록을 지정하며 이블록 안에 코드를 작성한다. 지정한 블록 안에서 예외가 발생하면 try 다음에 이어지는 catch 로 점프하여 예외를 처리한다.예외가 발생하지 않으면 catch 를 무시하고 다음 명령을 실행한다. • catch : try에서 발생한 예외를 처리하는 블록이다. 발생한 예외 객체를 인수로 전달받으며 예외의 종류별로 여러 개의 catch 블록이 올 수 있다. try 블록에서 발생한 예외의 타입에 따라 적절한 catch 블록이 선택된다. 예외를 처리할 필요가 없으면 생략할 수도 있다. • finally : 예외 발생 여부와 상관없이 반드시 처리해야 하는 블록이다. 예외가 발생해도 호출되며 그렇지 않아도 호출된다. 중요한 리소스 해제등

  34. 5 예외처리(보충자료) 예제1 try 이용 using System; class CSTest { static int[] ar = { 1, 2, 3, 4, 5 }; static intidx = 8; static void Main() { try { Console.WriteLine(ar[idx]); } catch (IndexOutOfRangeException e) { Console.WriteLine(e.Message); } } } 예외를 처리했기 때문에 메시지만 출력되고 다운되지는 않는다.

  35. 5 예외처리(보충자료) 예제 2 if 문 이용 using System; class CSTest { static int[] ar = { 1, 2, 3, 4, 5 }; static intidx = 8; static void Main() { if(idx>0 && idx < ar.Length) { Console.WriteLine(ar[idx]); } else { Console.WriteLine("첨자가 틀렷어"); } } } 조건문 처리시 한계가 많다. 다음 예제

  36. 5 예외처리(보충자료) 예제 3 : nested 방법으로 메소드를 호출 using System; class CSTest { static int[] ar = { 1, 2, 3, 4, 5 }; static intidx = 8; static public void Method1() { Method2(); } static public void Method2() { Console.WriteLine(ar[idx]); } static void Main() { try { Method1(); } catch (IndexOutOfRangeException e) { Console.WriteLine(e.Message); } } } Main() -> Method1()->Method2() 메서드를 최초로 호출한 곳으로 돌아간다. 내부에서 예외 발생시 자신을 포함하고 있는 가장 가까운 try 블록을 찾아서 이 블록에 대응되는 catch를 실행시킨다.  조건문으로 처리시 추가적인 리턴값이 필요

  37. 5 예외처리(보충자료) 예제 3 : nested 방법으로 메소드를 호출(if 문) using System; class CSTest { static int[] ar = { 1, 2, 3, 4, 5 }; static intidx = 8; static public bool Method1() { return Method2(); } static public bool Method2() { if (idx > 0 && idx < ar.Length) { Console.WriteLine(ar[idx]); return true; } else { return false; } } static void Main() { if (Method1() == false) { Console.WriteLine("첨자가 틀렷어"); } } } 리턴 타입 bool로 변경 호출 단계가 많아지면 사용하기 어려움 예외처리 구문(try 사용)은 컴파일러가 이전 단계를 찾아 점프 하도록 코드를 생성하므로 단계가 아무리 깊어도 상관없다.중간 단계의 메서드에서 생성한 지역변수들로 모두 자동으로 해제됨(스택 풀기)

  38. 5 예외처리(보충자료) 예외 객체 닷넷의 예외 들은 모두 System.Exception으로부터 파생되며, 발생원인에 따라서 2가지 종류로 분류된다. SystemException은 닷넷이 정의하는 일반적이 예외들이며, 닷넷 런타임에서 실행 중에 이 예외들을 일으킨다. ApplicationException은 응용 프로그램이 정의하는 고유의 예외이며 사용자가 직접 예외 클래스를 정의할 때 기반 클래스로 사용된다.

  39. 5 예외처리(보충자료) 예외 클래스

  40. 5 예외처리(보충자료) 프로퍼티

  41. 프로퍼티 이용한 예외 처리 예 using System; class CSTest { static int[] ar = { 1, 2, 3, 4, 5 }; static intidx = 8; static public void Method1() { Console.WriteLine(ar[idx]); } static void Main() { try { Method1(); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.Source); Console.WriteLine(e.TargetSite); Console.WriteLine(e.StackTrace); } } } 인덱스가 배열 범위를 벗어났습니다. ConsoleApplication4 Void Method1() 위치: CSTest.Method1() 파일 C:\Csharp\Chap12\Project3\ConsoleApplication4\ConsoleApplication4\Program.cs:줄 9 위치: CSTest.Main() 파일 C:\Csharp\Chap12\Project3\ConsoleApplication4\ConsoleApplication4\Program.cs:줄 15 계속하려면 아무 키나 누르십시오 . . .

  42. MSDN의 예외 관련 문서 내용 (Convert.ToInt32 메서드(String))  2 가지 예외 * Convert.ToInt32(Double)은 오버플로우 예외만 표기 되어 있다.

  43. MSDN의 예외 관련 문서 내용 (Convert.ToInt32 메서드(Double))  1 가지 예외 • 항상 안전한 동작을 하기 위해서는 호출문을try 로 둘러싸고 발생 가능한 모든 예외에 대해 catch문을 나열해 놓아야 한다. • 단, 입력값의 포맷이 정확하고 오버플로우가 발생할 가능성이 전혀 없으면 처리를 생략한다.

  44. throw 문 라이브러리의 메서드 실행 중에 예외가 발생하면 개발자가 직접 예외 객체를 생성하여 던질 수 있다. 던져진 예외는 이어지는 catch 문 또는 가장 가까운 catch문에서 받아 처리가 된다.

  45. using System; class CSTest { static void AddKim(string Kim) { if (Kim[0] != '김') { thrownew FormatException("김가만 등록할 수 있다."); } Console.WriteLine(Kim + "등록 완료"); } static void Main() { try { AddKim("김서방"); AddKim("오서방"); } catch(FormatException e) { Console.WriteLine(e.Message); } } } 회원을 추가하는 메서드에서throw 사용 생성자를 이용하여 예외 발생 이유를 설명하는 문자열을 전달

  46. using System; class NotKimException : ApplicationException { public NotKimException(string message) : base(message) { } public string ErrorName; } class CSTest { static void AddKim(string Kim) { if (Kim[0] != '김') { NotKimExceptionNotKim = new NotKimException("김가만 등록할 수 있다."); NotKim.HelpLink = "김가 동호회 규약.txt"; NotKim.Source = "CSTest.cs"; NotKim.ErrorName = Kim; throw NotKim; } Console.WriteLine(Kim + "등록 완료"); } static void Main() { try { AddKim("김서방"); AddKim("오서방"); } catch (NotKimException e) { Console.WriteLine(e.Message + e.ErrorName[0] + "가는 등록안됨"); } } } 상세한 예외 설명 추가 * 상속과 멤버 추가 이용

  47. 다중 예외 처리 using System; class CSTest { static void Main() { int input; int[] ar = { 1, 2, 3, 4, 5 }; int t; for (; ; ) { try { Console.Write("첨자를 입력하시오(끝낼 때 100) : "); input = Convert.ToInt32(Console.ReadLine()); if (input == 100) break; Console.WriteLine("ar[{0}] = {1}", input, ar[input]); t = 8 / input; } catch (IndexOutOfRangeException e) { Console.WriteLine("첨자가 틀렸어 : " + e.Message); } catch (DivideByZeroException e) { Console.WriteLine("0으로 나누지 마 : " + e.Message); } catch (FormatException e) { Console.WriteLine("숫자만 입력해야지 : " + e.Message); } } } } try 아래쪽에 발생 가능한 모든 예외에 대해 catch문을 나열하고 발생한 예외에 따라 각각 다르게 처리한다. 3개의 예외 발생 가능 예제

  48. 다중 예외 처리의 순서(위에서 아래로) using System; class CSTest { static void Main() { try { inti = 0; int k = 5 / i; } catch (DivideByZeroException e) { Console.WriteLine("0으로 나누지 마십시오. : " + e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } catch { Console.WriteLine("이유는 모르겠지만 하옇든 잘못되었습니다."); } } }

  49. 중첩 예외 처리 예 using System; class CSTest { static void Main() { short Price, Num, Total = 0; try { Console.Write("단가를 입력하시오 : "); Price = Convert.ToInt16(Console.ReadLine()); Console.Write("개수를 입력하시오 : "); try { Num = Convert.ToInt16(Console.ReadLine()); checked { Total = (short)(Price * Num); } } catch (OverflowException e) { Console.WriteLine(e.Message); } Console.WriteLine("총 가격은 {0}입니다.", Total); } catch (FormatException e) { Console.WriteLine(e.Message); } } }

  50. 닷넷이 프로그램 전체를 거대한 try 문으로 감싸고 있고 모든 예외에 대해 정보 출력 후 종료하는 식으로 처리한다.

More Related