intArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리
반복문의 특징 자바 반복문의 종류 for 문 while 문 do while 문
for 문의 구성 for(초기문; 조건식; 반복후작업) { ..작업문.. } for 키워드 반복 후작업 true false for(초기문; 조건식; 반복후작업) { ..작업문.. } for 키워드 for 문이 실행한 후 오직 한번만 실행되는 초기화 작업 콤마(‘,’)로 구분하여 여러 문장 나열 가능 초기할 일이 없으면 비어둘 수 있음 논리형 변수나 논리 연산만 가능 반복 조건이 true이면 반복 계속, false이면 반복 종료 반복 조건이 true 상수인 경우, 무한 반복 반복 조건이 비어 있으면 true로 간주 반복 작업 문장들의 실행 후 처리 작업 콤마(‘,’)로 구분하여 여러 문장 나열 가능
for문의 실행 과정을 나타내는 순서도 초기문 조건식 작업문 반복 후작업 true false i = 0 i<10 System.out.print(i) for (i = 0; i < 10; i++) { System.out.print(i); } i++
for문의 예시 0에서 9까지 정수 출력 for (i = 0; i < 10; i++) { System.out.print(i); } for (i = 0; i < 10; i++) System.out.print(i); 반복문에 변수 선언 가능 for (int i = 0; i < 10; i++) // 변수 i는 for문을 벗어나서 사용할 수 없음 System.out.print(i); 0에서 100까지의 합 구하기 int sum = 0; for (int i = 0; i <= 100; i++) sum += i; int sum; for (int i = 0, sum=0; i <= 100; i++) sum += i; int sum = 0; for (int i = 100; i >= 0; i--) sum += i;
for문의 특이한 형태 for(초기작업; true; 반복후작업) { // 반복 조건이 true이면 무한 반복 ............ } for(초기작업; ; 반복후작업) { // 반복조건이 비어 있으면 true로 간주, 무한 반복 ............ } // 초기 작업과 반복후작업은 ‘,’로 분리하여 여러 문장 나열 가능 for(i=0; i<10; i++, System.out.println(i)) { ......................... } //for문 내에 변수 선언 for(int i=0; i<10; i++) { // 변수 i는 for문 내에서만 사용 가능 ............ }
예제 3-1 : 1부터 10까지 숫자의 합을 출력 for문을 이용하여 1부터 10까지 덧셈을 표시하고 합을 구하시오. public class ForSample { public static void main (String[] args) { int i, j; for (j=0,i=1; i <= 10; i++) { j += i; System.out.print(i); if(i==10) { System.out.print("="); System.out.print(j); } else System.out.print("+"); 1+2+3+4+5+6+7+8+9+10=55
while 문의 구성 while(조건식) { ..작업문.. } 작업 문 true false while(조건식) { ..작업문.. } 반복 조건이 true이면 반복, false이면 반복 종료 반복 조건이 없으면 컴파일 오류 처음부터 반복조건을 통과한 후 작업문 수행
while문의 실행 과정을 나타내는 순서도 i = 0 i<10 System.out.print(i) i++ true false 조건식 작업 문 true false i = 0; while (i < 10) { System.out.print(i); i++; }
예제 3-2 : 입력된 수의 평균 구하기 while문을 이용하여 키보드에서 숫자를 입력 받아 입력 받은 모든 수의 평균을 출력하는 프로그램을 작성해보자. 0이 입력되면 입력이 종료되고 평균을 구하여 출력한다. import java.util.Scanner; public class WhileSample { public static void main (String[] args) { Scanner rd = new Scanner(System.in); int n = 0; double sum = 0; int i=0; while ((i = rd.nextInt()) != 0) { sum += i; n++; } System.out.println("입력된 수의 개수는 " + n + "개이며 평균은 " + sum / n + "입니다."); 10 20 30 40 입력된 수의 개수는 4개이며 평균은 25.0입니다.
do-while 문의 구성 do { ..작업문.. } while(조건식) 무조건 최소 한번은 실행 작업 문 들 true false do { ..작업문.. } while(조건식) 무조건 최소 한번은 실행 반복 조건이 true이면 반복, false이면 반복 종료 반복 조건이 없으며 컴파일 오류
do-while문의 실행 과정을 나타내는 순서도 조건식 작업 문 들 true false i = 0 System.out.print(i) i++ i = 0; do { System.out.print(i); i++; } while (i <10); true i<10 false
예제 3-3 : a-z까지 출력 public class DoWhileSample { do-while문을 이용하여 ‘a’부터 ‘z’까지 출력하는 프로그램을 작성하시오. public class DoWhileSample { public static void main (String[] args) { char a = 'a'; do { System.out.print(a); a = (char) (a + 1); } while (a <= 'z'); } abcdefghijklmnopqrstuvwxyz
중첩 반복(Nested Loop) 중첩 반복 반복문이 다른 반복문을 내포하는 모양 이론적으로는 몇 번이고 중첩 반복 가능 너무 많은 중첩 반복은 프로그램 구조를 복잡하게 하므로 보통 2중 또는 3중 반복 정도가 적당 for(i=0; i<100; i++) { // 100 개의 학교 모두의 성적을 더한다. ..... } for(j=0; j<10000; j++) { // 10000 명의 학생 성적을 더한다. ..... } for 문을 이용한 이중 중첩 구조
예제 3-4 : 구구단 2중 중첩된 for문을 사용하여 구구단을 출력하는 프로그램을 작성하시오. 한 줄에 한 단씩 출력한다. public class NestedLoop { public static void main (String[] args) { int i, j; for (i = 1;i < 10; i++,System.out.println()) { for (j = 1;j < 10; j++,System.out.print('\t')) { System.out.print(i + "*" + j + "=" + i*j); } 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 2*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
continue문 continue 문 반복문을 빠져 나가지 않으면서 특정 값에 대해 반복문 내의 실 행문을 건너 뛸 때 사용 for (초기문; 조건식; 반복후작업) { ............... continue; } while (조건식) { ............... continue; } do { ............... continue; } while (조건식);
예제 3-5 : 1부터 100까지 짝수의 합 for문을 사용하여 1부터 100까지 짝수의 합을 구해보자. public class ContinueExample { public static void main (String[] args) { int sum = 0; for (int i = 1; i <= 100; i++) { if (i%2 == 1) continue; else sum += i; } System.out.println("1부터 100까지 짝수의 합은 " + sum); 1부터 100까지 짝수의 합은 2550
break문 break 문 반복문을 완전히 빠져 나갈 때 사용 break문은 하나의 반복문만 벗어남
예제 3-6 : 입력된 숫자 개수 세기 while문과 break문을 사용하여 -1이 입력될 때까지 입력된 숫자의 개수를 출력하시오. import java.util.Scanner; public class BreakExample { public static void main (String[] args) { Scanner in = new Scanner(System.in); int num = 0; while (true) { if (in.nextInt() == -1) break; num++; } System.out.println("입력된 숫자 개수는 " + num); 10 8 9 5 -1 입력된 숫자 개수는 4
Tip: 라벨로 분기 라벨 continue문과 break문은 특정 라벨의 위치로 바로 분기 가능 continue에서 라벨은 주로 중첩 반복(nested loop)에서 바깥의 반복문으로 빠져 나갈 때 사용 break에서 라벨을 적으면 바로 라벨이 붙은 반복문을 벗어나게 되므로 중첩 반복문을 한 번에 벗어날 때 사용 LABEL: for (초기 작업; 반복 조건;반복 후 작업) { ............... continue LABEL; } LABEL: for (초기 작업; 반복 조건;반복 후 작업) { ............... break LABEL; }
배열이란? 배열(array) 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조 참조형 배열(array) 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조 배열에는 같은 종류의 데이터들이 순차적으로 저장하는 공간 인덱스는 0부터 시작 인덱스는 배열의 시작 위치에서부터 데이터가 저장되어 있는 상 대적인 위치 배열을 이용하면 한 번에 많은 메모리 공간 선언 가능 배열은 같은 데이터 타입들이 순차적으로 저장되어 있어 반복문 을 이용하여 처리하기에 가장 적합한 자료 구조
자바 배열의 필요성과 모양 (1) 10개의 정수형 변수를 선언하는 경우 (1) 10개의 정수로 구성된 자바 배열을 선언하는 경우 int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; int i[] = new int[10]; i0 4 i i1 55 i2 32 i[0] i[1] i[2] i[3] i[4] i[5] i[6] i[7] i[8] i[9] 4 55 32 28 35 2 99 13 43 65 i3 28 i4 35 i5 2 i6 99 i7 13 i8 43 i9 65 for(sum=0, n=0; n<10; n++) sum += i[n]; sum= i0+i1+i2+i3+i4+i5+i6+i7+i8+i9;
배열의 선언과 생성, 접근 int intArray[]; intArray = new int[5]; 1. 배열에 대한 레퍼런스 변수 선언 intArray 배열 타입 배열에 대한 레퍼런스 변수 배열선언 intArray = new int[5]; 2. 배열 생성 배열에 대한 레퍼런스 변수 배열 생성 타입 원소 개수 intArray[0] intArray[1] intArray[2] intArray[3] intArray[4] 3. 배열 사용 intArray 20 intArray[3] = 20; int n = intArray[3]; 20 n 인덱스
일차원 배열의 선언 배열 선언과 배열 생성의 두 단계 필요 배열 선언 배열 생성 선언과 초기화 또는 배열이 생성되면서 원소의 값이 초기화됨 int intArray [5]; // 크기 지정 안됨 int intArray[]; char charArray[]; float floatArray[]; int[] intArray; char[] charArray; float[] floatArray; 또는 intArray = new int[10]; charArray = new char[20]; floatArray = new float[5]; int intArray[] = new int[10]; char charArray[] = new char[20]; float floatArray[] = new float[5]; 또는 int intArray[] = {0,1,2,3,4,5,6,7,8,9};
배열 선언과 생성의 차이 int intArray[] ; intArray = new int[5]; null int intArray[] ; intArray 배열 타입 배열에 대한 레퍼런스 변수 배열선언 (2) 배열 생성 intArray = new int[5]; intArray[0] intArray[1] intArray[2] intArray[3] intArray[4] intArray 배열에 대한 레퍼런스 변수 배열 생성 타입 원소 개수
배열을 초기화하면서 생성한 결과 intArray[0] intArray[1] intArray[2] intArray[3] int intArray[] = {4, 3, 2, 1, 0}; double doubleArray[] = {0.01, 0.02, 0.03, 0.04}; intArray[0] intArray[1] intArray[2] intArray[3] intArray[4] doubleArray[0] doubleArray[1] doubleArray[2] doubleArray[3] intArray 4 3 2 1 0.01 0.02 0.03 0.04 doubleArray
레퍼런스 치환과 배열 공유 27 레퍼런스 치환으로 두 레퍼런스가 하나의 배열 공유 27
배열 접근 방법 배열 원소 접근 반드시 배열 생성 후 접근 배열 변수명과 [] 사이에 원소의 인덱스를 적어 접근 배열의 인덱스는 0부터 시작(정수) 배열의 마지막 항목의 인덱스는 (배열 크기 – 1) int intArray []; intArray[4] = 8; // 오류, intArray가 초기화되어 있지 않음 int[] intArray; intArray = new int[10]; intArray[3]=6; // 배열에 값을 저장 int n = intArray[3]; // 배열로부터 값을 읽음
예제 3-7 : 배열에 입력받은 수 중 제일 큰 수 찾기 키보드에서 입력 받은 정수 5개를 배열에 저장하고 제일 큰 수를 화면에 출력하는 프로그램을 작성하시오. import java.util.Scanner; public class ArrayAccess { public static void main (String[] args) { Scanner in = new Scanner(System.in); int intArray[] = new int[5]; int max = 0; for (int i = 0; i < 5; i++) { intArray[i] = in.nextInt(); if (intArray[i] > max) max = intArray[i]; } System.out.print("입력된 수에서 가장 큰 수는 " + max + "입니다."); 1 39 78 100 99 입력된 수에서 가장 큰 수는 100입니다.
배열의 크기와 인덱스 인덱스 배열의 크기 인덱스는 0부터 시작하며 마지막 인덱스는 (배열 크기 -1)이다. 인덱스는 정수 타입만 가능 배열의 크기 배열의 크기는 배열 레퍼런스 변수를 선언할 때 결정되지 않음 배열의 크기는 배열 생성 시에 결정되며, 나중에 바꿀 수 없다. 배열의 크기는 배열의 length라는 필드에 저장되어 있다. int intArray = new int[5]; int n = intArray[-2]; // 실행 오류. -2는 인덱스로 적합하지 않음 int m = intArray[5]; // 실행 오류. 5는 인덱스의 범위(0~4)를 넘었음 int size = intArray.length;
배열은 객체로 관리 int intArray []; intArray = new int[5]; 5 int size = intArray.length; // size는 5 intArray[0] int length 5 intArray 배열객체 length 필드를 이용하여 배열의 모든 값을 출력하는 사례 for(int i=0; i<intArray.length; i++) // intArray 배열 크기만큼 루프를 돈다. System.out.println(intArray[i]);
함수 호출시 C/C++와 자바의 배열 전달 비교 32 C/C++ 경우, 배열과 크기를 각각 전달 받음 자바 경우, 배열만 전달받음 int sum(int x[], int size) { int n, s=0; for(n=0; n<size; n++) s += x[n]; return s; } int sum(int x[]) { int n, s=0; for(n=0; n<x.length; n++) s += x[n]; return s; } int a[] ={1,2,3,4,5}; int n = sum(a, 5); int a[] ={1,2,3,4,5}; int n = sum(a); 자바가 C/C++에 비해 배열을 다루기 10배 편한 구조임
예제 3-8 : 배열 원소의 평균 구하기 배열의 length 필드를 이용하여 배열 크기만큼 키보드에서 정수를 입력 받고 평균을 구하는 프로그램을 작성하시오. import java.util.Scanner; public class ArrayLength { public static void main (String[] args) { Scanner in = new Scanner(System.in); int intArray[] = new int[5]; double sum = 0; for (int i = 0; i < intArray.length; i++) intArray[i] = in.nextInt(); for (int i = 0; i < intArray.length; i++) { sum += intArray[i]; } System.out.print("배열 원소의 평균은 " + sum/intArray.length + "입니다."); 10 20 30 40 50 배열 원소의 평균은 30.0입니다.
2차원 배열 2차원 배열 선언 2차원 배열 생성 2차원 배열 선언, 생성, 초기화 int intArray[][]; char charArray[][]; float floatArray[][]; int[][] intArray; char[][] charArray; float[][] floatArray; 또는 int intArray[] = new int[2][5]; char charArray[] = new char[5][5]; float floatArray[] = new float[5][2]; intArray = new int[2][5]; charArray = new char[5][5]; floatArray = new float[5][2]; 또는 int intArray[][] = {{0,1,2},{3,4,5},{6,7,8}}; char charArray[][] = {{'a', 'b', 'c'},{‘d'.'e','f'}}; float floatArray[][] = {{0.01, 0.02}, {0.03, 0.04}};
2차원 배열의 length 필드 2차원 배열의 length i.length -> 2차원 배열의 행의 개수로서 2 5 i[0] int i[][] = new int[2][5]; int size1 = i.length; //2 int size2 = i[0].length; //5 i[0][0] i[0][1] i[0][2] i[0][3] i[0][4] i length 2 i[1] i[1][0] i[1][1] i[1][2] i[1][3] i[1][4] 2차원 배열의 length i.length -> 2차원 배열의 행의 개수로서 2 i[n].length는 n번째 행의 열의 개수 i[0].length -> 0번째 행의 열의 개수로서 5 i[1].length -> 1번째 행의 열의 개수로서 역시 5
예제 3-9 : 3년간 매출 총액과 평균 구하기 한 회사의 지난 3년간 분기별 매출 총액과 연평균 매출을 구하는 프로그램을 작성하시오. public class SalesRevenue { public static void main (String[] args) { int intArray[][] = {{90, 90, 110, 110}, // 1사분기, 2사분기, 3사분기, 4사분기 {120, 110, 100, 110}, {120, 140, 130, 150}} ; double sum = 0; for (int i = 0; i < intArray.length; i++) for (int j = 0; j < intArray[i].length; j++) sum += intArray[i][j]; System.out.println("지난 3년간 매출 총액은 " + sum + "이며 연평균 매출은 " + sum/intArray.length + "입니다."); } 지난 3년간 매출 총액은 1380.0이며 연평균 매출은 460.0입니다.
비정방형 배열 정방형 배열 비정방병 배열 각 행의 열의 개수가 같은 배열 각 행의 열의 개수가 다른 배열 비정방형 배열의 생성 i[0][0] i[0][3] 정방형 i i[3][0] i[3][3] int i[][]; i = new int[4][4]; int i[][]; // 2차원 배열의 레퍼런스 선언 i = new int [4][]; // 각 행의 레퍼런스 배열 생성 i[0] = new int [1]; // 첫 행의 1개 정수 배열 생성 i[1] = new int [2]; // 둘째 행의 2개 정수 배열 생성 i[2] = new int [3]; // 셋째 행의 3개 정수 배열 생성 i[3] = new int [4]; // 네째 행의 4개 정수 배열 생성 비정방형 i i=new int [4][]; i[0] = new int[1]; i[3] = new int[4]; i[0][0] i[1][0] i[1][1] i[3][0] i[3][1] i[3][2] i[3][3]
비정방형 배열의 length 비정방형 배열의 length i.length -> 2차원 배열의 행의 개수로서 4 i=new int [4][]; i[0] = new int[1]; i[3] = new int[4]; i[0][0] i[1][0] i[1][1] i[3][0] i[3][1] i[3][2] i[3][3] 비정방형 배열의 length i.length -> 2차원 배열의 행의 개수로서 4 i[n].length는 n번째 행의 열의 개수 i[0].length -> 0번째 행의 열의 개수로서 1 i[1].length -> 1번째 행의 열의 개수로서 2 i[2].length -> 2번째 행의 열의 개수로서 3 i[3].length -> 3번째 행의 열의 개수로서 4
예제 3-10 : 비 정방형 배열의 생성과 접근 다음 그림과 같은 비정방형 배열을 만들어 값을 초기화하고 출력하시오. public class IrregularArray { public static void main (String[] args) { int a = 0; int intArray[][] = new int[4][]; intArray[0] = new int[3]; intArray[1] = new int[2]; intArray[2] = new int[3]; intArray[3] = new int[2]; for (int i = 0; i < intArray.length; i++) for (int j = 0; j < intArray[i].length; j++) intArray[i][j] = (i+1)*10 + j; for (int i = 0; i < intArray.length; i++) { System.out.print(intArray[i][j]+" "); System.out.println(); } 10 11 12 20 21 30 31 32 40 41
배열을 메소드의 매개 변수로 전달 int[] values= new int[6] call 배열참조변수 복사!
예제(사용자 입력값의 평균)
예제
메소드에서 배열 리턴 int [] makeArray() { int temp [] = new int [4]; 메소드가 리턴하는 배열 메소드가 리턴하는 배열의 타입과 차원은 리턴받는 배열 레퍼런 스의 타입과 차원에 일치해야 함 리턴 타입에 배열의 크기를 지정하지 않음 int [] makeArray() { int temp [] = new int [4]; return temp; } 리턴 타입 메소드 이름 배열 리턴 int [] intArray; intArray = makeArray();
배열을 리턴 받아 사용하는 과정 44 temp Heap 메모리
예제 3-11 : 배열 리턴 예제 배열을 생성하고 각 원소 값을 출력하는 프로그램을 작성하시오. 배열 생성은 배열을 생성하여 각 원소의 인덱스 값으로 초기화하여 반환하는 메소드를 이용한다. public class ReturnArray { static int[] makeArray() { int temp[] = new int[4]; for (int i=0;i<temp.length;i++) temp[i] = i; return temp; } public static void main (String[] args) { int intArray []; intArray = makeArray(); for (int i = 0; i < intArray.length; i++) System.out.println(intArray[i]); makeArray()가 종료해도 생성된 배열은 소멸되지 않음 1 2 3
public static void main(String [] args) { } 다른 클래스에서 메소드 접근 허용 객체 생성전부터 호출 가능 리턴 값 없음 문자열 배열 인자 main()의 메소드 특징 자바 응용프로그램은 main()에서 부터 시작 public 속성 static 속성 리턴 타입은 void 인자는 문자열 배열(String [])로 전달
main(string [] args) 메소드의 인자 전달 C:\>java Hello abc 3 % 5.7 생성 “abc” “3” “%” “5.7” class Hello args public static void main(String[] args) { String a = args[0]; // a는 "abc" String b = args[1]; // b는 "3" String c = args[2]; // c는 "%" String d = args[3]; // d는 "5.7" } args.length => 4 args[0] => “abc” args[1] => “3 args[2] => “%” args[3] => “5.7”
이클립스에서 main() 메소드의 인자전달 Run 메뉴의 Run Configurations 항목에서 main() 메소 드의 인자를 나열
main()의 인자 이용 예 public class Calc { public static void main(String[] args) { int sum = 0; for(int i=0; i<args.length; i++) { // 명령행 인자의 개수만큼 반복 int n = Integer.parseInt(args[i]); // 명령행 인자인 문자열을 정수로 변환 sum += n; // 숫자를 합한다. } System.out.println("sum = " + sum);
예제 3-12 : main()의 인자들을 받아서 평균값을 계산하는 예제 public class MainParameter { public static void main (String[] args) { double sum = 0.0; for (int i=0; i<args.length; i++) sum += Double.parseDouble(args[i]); System.out.println("합계 :" + sum); System.out.println("평균 :" + sum/args.length); }
배열의 응용: 정렬(Sorting) 선택 정렬: 최소값을 정렬되지 않은 첫번째 원소와 교환
선택 정렬 코드
배열의 응용: 이진 탐색
이진 탐색
이진 탐색
for-each 루프
for-each 루프 // AS-IS : for (int i = 0; i < a.length; i++) { doSomething(a[i]); } // TO-BE : for (Element e : elements) { doSomething(e); }
for-each 루프:예제 String 배열 s
for-each 루프 for each 루프를 사용할 수 없는 경우 배열 원소의 값을 변경하는 경우 역순으로 배열을 처리하는 경우 일부 원소만을 처리하는 경우 하나의 반복문에서 두 개 이상의 배열을 처리하는 경우 전통적인 for 문 사용!!
예외(exception)란? 예외(exception): 잘못된 코드, 부정확한 데이터, 예외적 인 상황에 의하여 발생하는 오류 (예) 0으로 나누는 것과 같은 잘못된 연산이나 배열의 인덱스가 한계를 넘을 수도 있고, 디스크에서는 하드웨어 에러가 발생할 수 있다. ArithmeticException (java.lang 패키지) ArrayIndexOutOfBoundsException, (java.lang 패키지) DiskException (java.io 패키지)
자바의 예외 처리 예외(Exception) 실행 중 발생하는 에러는 컴파일러가 알 수 없다. 예에서는 ArithmeticException 객체가 던져지긴(throw) 하였으나 잡는(Catch) 코드가 별도로 없기 때문에 프로그램이 강제로 종료됨 예외(Exception) 실행 중 발생하는 에러는 컴파일러가 알 수 없다. 실행 중 에러 발생 시 예외를 발생시켜 예외 처리함 예외를 처리하지 않으면 예외가 발생한 프로그램은 강제 종료 import java.util.Scanner; public class ExceptionExample1 { public static void main (String[] args) { Scanner rd = new Scanner(System.in); int divisor = 0; int dividend = 0; System.out.print("나뉨수를 입력하시오:"); dividend = rd.nextInt(); System.out.print("나눗수를 입력하시오:"); divisor = rd.nextInt(); System.out.println(dividend+"를 "+divisor+"로 나누면 몫은 "+dividend/divisor+"입니다."); } 실행되지 않음! 예외발생 나뉨수를 입력하시오:100 나눗수를 입력하시오:0 Exception in thread "main" java.lang.ArithmeticException: / by zero at ExceptionExample1.main(ExceptionExample1.java:12)
try-catch-finally문 예외 처리문 try-catch-finally문 사용 finally는 생략 가능 try { } catch (처리할 예외 타입 선언) { 예외 처리문 (catch 블록) finally { // finally는 생략 가능 예외 발생 여부와 상관없이 무조건 실행되는 문장(finally 블록) 생략 가능
예외가 발생한 경우와 예외가 발생하지 않은 경우 실행 과정 try블럭에서 예외가 발생하지 않은 정상적인 경우 try블럭에서 예외가 발생한 경우 try { .... 실행문 } catch (처리할 예외 타입 선언) { 예외 처리문 finally { finally 블록 문 try { .... 실행문 } catch (처리할 예외 타입 선언) { 예외 처리문 finally { finally 블록 문 발생한 예외가 catch()의 처리할 예외 타입과 일치하는 catch 블록 실행 에외발생
자주 발생하는 예외 자바 플랫폼은 응용프로그램이 실행 중 오류를 탐지할 수 있도록 많은 예외를 클래스 형태로 제공
예제 3-13 : 두 정수의 나눗셈에서 ArithmeticException을 처리하도록 수정된 예 try-catch문을 이용하여 정수를 0으로 나누려고 할 때 "0으로 나룰 수 없습니다."라는 경고 메시지를 출력하도록 프로그램을 작성하시오. import java.util.Scanner; public class ExceptionExample2 { public static void main (String[] args) { Scanner rd = new Scanner(System.in); int divisor = 0; int dividend = 0; System.out.print("나뉨수를 입력하시오:"); dividend = rd.nextInt(); System.out.print("나눗수를 입력하시오:"); divisor = rd.nextInt(); try { System.out.println(dividend+"를 "+divisor+"로 나누면 몫은 "+ dividend/divisor+"입니다."); } catch (ArithmeticException e) { System.out.println("0으로 나눌 수 없습니다."); } divisor가 0인 경우 ArithmeticException 예외 발생 예외발생 나뉨수를 입력하시오:100 나눗수를 입력하시오:0 0으로 나눌 수 없습니다.
i가 4일떄 이 문장 실행 시 ArrayIndexOutOfBoundsException 예제 3-13 : 범위를 벗어난 배열의 접근 배열의 인덱스가 범위를 벗어날 때 발생하는 ArrayIndexOutOfBoundsException을 처리하는 프로그램을 작성하시오. public class ArrayException { public static void main (String[] args) { int[] intArray = new int[5]; intArray[0] = 0; try { for (int i = 0; i < 5; i++) { intArray[i+1] = i+1 + intArray[i]; System.out.println("intArray["+i+"]"+"="+intArray[i]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("배열의 인덱스가 범위를 벗어났습니다."); i가 4일떄 이 문장 실행 시 ArrayIndexOutOfBoundsException 예외 발생 intArray[0]=0 intArray[1]=1 intArray[2]=3 intArray[3]=6 배열의 인덱스가 범위를 벗어났습니다.
예제 3-15 : 정수가 아닌 문자열을 정수로 변환할 때 예외 발생 문자열을 정수로 변환할 때 발생하는 NumberFormatException을 처리하는 프로그램을 작성하라. public class NumException { public static void main (String[] args) { String[] stringNumber = {"23", "12", "998", "3.141592"}; try { for (int i = 0; i < stringNumber.length; i++) { int j = Integer.parseInt(stringNumber[i]); System.out.println("숫자로 변환된 값은 " + j); } catch (NumberFormatException e) { System.out.println("정수로 변환할 수 없습니다."); 숫자로 변환된 값은 23 숫자로 변환된 값은 12 숫자로 변환된 값은 998 정수로 변환할 수 없습니다.
예제 3-14 : 입력오류시발생하는 예외(InputMismatchException) 68 Scanner 클래스를 이용하여 3개의 정수를 입력받아 합을 구하는 프로그램을 작성하라. 사용자가 정수가 아닌 문자를 입력할 때 발생하는 InputMismatchException 예외를 처리하여 다시 입력받도록 하라. import java.util.Scanner; import java.util.InputMismatchException; public class InputException { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("정수 3개를 입력하세요"); int sum=0, n=0; for(int i=0; i<3; i++) { System.out.print(i+">>"); try { n = scanner.nextInt(); // 정수 입력 } catch(InputMismatchException e) { System.out.println("정수가 아닙니다. 다시 입력하세요!"); scanner.next(); // 입력 스트림에 있는 정수가 아닌 토큰을 버린다. i--; // 인덱스가 증가하지 않도록 미리 감소 continue; // 다음 루프 sum += n; // 합하기 System.out.println("합은 " + sum); scanner.close(); 사용자가 문자를 입력하면 InputMismatchException 예외 발생 정수 3개를 입력하세요 0>>5 1>>R 정수가 아닙니다. 다시 입력하세요! 1>>4 2>>6 합은 15 68
3. 예외의 종류 모든 예외는 Throwable 로부터 상속되어 Exception과 Error 클래스로 나뉘어서 분류된다.
Error와 Exception Error : 시스템에서 발생하는 심각한 에러이다. 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 - 치명적인 내부 오류나 자바 가상 머신에서의 자원 고갈 등과 관련 - 프로그램이 바로 종료됨 - 거의 발생되지 않는다. 예외 RunTimeException 프로세스 실행중에 발생하는 에러 Exception IOException 파일 및 네트워크 입출력시에 발생하는 에러 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
RunTimeException
IOException 입출력과 관련된 오류 예. p. 77
체크 예외와 비체크 예외 Error Throwable Exception Unchecked Exception 1) RunTimeException 2) IOException Unchecked Exception Checked Exception 컴파일러에 의해 코딩상에서 해당 예외에 대해 처리가 정확하게 이루어졌는지 체크하는 예외
예외가 발생하는 메소드 예외를 발생하는 메소드 처리 방법 (방법 1) 예외를 try/catch로 처리하는 방법 (방법 2) 예외를 상위 메소드로 전달하는 방법
try/catch 블록 이용
상위 메소드로 전달 예외를 상위에서 처리.
실습문제 1. 임의의 정수를 입력하시오>> 3 *** ** * import java.util.Scanner; public class PrintAsterisk { public static void main(String[] args){ Scanner sin = new Scanner(System.in); System.out.print("임의의 정수를 입력하시오>>"); int repeat = sin.nextInt(); if (repeat <=0) { System.out.println("0보다 커야 합니다."); return; } for (int i=repeat; i>0; i--) { for (int j=0; j<i; j++) System.out.print('*'); System.out.println();
실습문제 5, 7, 9
LAB 1. 사용자로부터 정수를 입력받아서 배열에 저장하고 출 력하는 프로그램을 작성하여 보자. class TestArray { public static void main(String args[]) Scanner scan = new Scanner(System.in); // 10개의 정수를 저장할 수 있는 배열을 선언하고 생성하라. // 사용자로부터 정수를 받아서 배열에 저장하는 반복루프 // 배열에 저장된 정수를 출력하는 반복 루프 }
2. 배열에 저장된 정수를 출력할 때, for-each 반복 구조 를 사용하여 보라. 3. 배열에 저장된 정수를 역순으로 출력하여 보라.
LAB 2. 사용자가 입력한 문자열에서 각각의 문자들이 나타나 는 횟수를 계산하는 프로그램을 작성하여 보자. class CountLetter { public static void main(String args[]) Scanner scan = new Scanner(System.in); // 26개의 정수를 저장할 수 있는 배열 count를 선언하고 생성하라. __________________________________________ System.out.println("문자열을 입력하시오 : “); String buffer = scan.nextLine(); // 각 문자가 등장하는 회수를 계산한다. for(int i; i< buffer.length();i++) char ch = buffer.charAt(i); count[ch-'a']++; } // 배열에 저장된 횟수를 출력하는 반복루프 ___________________________________________