Java 9장. 인터페이스와 예외처리 public class SumTest { public static void main(String a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두 수를 더하는 부분입니다 System.out.println("두수의 합은 " + sum + "입니다"); }
학습목표 인터페이스의 개념과 사용방법에 관해 학습한다. 인터페이스의 상속과 인터페이스를 통한 형변환을 학습한다. 예외의 개념과 예외 관련 클래스를 학습한다. 두 가지 예외 처리 방법에 관해 학습한다.
목차 section 1 인터페이스의 개요와 인터페이스의 정의 section 2 인터페이스의 사용 6-1 메소드에서 예외 처리 6-2 호출한 메소드에 예외를 넘겨주는 방법
인터페이스(interface) 형식 1 인터페이스의 개요와 인터페이스의 정의 상수와 메소드 선언들의 집합 추상 클래스보다 더욱 완벽한 추상화를 제공 public interface 인터페이스이름 [extends 인터페이스이름, .....] { ..... 상수선언 ..... 메소드선언 } 형식 public interface Sleeper { public long ONE_SECOND = 1000; public long ONE_MINUTE = 60000; public void wakeup(); }
클래스에서 인터페이스를 사용하기 위해 implements 예약어를 사용 2 인터페이스의 사용 클래스에서 인터페이스를 사용하기 위해 implements 예약어를 사용 [public/final/abstract] class 클래스이름 extends 상위 클래스이름 implements 인터페이스 이름[, 인터페이스이름, .....] { … 멤버 변수선언 … 생성자 … 메소드선언 ... 인터페이스에 선언된 모든 메소드를 오버라이딩하여 구현하여야 한다. } 형식
클래스에서 인터페이스를 사용하기 위해 implements 예약어를 사용 2 인터페이스의 사용 클래스에서 인터페이스를 사용하기 위해 implements 예약어를 사용 public interface Sleeper { public long ONE_SECOND = 1000; public long ONE_MINUTE = 60000; public void wakeup(); } public interface Worker { public long WORK_TIME = 8; public void sleep(); public class Man implements Sleeper, Worker { public void wakeup() { System.out.println("빨리 일어나 !!"); public void sleep() { System.out.println("빨리 자 !!"); .......... Man 클래스는 두 개의 인터페이스를 포함하고 있다 인터페이스에서 선언된 메소드는 모두 오버라이딩하여 구현하여야 한다.
실습예제 2 인터페이스의 사용 InterfaceTest1.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 interface IStack { void push(int item); int pop(); } class FixedStack implements IStack { private int stack[]; private int tos; FixedStack(int size) { stack = new int[size]; tos = -1; public void push(int item) { if(tos==stack.length-1) System.out.println("스택이 꽉찼음"); else stack[++tos] = item; 두 개의 메소드를 가진 인터페이스 인터페이스를 포함하는 클래스 인터페이스에서 선언된 메소드 오버라이딩
실습예제 2 인터페이스의 사용 InterfaceTest1.java 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public int pop() { if(tos < 0) { System.out.println("스택이 비었음"); return 0; } else return stack[tos--]; public class InterfaceTest1 { public static void main(String args[]) { FixedStack mystack1 = new FixedStack(10); FixedStack mystack2 = new FixedStack(5); for(int i=0 ; i<10 ; i++) mystack1.push(i); for(int i=0 ; i<5 ; i++) mystack2.push(i); 인터페이스에서 선언된 메소드 오버라이딩
실습예제 2 인터페이스의 사용 InterfaceTest1.java 35 36 37 38 39 40 41 42 43 System.out.println("스택 : mystack1"); for(int i=0 ; i<10 ; i++) System.out.print(mystack1.pop() + " "); System.out.println(); System.out.println("스택 : mystack2"); for(int i=0 ; i<5 ; i++) System.out.print(mystack2.pop() + " "); }
2 인터페이스의 사용 프로그램 설명 00~00 : 스택을 구현하기 위한 인터페이스를 작성. 이 인터페이스를 포함하는 모든 클래스는 반드시 두 개의 메소드(push()와 pop())를 구현하여야 한다. 00~00 : 인터페이스를 포함하는 스택 클래스를 작성하였다. 두 개의 메소드를 오버라이딩하여 구현하였다. 스택은 정수의 배열로 구성하였다. 00~00 : 10개와 5개의 요소를 가진 스택(배열)을 생성하였으며, 각각의 스택에 정수를 저장하고, 저장된 스택으로부터 pop() 메소드를 수행하여 출력하였다.
인터페이스 선언 시 필요에 따라 다른 인터페이스로부터 상속받을 수 있음 3 인터페이스 상속 인터페이스 선언 시 필요에 따라 다른 인터페이스로부터 상속받을 수 있음 public interface 인터페이스이름 extends 인터페이스이름[, 인터페이스이름,....] { .... 상수선언 .... 메소드선언 } 형식
인터페이스 선언 시 필요에 따라 다른 인터페이스로부터 상속받을 수 있음 3 인터페이스 상속 인터페이스 선언 시 필요에 따라 다른 인터페이스로부터 상속받을 수 있음 public interface Sleeper { public long ONE_SECOND = 1000; public long ONE_MINUTE = 60000; public void wakeup(); } public interface Worker { public long WORK_TIME = 8; public void sleep(); public interface People extends Sleeper, Worker { public int MAX = 24; public int MIN = 0; public void work(); public InterfaceClass implements People { ........... public void wakeup() { .......구현 public void sleep() public void worker() 인터페이스의 모든 메소드가 구현되어야 한다 인터페이스의 모든 메소드가 구현되어야 한다 인터페이스의 모든 메소드가 구현되어야 한다
예외 4 예외의 개요 프로그램 실행 중에 발생하는 예기치 않은 사건 class Error { public static void main(String[] args) { x(); } static void x() { y(); static void y() { z(); static void z() { int i = 1; int j = 0; System.out.println(i/j); x() 메소드 호출 y() 메소드 호출 z() 메소드 호출 1을 0으로 나눈다. 예외 발생
JVM의 묵시적인 예외 처리기 4 예외의 개요 예외가 발생하면 예외 객체를 생성 예외가 발생된 메소드에서 Error를 출력 메소드를 호출한 메소드에 예외를 반환 java.lang.ArithmeticException: / by zero at Error.z(Error.java:14) at Error.y(Error.java:9) at Error.x(Error.java:6) at Error.main(Error.java:3) 예외가 발생한 원인(by zero)과 예외와 연관된 클래스
자바에서는 예외 즉 오류도 객체로 취급 5 예외 관련 클래스 예외에 대하여 java.lang 패키지에 예외 관련 클래스를 제공 자바의 모든 예외 관련 클래스는 java.lang.Throwable 클래스의 하위 클래스로 제공
5 예외 관련 클래스 예외 클래스의 계층구조(상속관계) 290 page
입출력을 수행하는 프로그램 6 예외 처리 import java.io.*; public class IOExceptionError { public static void main(String args[]) { FileReader file = new FileReader("a.txt"); int i; while((i = file.read()) != -1) { System.out.print((char)i); } file.close();
6 예외 처리 실행시키면 다음과 같은 오류를 발생
6-1 메소드에서 예외 처리 메소드에서의 예외 처리 형식 6 예외 처리 try { ...... // try 블록 } 6-1 메소드에서 예외 처리 메소드에서의 예외 처리 try { ...... // try 블록 } catch(예외타입1 매개변수 1) { ..... // 예외 처리 블록1 catch(예외타입2 매개변수 2) { ..... // 예외 처리 블록 2 ........ catch(예외타입N 매개변수 N) { ...... // 예외 처리 블록 N finally { ...... // finally블록 형식
6-1 메소드에서 예외 처리 발생되는 예외를 메소드 내에서 직접 처리하기 위한 구문 6 예외 처리 6-1 메소드에서 예외 처리 발생되는 예외를 메소드 내에서 직접 처리하기 위한 구문 try 블록 : 조건 없이 실행되는 문장 catch 블록은 try 블록 바로 다음에 위치 finally 블록은 필요에 따라 선택적으로 사용
6-1 메소드에서 예외 처리 실습예제 6 예외 처리 ExceptionTest1.java 01 02 03 04 05 06 07 6-1 메소드에서 예외 처리 실습예제 ExceptionTest1.java 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 import java.io.*; public class ExceptionTest1 { public static void main(String args[]) { try { FileReader fle = new FileReader("a.txt"); int i; while((i = fle.read()) != -1) System.out.print((char)i); fle.close(); } catch(Exception e) { System.out.println("예외 처리 루틴 : " + e + " 파일이 존재하지 않는다."); 입출력 패키지를 포함하는 문장(11장 설명) try 블록 지정 발생된 예외를 처리
6-1 메소드에서 예외 처리 프로그램 설명 a.txt 파일 없이 실행 6 예외 처리 6-1 메소드에서 예외 처리 프로그램 설명 01 : import문은 클래스를 포함하는 부분으로 입출력 관련 패키지에 속하는 클래스를 포함하는 명령문이다. 12장에서 자세하게 설명한다. 03~10 : 프로그램에서 예외가 발생할 가능성이 있는 부분을 try 블록으로 지정한다. 11~14 : 예외가 발생할 경우 처리하는 문장이다. a.txt 파일 없이 실행 a.txt 파일에 “알기쉽게 해설한 자바를 사랑합니다”를 저장하고 실행
6-2 호출한 메소드에 예외를 넘겨주는 방법 예외를 호출 메소드에 넘겨주는 방법 형식 6 예외 처리 6-2 호출한 메소드에 예외를 넘겨주는 방법 예외를 호출 메소드에 넘겨주는 방법 public void c() throws 예외클래스 [, 예외 클래스, .....] 형식 public static void main(String args[]) throws Exception { ........... } public void admin() throws FileNotFoundException { .......
6-2 호출한 메소드에 예외를 넘겨주는 방법 실습예제 6 예외 처리 ExceptionTest2.java 01 02 03 04 6-2 호출한 메소드에 예외를 넘겨주는 방법 실습예제 ExceptionTest2.java 01 02 03 04 05 06 07 08 09 10 import java.io.*; public class ExceptionTest2 { public static void main(String args[]) throws Exception { FileReader fle = new FileReader("a.txt"); int i; while((i = fle.read()) != -1) System.out.print((char)i); fle.close(); } throws() 절을 이용하여 예외를 JVM에 넘김
6-2 호출한 메소드에 예외를 넘겨주는 방법 프로그램 설명 6 예외 처리 6-2 호출한 메소드에 예외를 넘겨주는 방법 프로그램 설명 03 : 일반적으로 main() 메소드는 JVM에 의해 호출된다. 이 프로그램은 main() 메소드에서 throws 절을 이용하여 Exception 예외를 넘기고 있다. Exception 예외는 일반적인 예외 클래스들의 상위 클래스이다. 이 예외를 지정하면, 그 예외의 하위 클래스와 연관된 예외는 모두 처리할 수 있다. 그 이유는 상위 클래스의 모든 요소들을 하위 클래스에서 모두 가지고 있기 때문이다.
클래스 라이브러리 사용 [Step1] JDK 라이브러리 문서를 다운받는다. 자바 프로그래머가 되기 위한 필수조건 java.sun.com 사이트에 오른쪽 다운로드 부분의 “Java SE”를 선택한다. 두 번째 화면에서 아래쪽의 테이블에서 “Java SE 6 Documentation” 항목의 오른쪽 다운로드 버튼을 선택한다. 298 page
클래스 라이브러리 사용 자바 프로그래머가 되기 위한 필수조건 다음 화면에서 라이선스 동의를 구하는 부분을 선택하면 그다음 화면에서 압축된 문서 파일을 다운받을 수 있다. 299 page
클래스 라이브러리 사용 자바 프로그래머가 되기 위한 필수조건 다운받은 파일을 적당한 곳에 압축을 풀어 사용한다. 압축을 풀면 7개의 디렉터리와 하나의 파일이 나타난다.
클래스 라이브러리 사용 [Step2] JDK 라이브러리의 사용을 위한 참조 자바 프로그래머가 되기 위한 필수조건 특정 라이브러리 클래스를 사용하기 위해서는 클래스 이름과 패키지 이름을 가지고 검색해야 한다. 우선 설치된 디렉터리 중에서 api 디렉터리에 있는 index.html 파일을 웹검색기로 실행시킨다. 300 page
클래스 라이브러리 사용 자바 프로그래머가 되기 위한 필수조건 검색기의 왼쪽 아래 창에는 모든 클래스들이 알파벳 순으로 나열되어 있다. 오른쪽 창에는 패키지별로 클래스를 찾을 수 있도록 제공하고 있다. 원하는 클래스를 찾아 생성자와 메소드를 탐색하여 클래스를 사용한다. 각 클래스에서 제공되는 생성자와 인터페이스, 메소드 등에 관한 자세한 사용방법이 제공되고 있다.
학습정리 인터페이스의 개요와 인터페이스 정의 인터페이스의 사용과 상속 인터페이스는 상수와 메소드 선언들의 집합이다. 인터페이스는 추상 메소드와 상수만으로 구성된 추상 클래스라 할 수 있다. 인터페이스의 개념을 이용하여 다중 상속의 개념을 구현할 수 있다. 인터페이스의 사용과 상속 인터페이스를 포함하려면 implements 예약어를 사용한다. 인터페이스에 선언된 모든 메소드는 오버라이딩하여 구현하여야 한다. 클래스와는 달리 다수 개의 인터페이스를 지정할 수 있다. 인터페이스들은 상속된 계층구조를 이룰 수 있으며, 상속된 인터페이스를 포함하는 클래스는 관련된 모든 메소드를 오버라이딩해야 한다.
학습정리 예외의 개요 예외 관련 클래스 예외 처리 예외란 프로그램 실행 중에 발생하는 예기치 않은 사건을 말한다. JVM은 프로그램 실행 중 예외가 발생하면, 관련된 예외 클래스로부터 객체를 생성하여 예외를 발생시킨 메소드에 전달한다. 예외 관련 클래스 자바는 약 50여 개의 예외 관련 클래스를 제공하고 있다. RuntimeException 클래스와 Error 클래스와 연관된(하위 클래스 포함) 예외는 프로그램에서 처리하지 않는다. 프로그램 처리에 드는 시간과 비용이 크기 때문이다. 자바는 RuntimeException 클래스와 Error 클래스가 아닌 예외들은 명시적인 예외 처리를 요구한다. 예외 처리 자바는 2가지 예외 처리 방법을 제공한다. 한 가지 방법은 try-catch 절을 이용하여 예외가 발생하면, 발생한 메소드 내에서 예외를 처리하는 방법이며, 다른 방법은 발생된 예외를 호출한 메소드에 넘겨주는 방법이다.
9장. 인터페이스와 예외처리 수고하셨습니다. 질문 있습니까?