제 3 장 반복문, 배열, 예외처리 1 명품 JAVA Programming
for( 초기문 ; 조건식 ; 반 복후작업 ) {.. 작업문.. } for 키 워드 for 문의 구성 초기문 조건 식 작업문 반복 후작업 true false for 문이 실행한 후 오직 한번만 실행되는 초기화 작업 콤마 (‘,’) 로 구분하여 여러 문장 나열 가능 초기할 일이 없으면 비어둘 수 있음 논리형 변수나 논리 연산만 가능 반복 조건이 true 이면 반복 계속, false 이면 반복 종료 반복 조건이 true 상수인 경우, 무한 반복 반복 조건이 비어 있으면 true 로 간주 반복 작업 문장들의 실행 후 처리 작업 콤마 (‘,’) 로 구분하여 여러 문장 나열 가능 2
for 문의 예시 for (i = 0; i < 10; i++) { System.out.print(i); } 0 에서 9 까지 정수 출력 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 = 0; for (int i = 100; i >= 0; i--) sum += i; 3
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("+"); } 예제 3-1 : 1 부터 10 까지 숫자의 합을 출력 for 문을 이용하여 1 부터 10 까지 덧셈을 표시하고 합을 구하시오 =55 4
while( 조건식 ) {.. 작업문.. } while 문의 구성 조건 식 작업 문 true false 반복 조건이 true 이면 반복, false 이면 반복 종료 반복 조건이 없으면 컴파일 오류 처음부터 반복조건을 통과한 후 작업문 수행 5
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 + " 입니다."); } 예제 3-2 : 입력된 수의 평균 구하기 while 문을 이용하여 키보드에서 숫자를 입력 받아 입력 받은 모든 수의 평균 을 출력하는 프로그램을 작성해보자. 0 이 입력되면 입력이 종료되고 평균을 구하여 출력한다 입력된 수의 개수는 4 개이며 평균은 25.0 입니다. 6
do {.. 작업문.. } while( 조건식 ) do-while 문의 구성 조건 식 작업 문 들 true false 무조건 최소 한번은 실행 반복 조건이 true 이면 반복, false 이면 반복 종료 반복 조건이 없으며 컴파일 오류 7
예제 3-3 : 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'); } do-while 문을 이용하여 a’ 부터 z’ 까지 출력하는 프로그램을 작성하시오. abcdefghijklmnopqrstuvwxyz 8
중첩 반복 for(i=0; i<100; i++) { // 100 개의 학교 모두의 성적을 더 한다 } for(j=0; j<10000; j++) { // 명의 학생 성적을 더한다 } 중첩 반복 반복문이 다른 반복문을 내포하는 모양 이론적으로는 몇 번이고 중첩 반복 가능 너무 많은 중첩 반복은 프로그램 구조를 복잡하게 하므로 보통 2 중 또 는 3 중 반복 정도가 적당 for 문을 이용한 이중 중첩 구조 9
예제 3-4 : 구구단 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); } 2 중 중첩된 for 문을 사용하여 구구단을 출력하는 프로그램을 작성하시오. 한 줄에 한 단씩 출력한다. 1*1=11*2=21*3=31*4=41*5=51*6=61*7=71*8=81*9=9 2*1=22*2=42*3=62*4=82*5=102*6=122*7=142*8=162*9=18 3*1=33*2=63*3=93*4=123*5=153*6=183*7=213*8=243*9=27 4*1=44*2=84*3=124*4=164*5=204*6=244*7=284*8=324*9=36 5*1=55*2=105*3=155*4=205*5=255*6=305*7=355*8=405*9=45 6*1=66*2=126*3=186*4=246*5=306*6=366*7=426*8=486*9=54 7*1=77*2=147*3=217*4=287*5=357*6=427*7=497*8=567*9=63 8*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=648*9=72 9*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81 10
continue 문 continue 문 반복문을 빠져 나가지 않으면서 특정 값에 대해 반복문 내의 실행 문을 건너 뛸 때 사용 for ( 초기문 ; 조건식 ; 반복후 작업 ) { continue; } while ( 조건식 ) { continue; } do { continue; } while ( 조건 식 ); 11
예제 3-5 : 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); } for 문을 사용하여 1 부터 100 까지 짝수의 합을 구해보자. 1 부터 100 까지 짝수의 합은
break 문 break 문 반복문을 완전히 빠져 나갈 때 사용 break 문은 하나의 반복문만 벗어남 중첩 반복의 경우 안쪽 반복문이 break 문을 포함하고 있으면 안쪽 반복문만 벗어남 13
예제 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); } 입력된 숫자 개수는 4 14
배열이란 ? 배열 (array) 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조 배열에는 같은 종류의 데이터들이 순차적으로 저장하는 공간 인덱스는 0 부터 시작 인덱스는 배열의 시작 위치에서부터 데이터가 저장되어 있는 상 대적인 위치 배열을 이용하면 한 번에 많은 메모리 공간 선언 가능 배열은 같은 데이터 타입들이 순차적으로 저장되어 있어 반복문 을 이용하여 처리하기에 가장 적합한 자료 구조 15
자바 배열의 필요성과 모양 int i0, i1, i2, i3, i4, i5, i6, i7, i8, i9; i0 i1 i2 i3 i4 i5 i6 i7 i8 i int i[] = new int[10]; i[0] i[1] i[2] i[3] i[4] i[5] i[6] i[7] i[8] i[9] sum= i0+i1+i2+i3+i4+i5+i6+i7+i8+i9; for(sum=0, n=0; n<10; n++) sum += i[n]; i (1) 10 개의 정수형 변수를 선언하는 경우 (1) 10 개의 정수로 구성된 자바 배열을 선언하는 경우 16 i[8] i[9] i[7] i[8] i[9] i[6] i[7] i[8] i[9] i[5] i[6] i[7] i[8] i[9] i[4] i[5] i[6] i[7] i[8] i[9] i[3] i[4] i[5] i[6] i[7] i[9] i[2] i[3] i[4] i[5] i[6] i[7] i[9] i[1] i[2] i[3] i[4] i[5] i[6] i[7] i[9] i[1] i[2] i[3] i[4] i[5] i[6] i[7] i[9] i[0] i[1] i[2] i[0] i[1] i[3] i[2] i[0] i[1] i[4] i[3] i[2] i[0] i[1] i[5] i[4] i[3] i[2] i[0] i[1] i[6] i[5] i[4] i[3] i[2] i[0] i[1] i[7] i[6] i[5] i[4] i[3] i[2] i[0] i[1] i[8] i[7] i[6] i[5] i[4] i[3] i[2] i[0] i[1] i[9] i[8] i[7] i[6] i[5] i[4] i[3] i[2] i[0] i[1]
일차원 배열의 선언 배열 선언 배열 생성 배열 선언, 생성 배열 선언, 생성, 초기화 intintArray[]; charcharArray[]; floatfloatArray[]; intArray = new int[10]; charArray = new char[20]; floatArray = new float[5]; int intArray[] = {0,1,2,3,4,5,6,7,8,9}; 17
배열 선언과 생성의 차이 intArray (1) 배열에 대한 레퍼런스 변수 intArray 선언 (2) 배열 생성 intArray[0] intArray[1] intArray[2] intArray[3] intArray[4] intArray = new int [5]; 배열 생성 원소 개수 타입 배열에 대한 레퍼런스 변수 배열 타입배열에 대한 레퍼런스 변수 int intArray [] ; 배열선언 18
배열을 초기화하면서 생성한 결과 intArray intArray[0] intArray[1] intArray[2] intArray[3] intArray[4] floatArray floatArray[0] floatArray[1] floatArray[2] floatArray[3] int intArray[] = {4, 3, 2, 1, 0}; float floatArray[] = {0.01, 0.02, 0.03, 0.04}; 19
배열 참조 intArray int intArray[] = new int[5]; int myArray[] = intArray; myArray intArray 2 intArray[1] = 2; myArray[1] = 6; myArray 6 * 생성된 하나의 배열을 다수의 레 퍼런스가 참조 가능 20
배열 접근 방법 배열 원소 접근 반드시 배열 생성 후 접근 배열 변수명과 [] 사이에 원소의 인덱스를 적어 접근 배열의 인덱스는 0 부터 시작 배열의 마지막 항목의 인덱스는 ( 배열 크기 – 1) int intArray[]; intArray = new int[10]; intArray[3]=6; // 배열에 값을 저장 int n = intArray[3]; // 배열로부터 값을 읽음 int intArray []; intArray[4] = 8; // 오류, intArray 가 초기화되 어 있지 않음 21
예제 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 + " 입니다."); } 입력된 수에서 가장 큰 수는 100 입니다. 22
배열의 크기와 인덱스 인덱스 인덱스는 0 부터 시작하며 마지막 인덱스는 ( 배열 크기 -1) 이다. 인덱스는 정수 타입만 가능 배열의 크기 배열의 크기는 배열 레퍼런스 변수를 선언할 때 결정되지 않음 배열의 크기는 배열 생성 시에 결정되며, 나중에 바꿀 수 없다. 배열의 크기는 배열의 length 라는 필드에 저장되어 있다. int intArray = new int[5]; int n = intArray[-2]; // 실행 오류. -2 는 인덱스로 적합 하지 않음 int m = intArray[5]; // 실행 오류. 5 는 인덱스의 범위 (0~4) 를 넘었음 int size = intArray.length; 23
배열은 객체로 관리 intArray int intArray []; intArray = new int[5]; int size = intArray.length; // size 는 5 int length 5 객체 intArray[0] 24
예제 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 + " 입니다."); } 배열 원소의 평균은 30.0 입니다. 25
2 차원 배열 2 차원 배열 선언 2 차원 배열 생성 2 차원 배열 선언, 생성 2 차원 배열 선언, 생성, 초기화 intintArray[][]; charcharArray[][]; floatfloatArray[][]; intArray = new int[2][5]; charArray = new char[5][5]; floatArray = new float[5][2]; intintArray[] = new int[2][5]; charcharArray[] = new char[5][5]; floatfloatArray[] = 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}}; 26
2 차원 배열의 length 필드 2 차원 배열의 length i.length -> 2 차원 배열의 행의 개수로서 2 i[n].length 는 n 번째 행의 열의 개수 i[0].length -> 0 번째 행의 열의 개수로서 5 i[1].length -> 1 번째 행의 열의 개수로서 역시 5 i[0][0]i[0][1]i[0][2]i[0][3]i[0][4] i[1][0]i[1][1]i[1][2]i[1][3]i[1][4] int i[][] = new int[2][5]; int size1 = i.length; //2 int size2 = i[0].length; //5 i[1] i i[0] length
예제 3-9 : 3 년간 매출 총액과 평균 구하기 public class SalesRevenue { public static void main (String[] args) { int intArray[][] = {{90, 90, 110, 110}, {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 년간 분기별 매출의 총액과 연평균 매출을 구하는 프로그램 을 작성하시오. 지난 3 년간 매출 총액은 이며 연평균 매출은 입니다. 28
메소드에서 배열 리턴 메소드가 리턴하는 배열 메소드가 리턴하는 배열의 타입과 차원은 리턴받는 배열 레퍼런 스의 타입과 차원에 일치해야 함 리턴 타입에 배열의 크기를 지정하지 않음 int [] makeArray() { int temp [] = new int [4]; return temp; } 리턴 타입 메소드 이름 배열 리턴 29
예제 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]); } 배열을 생성하고 각 원소 값을 출력하는 프로그램을 작성하시오. 배열 생성은 배 열을 생성하여 각 원소의 인덱스 값으로 초기화하여 반환하는 메소드를 이용한다
main() 메소드 main() 의 메소드 특징 자바 응용프로그램은 main() 에서 부터 시작 public 속성 static 속성 리턴 타입은 void 인자는 문자열 배열 (String []) 로 전달 public static void main(String [] args) { } 다른 클래스에서 메소드 접근 허용 객체 생성 전부 터 호 출 가 능 리턴 값 없음 문자열 배열인자인자 31
main(string [] args) 메소드의 인자 전달 C:\>java Hello abc 3 % 5.7 “abc” “3” “%” “5.7” 생성 class Hello 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 args.length => 4 args[0] => “abc” args[1] => “3 args[2] => “%” args[3] => “5.7” 32
이클립스에서 main() 메소드의 인자전달 Run 메뉴의 Run Configurations 항목에서 main() 메소드 의 인자를 나열 33
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); } 34
예제 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); } 실수를 main() 메소드 인자로 전달받아 평균값을 구하는 프로그램을 작성하시오. 35
자바의 예외 처리 예외 (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) 36
try-catch-finally 문 예외 처리문 try-catch-finally 문 사용 finally 는 생략 가능 try { 예외가 발생할 가능성이 있는 실행문 (try 블 록 ) } catch ( 처리할 예외 타입 선언 ) { 예외 처리문 (catch 블록 ) } finally { // finally 는 생략 가능 예외 발생 여부와 상관없이 무조건 실행되 는 문장 (finally 블록 ) } 생략 가능 37
예외가 발생한 경우와 예외가 발생하지 않은 경 우 실행 과정 try {.... 실행문.... } catch ( 처리할 예외 타입 선 언 ) { 예외 처리문 } finally { finally 블록 문 } try {.... 실행문.... } catch ( 처리할 예외 타입 선 언 ) { 예외 처리문 } finally { finally 블록 문 } 에외 발생 try 블럭에서 예외가 발생하지 않은 정상적인 경우 try 블럭에서 예외가 발생한 경우 38
자주 발생하는 예외 39
예제 3-13 : 두 정수의 나눗셈에서 ArithmeticException 을 처리하도록 수정된 예 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 으로 나눌 수 없습니다."); } try-catch 문을 이용하여 정수를 0 으로 나누려고 할 때 "0 으로 나룰 수 없습니다." 라 는 경고 메시지를 출력하도록 프로그램을 작성하시오. 나뉨수를 입력하시오 :100 나눗수를 입력하시오 :0 0 으로 나눌 수 없습니다. 40
예제 3-14 : 범위를 벗어난 배열의 접근 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(" 배열의 인덱스가 범위를 벗어났 습니다."); } 배열의 인덱스가 범위를 벗어날 때 발생하는 ArrayIndexOutOfBoundsException 을 처리하는 프로그램을 작성하시오. intArray[0]=0 intArray[1]=1 intArray[2]=3 intArray[3]=6 배열의 인덱스가 범위를 벗어났습니다. 41
예제 3-15 : 정수가 아닌 문자열을 정수로 변환할 때 예외 발생 public class NumException { public static void main (String[] args) { String[] stringNumber = {"23", "12", "998", " "}; 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(" 정수로 변환할 수 없습니다."); } 문자열을 정수로 변환할 때 발생하는 NumberFormatException 을 처리하는 프로 그램을 작성하라. 숫자로 변환된 값은 23 숫자로 변환된 값은 12 숫자로 변환된 값은 998 정수로 변환할 수 없습니다. 42