53
C# 04 장 . 장장장장 장장장장

04 장 . 제어문과 예외처리

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: 04 장 .  제어문과 예외처리

C#

04 장 . 제어문과 예외처리

Page 2: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

2 / 31

제어문의 종류와 쓰임새를 이해한다

조건문을 사용하여 문장을 작성한다

반복문을 사용하여 문장을 작성한다

점프문을 사용하여 문장을 작성한다

예외 처리를 이해하고 적절한 예외 처리를 다루어본다

학습 목표학습 목표

Page 3: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

3 / 31

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

Page 4: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

4 / 31

1. 코드 블록과 제어문의 종류

코드블록 이란

여러 명령문을 논리적으로 결합해야 할 때 중괄호 ({ }) 를 사용하여 명령문 그룹을 만들어

표현한다 . 이러한 명령문 그룹을 코드 블록 (code block) 이라고 한다 .

코드 블록 안에는 변수를 선언할 수 있고 다른 코드 블록을 포함할 수도 있다

Page 5: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

5 / 31

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 는 위의 블럭안에서 사용되고 소멸됨 } }}

Page 6: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

6 / 31

1. 코드 블록과 제어문의 종류

제어문의 종류

제어문이란 프로그램을 실행할 때는 논리적인 흐름이 필요한데 , 이러한 문장의 논리적인

흐름을 통제해 주는 것 . 제어문은 성격에 따라 조건문 , 반복문 , 그리고 점프문으로 구분할

수 있다

Page 7: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

7 / 31

2 조건문

조건문은 조건식의 값에 따라 각각에 해당되는 명령문을 수행한다 . 조건문에는 if 문과

switch 문이 있다

• If ~ Else 문

-if 문은 조건식에 따라 각각에 해당하는 명령문을 실행한다

if( 조건식 )

명령문 1 ; // 조건식이 참일 때 실행

else

명령문 2 ; // 조건식이 거짓일 때 실행

Page 8: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

8 / 31

• If ~ Else 문의 순서도

if( 조건식 )

명령문 1 ; // 조건식이 참일 때 실행 else

명령문 2 ; // 조건식이 거짓일 때 실행

2 조건문

Page 9: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

9 / 31

• 다중 if 문

if (point >=0 && point <=100){

        if (point >50)

                result = “Pass”;

}

else{

        Console.WriteLine(“에러 : 범위를 벗어났습니다 .”);

}

If 가 여러 번 쓰일 경우는 코드블록 {} 을 이용하여 , 조건식의 참 / 거짓시의 실행문을

명확히 한다 .

2 조건문

Page 10: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

10 / 31

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(" 성인만 입장이 가능합니다 !"); } } }}

Page 11: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

11 / 31

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); } }}

Page 12: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

12 / 31

• Switch 문

switch( 조건변수 ){

case 값 1 :         // 조건변수의 값이 값 1 과 일치할 때 실행 명령문 1 ;                break ; ….… .case 값 n :         // 조건변수의 값이 값 n 과 일치할 때 실행 명령문 n ;         break;

default :         // 어떠한 값도 만족하지 않을 때 실행 명령문 z ;         break; }

2 조건문

Page 13: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

13 / 31

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; } } }}

Page 14: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

14 / 31

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; } } }}

Page 15: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

15 / 31

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; } } }}

Page 16: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

16 / 31

3 반복문

While 문

while 문은 조건식을 만족하는 동안 , 반복적으로 명령문을 실행한다 .

조건식이 false 가 되야지만 , while{} 구문을 빠져 나간다

while ( 조건식 ) {

명령문 1 ;

명령문 2 ;

        …

명령문 n ;

}

Page 17: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

17 / 31

3 반복문

using System;

namespace While_Statement{ class While_Statement { static void Main(string[] args) { int i = 0;

while (i < 10) { Console.Write("{0} ", i); i++; }

Console.WriteLine(); } }}

