Transcript
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 문이 이에 해당한다 .


Recommended