제 6 장제어 (Control) 6.1 구조적프로그래밍 (Structured Programming) 6.2 예외 (Exceptions) Reading Chap. 7 숙대창병모 1
6.1 구조적프로그래밍 숙대창병모 2
Fortran 제어구조 10 IF (X.GT. 0.000001) GO TO 20 11 X = -X IF (X.LT. 0.000001) GO TO 50 20 IF (X*Y.LT. 0.00001) GO TO 30 X = X-Y-Y 30 X = X+Y... 50 CONTINUE X = A Y = B-A GO TO 11 Similar structure may occur in assembly code 숙대창병모 3
역사적논쟁 Dijkstra, Goto Statement Considered Harmful Letter to Editor, C ACM, March 1968 Knuth, Structured Prog. with go to Statements You can use goto, but do so in structured way Continued discussion Welch, GOTO (Considered Harmful) n, n is Odd General questions Do syntactic rules force good programming style? Can they help? 숙대창병모 4
구조적프로그래밍 Standard constructs that structure jumps 시작과끝나는지점이일정하다. 언어 S if E then S else S while E do S let t x = E in S end fun t f(t x) : S Modern programming style Group code in logical blocks Avoid explicit jumps except for function return Cannot jump into middle of block or function body 숙대창병모 5
Expression E Expression vs. Statement Statement S if expression vs. if statement if E then S else S e1? e2 : e3 숙대창병모 6
Syntactic sugar do S while (E) for (e1; e2; e3) S switch (E) { case a : S; ; break; case b : S; ; break; case c : S; ; break; 숙대창병모 7
6.2 예외 (Exceptions) 숙대창병모 8
예외 (Exception) 예외 ( 상황 ) 심각하지않은에러혹은비정상적상황 예외발생시계속수행할수있도록처리해야한다 발생된예외를처리하지못하면프로그램종료 예외에대한적절한처리 안전한프로그램실행을위해매우중요하다. 따라서최신언어들은예외관련기능을제공한다. Java, C++, Standard ML, 필요한예외관련구문 raise or throw exception( 예외발생 ) 을위한식혹은문장 Exception handler( 예외처리 ) 를위한문장 숙대창병모 9
언어 S 에예외추가 언어 S 의예외 예외발생및예외처리기능 S throw E try S catch (int x) S throw E 예외를발생시킨다. E의값은예외의종류를나타낸다. 발생된예외를처리하지못하면프로그램은종료한다. try S catch (int x) S try 블록에서예외가발생하면잡아서처리한다. 예외가발생하지않으면다음문장을실행 숙대창병모 10
예외예제 Factorial1 Factorial2 let int x=0, int y=1 in read x; if x < 0 then throw -1 else while x!= 0 do (y = y * x; x = x - 1); print y end let int x=0, int y=1 in read x; try if x < 0 then throw -1 else ( while x!= 0 do (y = y * x; x = x - 1); print y ) catch (int e) print e end 숙대창병모 11
실습 #5 언어 S 에예외처리기능을추가하고 이를인터프리터에서구현한다. 문법 S throw E 구현 try S catch (int x) S try 블록내에서 throw 문에의해예외가발생하면그이후문장은 catch 절을만날때까지 skip 한다. How? catch 절에서예외처리후에는정상적으로진행한다. try 블록없이 throw 한경우는? 숙대창병모 12
Java 에서예외선언 자바에서예외타입은클래스로선언 Exception 클래스나서브클래스로부터상속받아정의한다. 예외타입은클래스이다 생성자, 멤버필드, 메소드등을가질수있다. Exception object is a first-class object 일반 object 처럼클래스를이용하여정의되고 일반 object 처럼사용될수있다. 일반 object 와차이점 : throw 될수있다. 숙대창병모 13
예외클래스계층구조 Object Throwable Exception Error checked exceptions User-defined exception classes Runtime Exception ArithmeticException Unchecked exceptions NagativeArraySizeException ArrayIndexOutOfBoundsException 숙대창병모 SecurityException 14
Java 예외클래스예 ArithmeticException 0으로나누는경우에주로발생하는예외상황 RuntimeException으로부터상속받은예외클래스 ArrayIndexOutofBoundsException 배열의크기보다큰원소를접근하려고할때발생되는예외 NegativeArraySizeException 배열의크기가음수로된경우에발생하는예외 NullPointerException 생성되지않은객체를이용해서객체의멤버를접근하는경우에발생하는예외 숙대창병모 15
사용자정의예외클래스예 public class NegativeInputException extends Exception { private String reason= Negative grade ; NegativeInputException( ) { System.out.println(reason + is received ); 숙대창병모 16
예외발생 예외는 throw 문을이용해서발생시킨다 throw exception-object; throws 와는다름 숙대창병모 17
예외처리 예외발생시처리하지않는경우 프로그램은메시지를내고종료한다. 메시지는 call stack trace 를포함한다. main 메쏘드부터호출과정 숙대창병모 18
예외처리 : try-catch 문 Exceptions are caught in try-catch blocks 예외가발생할수있는문장들을 try 문블록에기술한다. 예외가발생하면해당매칭되는 catch 문으로제어가넘어간다. 구문구조 try { catch (E1 x) { catch (En x) { 숙대창병모 19
예외처리 : finally 절 finally 절은옵션 try { catch (E1 x) { catch (En x) { finally { finally 문은예외발생여부에관계없이항상수행된다 숙대창병모 20
예외처리예제 class GradeDist { int newgrade; int[ ] freq = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0 void builddist( ) throws IOException { Scanner scan = new Scanner (System.in); try { while (true) { System.out.println( Please input a grade ); newgrade = scan.nextint( ); if (newgrade < 0) throw new NegativeInputException( ); index = newgrade / 10; freq[index]++; catch(negativeinputexception x) { // 점수분포프린트 숙대창병모 21
예외처리예제 try { freq[index]++; catch (ArrayIndexOutOfBoundsException x) { if (newgrade == 100) freq[9]++; else System.out.println( Error: + newgrade + is out of range ); 숙대창병모 22
예외전파 (Exception Propagation) 처리되지않는예외전파 호출의역순으로처리될때까지전파된다. main() 메소드까지전파된다. main() 에서도처리되지않으면프로그램종료 숙대창병모 23
예외전파 : 예제 public class Propagation_Demo { static public void main (String[] args) { Exception_Scope demo = new Exception_Scope(); System.out.println("program beginning"); demo.level1(); System.out.println("program ending"); // method main // class Propagation_Demo 숙대창병모 24
예외전파 : 예제 class Exception_Scope { public void level3 (int adjustment) { int current = 1; System.out.println("level3 beginning"); current = current / adjustment; System.out.println("level3 ending"); // method level3 public void level2() { System.out.println("level2 beginning"); level3 (0); System.out.println("level2 ending"); // method level2 public void level1() { System.out.println("level1 beginning"); try { level2(); catch (ArithmeticException problem) { System.out.println (problem.getmessage()); problem.printstacktrace(); System.out.println("level1 ending"); // method level1 숙대 // 창병모 class Exception_Scope 25
예외검사 검사예외 (checked exception) 사용자정의예외로컴파일러가처리가능여부를미리검사하는예외 처리되지않는예외는메소드헤더부분에 throws 를이용하여선언되어야한다. 비검사예외 (unchecked exception) RuntimeException로부터상속받는표준런타임예외처리여부를컴파일러가검사하지않는예외 숙대창병모 26
예외명세 처리되지않은검사예외를메소드이름뒤에명세 throws 절이용 메소드 _ 이름 ( ) throws A, B, C {... 숙대창병모 27
컴파일러의예외검사 컴파일 - 시간예외검사 발생가능한예외가처리될수있는지아니면메소드선언시명세 되었는지컴파일 - 시간검사 OOOException must be caught or declared to be thrown. 호출된메소드에서처리되지않는예외 메소드선언에명세된처리되지않는예외정보를이용 숙대창병모 28
예외검사 : 예제 // 발생된예외의전파과정을보인다. public class Propagate2 { void input() throws NegativeInputException { int age; Scanner scan = new Scanner(System.in); System.out.println("input 메소드시작 "); age = scan.nextint( ); if (age < 0) throw new NegativeInputException( ); System.out.println("input 메소드끝 "); void via() throws NegativeInputException { System.out.println("via 메소드시작 "); input(); System.out.println("via 메소드끝 "); 숙대창병모 29
예외검사 : 예제 public static void main(string[] args) { Propagate2 p = new Propagate2(); System.out.println("main 메소드시작 "); try { p.via(); catch (NegativeInputException m) { System.out.println(m); System.out.println("main 메소드끝 "); 숙대창병모 30
요약 Structured Programming Go to considered harmful Exceptions structured jumps dynamic scoping of exception handler 숙대창병모 31