while 문 예제

Page 18: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

18 / 31

3 반복문

Do While 문

Do While 문은 명령문을 먼저 실행한 후에 조건을 검색해야 하는 경우에 사용한다

do {

         명령문 1 ;

명령문 2 ;

        …

명령문 n ;

} while ( 조건식 ) ;

Page 19: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

19 / 31

3 반복문

using System;

namespace DoWhile_Statement{ class DoWhile_Statement { static void Main(string[] args) { int i = 0;

do { Console.Write("{0} ", i); i++; } while (i < 10);

Console.WriteLine(); } }}

앞의 예제를 do … while 문으로 수정한 예제

Page 20: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

20 / 31

3 반복문

for 문while 문과 do … while 문이 조건에 따라 반복 수행 한다면 for 문은 반복 회수가

먼저

결정되었을 때 사용한다• for 문 문법

for( 초기값 ; 조건식 ; 증

감 ){

명령문 1 ;

명령문 2 ;

        …

명령문 n ;

}

Page 21: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

21 / 31

3 반복문

using System;

namespace While_Statement{ class While_Statement { static void Main(string[] args) { int i = 0;

while (i < 10) { Console.Write("{0} ", i); i++; }

Console.WriteLine(); } }}

앞의 예제를 for 문으로 수정한 예제

Page 22: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

22 / 31

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); } }}

Page 23: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

23 / 31

3 반복문

같은 코드 블록 내에 I 변수 2 번 선언

using System;

namespace For_Statement3{ class For_Statement3 { static void Main(string[] args) { int i;

for (int i = 0; i < 10; i++) { // 에러 : 이미 변수 i 가 선언되었다 . Console.Write("{0} ", i); } } }}

Page 24: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

24 / 31

3 반복문

foreach 문

일련의 데이터를 하나의 객체에 저장하고자 할 때 배열이나 컬렉션 객체를 이용한다 .

foreach 문은 이런 배열과 컬렉션 객체 내의 데이터에 순차적으로 접근할 때 사용된다

Page 25: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

25 / 31

3 반복문

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(); }}

foreach 문 예제

Page 26: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

26 / 31

goto 문

goto 문은 프로그램 실행의 제어권을 이동 시킨다 .

goto 문이 지시하는 레이블은 반드시 존재해야 하고 goto 문이 접근 가능한 위치여야

한다 . goto 문은 사용된 곳보다 상위 코드 블록으로는 제어권을 이동 할 수 있지만

하위 코드 블록으로는 제어권을 이동할 수 없다 . goto 문을 사용하면 자칫 프로그램의

흐름을 혼란스럽게 만들 수 있기 때문에 switch 문 외에는 사용을 자제하는 편이 좋다 .

4 점프문

Break, continue 문

break 문의 역할은 반복문의 코드 블록밖으로 제어권이 나오게 하는 것이다 . 이와

비슷하지만 continue 문은 제어권을 반복문의 조건식으로 이동시킨다 . 문장에서

break 문을 만나면 반복문 (while, do ... while, for, foreach 문 ) 이나 switch 문은

실행을 멈춘다 . 이에 반해 continue 문을 만나면 반복문의 조건식을 다시 조사하여

실행여부를 결정한다 .

Page 27: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

27 / 31

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(); } }}

Page 28: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

28 / 31

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(); } }}

Page 29: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

29 / 31

5. 예외처리

Try/catch 문

프로그램이 실행 중에 에러가 나거나 멈출 수 있는데 , 이러한 현상을 통틀어 예외현상

(Exception) 이라고 함

예외현상을 사전에 방지하기 위해 예외현상이 발생가능한 지점에 try/catch 문을 적용 한다

Page 30: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

30 / 31

5. 예외처리 Try/catch 문 문법

try

{

         예외처리가 필요한 구문

}

catch( 예외종류 )

{

예외현상 발생 시 실행할 명령

}

finally()

{

예외 현상이 발생하는지에 상관없이 항상 실행하는 명령

}

Page 31: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

31 / 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 문 예제

Page 32: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

32 / 31

5 예외처리

보충 자료• 예외 : 프로그램의 정상적인 흐름을 벗어나게 만드는

잘못된 조건이나 상태• 예 ) 읽을 파일이 없거나 , 잘못된 자료 입력• 예외에 대한 근본적인 처리 방법은 없다 .

• 전통적인 예외 처리 방법 : 조건문 이용• 문제점 : 실제 작업 코드와 예외 처리 작업 코드가 섞여

있으므로 가독성이 떨어진다 .• 조건문이 많아지면 최초 호출한 함수로 리턴 값을 넘기기

위해서 추가적인 문장이 필요할 수도 있다 .

Page 33: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

33 / 31

5 예외처리 ( 보충자료 )

• try : 예외가 발생할 만한 블록을 지정하며 이블록 안에 코드를 작성한다 . 지정한 블록 안에서 예외가 발생하면 try 다음에 이어지는 catch 로 점프하여 예외를 처리한다 . 예외가 발생하지 않으면 catch 를 무시하고 다음 명령을 실행한다 .

• catch : try 에서 발생한 예외를 처리하는 블록이다 . 발생한 예외 객체를 인수로 전달받으며 예외의 종류별로 여러 개의 catch 블록이 올 수 있다 . try 블록에서 발생한 예외의 타입에 따라 적절한 catch 블록이 선택된다 . 예외를 처리할 필요가 없으면 생략할 수도 있다 .

• finally : 예외 발생 여부와 상관없이 반드시 처리해야 하는 블록이다 . 예외가 발생해도 호출되며 그렇지 않아도 호출된다 . 중요한 리소스 해제등

예외 처리의 키

Page 34: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

34 / 31

5 예외처리 ( 보충자료 )

예제 1 try 이용

using System;

class CSTest{ static int[] ar = { 1, 2, 3, 4, 5 }; static int idx = 8; static void Main() { try { Console.WriteLine(ar[idx]); } catch (IndexOutOfRangeException e) { Console.WriteLine(e.Message); } }}

예외를 처리했기 때문에 메시지만 출력되고 다운되지는 않는다 .

Page 35: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

35 / 31

5 예외처리 ( 보충자료 )

예제 2 if 문 이용

using System;

class CSTest{ static int[] ar = { 1, 2, 3, 4, 5 }; static int idx = 8; static void Main() { if(idx>0 && idx < ar.Length) { Console.WriteLine(ar[idx]); } else { Console.WriteLine(" 첨자가 틀렷어 "); } }}

조건문 처리시 한계가 많다 .다음 예제

Page 36: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

36 / 31

5 예외처리 ( 보충자료 )

예제 3 : nested 방법으로 메소드를 호출using System;

class CSTest{ static int[] ar = { 1, 2, 3, 4, 5 }; static int idx = 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 를 실행시킨다 .

조건문으로 처리시 추가적인 리턴값이 필요

Page 37: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

37 / 31

5 예외처리 ( 보충자료 )

예제 3 : nested 방법으로 메소드를 호출 (if 문 )

using System;

class CSTest{ static int[] ar = { 1, 2, 3, 4, 5 }; static int idx = 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(" 첨자가 틀렷어 "); } } }

1. 리턴 타입 bool 로 변경2. 호출 단계가 많아지면 사용하기 어려움

3. 예외처리 구문 (try 사용 ) 은 컴파일러가 이전 단계를 찾아 점프 하도록 코드를 생성하므로 단계가 아무리 깊어도 상관없다 .

중간 단계의 메서드에서 생성한 지역변수들로 모두 자동으로 해제됨 ( 스택 풀기 )

Page 38: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

38 / 31

5 예외처리 ( 보충자료 )

예외 객체

닷넷의 예외 들은 모두 System.Exception 으로부터 파생되며 , 발생원인에 따라서 2 가지 종류로 분류된다 .

SystemException 은 닷넷이 정의하는 일반적이 예외들이며 , 닷넷 런타임에서 실행 중에 이 예외들을 일으킨다 .

ApplicationException 은 응용 프로그램이 정의하는 고유의 예외이며 사용자가 직접 예외 클래스를 정의할 때 기반 클래스로 사용된다 .

Page 39: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

39 / 31

5 예외처리 ( 보충자료 )

예외 클래스

예외 클래스 설명IndexOutOfRangeExcep-tion

배열의 첨자가 유효하지 않다 .

DivideByZeroException 0 으로 나누기를 하였다 .FormatException 실인수와 형식 인수의 형식이 일치하지 않는다 .NullReferenceException null 인 객체를 참조했다 .InvalidCastException 캐스팅이 맞지 않다 .OutOfMemoryException 메모리가 부족하다StackOverflowException 스택이 가득 찼다 .OverflowException 산술 , 변환 연산 중에 변수의 범위를 벗어났다 .

Page 40: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

40 / 31

5 예외처리 ( 보충자료 )

프로퍼티

프로퍼티 타입 설병Message string 예외를 설명하는 문자열이다 . 원인 및 대책 등에

가급적 상세한 메시지를 제공해야 한다 . 보통 생성자에서 초기화 한다 .

HelpLink string 예외와 관련된 도움말의 위치를 설명한다 . 파일이거나 또는 웹사이트의 링크이다 .

Source string 오류를 발생시킨 주체의 이름이다 . 응용 프로그램이나 개체의 이름 또는 어셈블리의 이름이 리턴된다 .

TargetSite Method-Base

예외를 일으킨 메서드를 조사한다

HResult int COM 클라이언트에게 전달하기 위한 에러 코드StackTrace string 예외가 발생한 시점의 스택 프레임 정보이다 .

호출된 메서드의 목록을 가지며 스택 추적에 사용된다 .

InnerExcep-tion

Exception 현재 예외를 발생시킨 이전 예외 객체

Page 41: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

41 / 31

프로퍼티 이용한 예외 처리 예

using System;

class CSTest{ static int[] ar = { 1, 2, 3, 4, 5 }; static int idx = 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); } }}

인덱스가 배열 범위를 벗어났습니다 .ConsoleApplication4Void Method1() 위치 : CSTest.Method1() 파일 C:\Csharp\Chap12\Project3\ConsoleApplication4\Con-soleApplication4\Program.cs:줄 9 위치 : CSTest.Main() 파일 C:\Csharp\Chap12\Project3\ConsoleApplication4\Con-soleApplication4\Program.cs:줄 15계속하려면 아무 키나 누르십시오 . . .

Page 42: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

42 / 31

MSDN 의 예외 관련 문서 내용 (Convert.ToInt32 메서드 (String)) 2 가지 예외

* Convert.ToInt32(Double) 은 오버플로우 예외만 표기 되어 있다 .

Page 43: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

43 / 31

MSDN 의 예외 관련 문서 내용 (Convert.ToInt32 메서드 (Double)) 1 가지 예외

항상 안전한 동작을 하기 위해서는 호출문을 try 로 둘러싸고 발생 가능한 모든 예외에 대해 catch 문을 나열해 놓아야 한다 .단 , 입력값의 포맷이 정확하고 오버플로우가 발생할 가능성이 전혀 없으면 처리를 생략한다 .

Page 44: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

44 / 31

throw 문

라이브러리의 메서드 실행 중에 예외가 발생하면 개발자가 직접 예외 객체를 생성하여 던질 수 있다 .

던져진 예외는 이어지는 catch 문 또는 가장 가까운 catch문에서 받아 처리가 된다 .

Page 45: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

45 / 31

using System;

class CSTest{ static void AddKim(string Kim) { if (Kim[0] != '김 ') { throw new FormatException("김가만 등록할 수 있다 ."); } Console.WriteLine(Kim + " 등록 완료 "); } static void Main() {

try { AddKim("김서방 "); AddKim(" 오서방 "); }

catch (FormatException e) { Console.WriteLine(e.Message); } }}

회원을 추가하는 메서드에서 throw 사용

생성자를 이용하여 예외 발생 이유를 설명하는 문자열을 전달

Page 46: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

46 / 31

using System;

class NotKimException : ApplicationException{ public NotKimException(string message) : base(message) { } public string ErrorName;}

class CSTest{ static void AddKim(string Kim) { if (Kim[0] != '김 ') { NotKimException NotKim = 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] + " 가는 등록안됨 "); } }}

상세한 예외 설명 추가

* 상속과 멤버 추가 이용

Page 47: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

47 / 31

다중 예외 처리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 개의 예외 발생 가능 예제

Page 48: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

48 / 31

다중 예외 처리의 순서 ( 위에서 아래로 )

using System;

class CSTest{ static void Main() { try { int i = 0; int k = 5 / i; } catch (DivideByZeroException e) { Console.WriteLine("0 으로 나누지 마십시오 . : " + e.Message); } catch (Exception e) { Console.WriteLine(e.Message); } catch { Console.WriteLine(" 이유는 모르겠지만 하옇든 잘못되었습니다 ."); } }}

Page 49: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

49 / 31

중첩 예외 처리 예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); } }}

Page 50: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

50 / 31

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

Page 51: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

51 / 31

요약

• 프로그램의 흐름을 통제하는 제어문의 성격에 따라 조건문 (if 문 ,

switch 문 ), 반복문 (while 문 , do…while 문 , for 문 , foreach

문 ) 과 점프문 (break 문 , continue 문 , goto 문 ) 이 있다 .

• 조건문은 조건식 또는 조건 값에 따라 해당되는 명령문을 실행하는 데

유용하며 , if 문은 조건식을 계산해서 참 , 거짓의 결과에 따라 두 가지

문장 중에 하나를 실행한다 .

• switch 문에 사용되는 수식은 단순한 자료형이거나 string, enum

형이 가능하며 , 수식을 평가한 값은 case 문에 의해서 구분된다 .

Page 52: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

52 / 31

요약

• 반복문은 조건식에 따라 해당 명령문을 반복적으로 수행한다 . 반복할

조건식이 항상 참인 경우에는 무한루프에 빠지기 때문에 탈출 조건을

확인해야 한다 .

• for 문은 반복횟수가 정해져 있는 경우 명령문을 반복 수행한다 .

그리고 foreach 문은 컬렉션이나 배열의 멤버에 접근해서 명령문을

수행한다 .

• while 문은 초기에 조건문을 판단해서 참이면 반복 , 거짓이면 while

문 밖으로 탈출한다 . Do … while 문은 무조건 한번 실행하며 ,

마지막에 조건문을 판단해서 반복과 탈출 여부를 결정한다 .

Page 53: 04 장 .  제어문과 예외처리

c#

04 장 . 제어문과 예외처리

53 / 31

요약

• 점프문은 프로그램 실행의 제어권을 목적에 따라 이동시키는 데

사용한다 . goto 문을 사용하면 자칫 프로그램의 흐름을 혼란스럽게

만들 수 있기 때문에 switch 문 외에는 사용을 자제하는 편이 좋다 .

• 프로그램에서 break 문을 만나면 반복문 (while 문 , do 문 , for

문 , foreach 문 ) 이나 switch 문은 실행을 멈춘다 . 이에 반해

continue 문을 만나면 반복문의 조건식을 다시 조사해서 실행

여부를 결정한다 .

• 예외처리문은 프로그램의 예상치 못한 오류를 방지하는 데 사용하며 ,

try/catch finally 문이 이에 해당한다 .