명품 JAVA Essential 1
2 학습목표 1. 자바의반복문 (for, while, do-while) 이해, 작성 2. continue문과 break문활용 3. 자바의배열선언및활용 4. 배열을리턴하는메소드작성 5. 예외개념과자바에서의예외처리
반복문 3 자바반복문 - for 문, while 문, do-while 문 for 문 - 가장많이사용하는반복문 for(i=0; i<10; i++, System.out.println(i)) {... for(int i=0; i<10; i++) System.out.print(i); 반복후작업문에콤마로분리하여 2 문장작성가능 for 문안에서만사용되는변수 i 선언가능 for( 초기문 ; true; 반복후작업 ) { // 무한반복... for( 초기문 ; ; 반복후작업 ) { // 무한반복...
예제 3-1 : for 문을이용하여 1 부터 10 까지합출력하기 4 for 문을이용하여 1 부터 10 까지덧셈으로표시하고합을출력하라. public class ForSample { public static void main(string[] args) { int i, sum=0; for(i=1; i<=10; i++) { // 1~10 까지반복 sum += i; System.out.print(i); // 더하는수출력 if(i<=9) // 1~9 까지는 '+' 출력 System.out.print("+"); else { // i 가 10 인경우 System.out.print("="); // '=' 출력하고 System.out.print(sum); // 덧셈결과출력 1+2+3+4+5+6+7+8+9+10=55
while 문 5 while 문의구성과코드사례 조건식이 참 인동안반복실행
예제 3-2 : while 문을이용하여입력된정수의평균구하기 6 while 문을이용하여정수를여러개입력받고평균을출력하라. 0 이입력되면입력을종료한다. import java.util.scanner; public class WhileSample { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); int count=0, n=0; double sum=0; System.out.println(" 정수를입력하고마지막에 0 을입력하세요."); while((n = scanner.nextint())!= 0) { // 0 이입력되면 while 문벗어남 sum = sum + n; count++; System.out.print(" 수의개수는 " + count + " 개이며 "); System.out.println(" 평균은 " + sum/count + " 입니다."); scanner.close(); 정수를입력하고마지막에 0 을입력하세요. 10 30 20 40 0 수의개수는 4 개이며평균은 15.0 입니다. 0 은마지막입력을뜻함
do-while 문 7 do-while 문의구성과코드사례 조건식이 참 인동안반복실행 작업문은한번반드시실행
예제 3-3 : do-while 문을이용하여 a 에서 z 까지출력하기 8 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
중첩반복 9 중첩반복 반복문이다른반복문을내포하는구조 10000 명의학생이있는 100 개대학의모든학생성적의합을구할때, for 문을이용한이중중첩구조
예제 3-4 : 2 중중첩을이용한구구단출력하기 10 2 중중첩된 for 문을이용하여구구단을출력하는프로그램을작성하라. public class NestedLoop { public static void main(string[] args) { for(int i=1; i<10; i++) { // 단에대한반복. 1 단에서 9 단 for(int j=1; j<10; j++) { // 각단의곱셈 System.out.print(i + "*" + j + "=" + i*j); // 구구셈출력 System.out.print('\t'); // 하나씩탭으로띄기 System.out.println(); // 한단이끝나면다음줄로커서이동 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 문 11 continue 문 반복문을빠져나가지않고, 다음반복으로제어변경 반복문에서 continue; 문에의한분기 분기
예제 3-5 : continue 문을이용하여양수합구하기 12 5 개의정수를입력받고양수합을구하여출력하는프로그램을작성하라. import java.util.scanner; public class ContinueExample { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.println(" 정수를 5 개입력하세요."); int sum=0; for(int i=0; i<5; i++) { int n=scanner.nextint(); if(n<=0) continue; // 0 이나음수인경우더하지않고다음반복으로진행 else sum += n; // 양수인경우덧셈 System.out.println(" 양수의합은 " + sum); scanner.close(); 정수를 5 개입력하세요. 5-2 6 10-4 양수의합은 21
break 문 13 break 문 반복문하나를즉시벗어갈때사용 하나의반복문만벗어남 중첩반복의경우안쪽반복문의 break 문이실행되면안쪽반복문만벗어남
예제 3-6 : break 문을이용하여 while 문벗어나기 14 "exit" 이입력되면 while 문을벗어나도록 break 문을활용하는프로그램을작성하라. import java.util.scanner; public class BreakExample { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.println("exit 을입력하면종료합니다."); while(true) { System.out.print(">>"); String text = scanner.nextline(); if(text.equals("exit")) // "exit" 이입력되면반복종료 break; // while 문을벗어남 System.out.println(" 종료합니다..."); scanner.close(); exit 을입력하면종료합니다. >>edit >>exit 종료합니다...
자바배열 15 배열 (array) 인덱스와인덱스에대응하는데이터들로이루어진자료구조 배열을이용하면한번에많은메모리공간선언가능 배열은같은타입의데이터들이순차적으로저장되는공간 원소데이터들이순차적으로저장됨 인덱스를이용하여원소데이터접근 반복문을이용하여처리하기에적합한자료구조 배열인덱스 0부터시작 인덱스는배열의시작위치에서부터데이터가있는상대위치
16 자바배열의필요성과모양
17 배열선언과생성
배열선언및생성디테일 18 배열선언과배열생성의두단계필요 배열선언 배열의이름선언 ( 배열레퍼런스변수선언 ) int intarray []; 또는 int[] intarray; int intarray [5]; // 크기지정안됨 배열생성 배열공간할당받는과정 intarray = new int[5]; 또는 int intarray[] = new int[5]; // 선언과동시에배열생성 배열초기화 배열생성과값초기화 int intarray[] = {4, 3, 2, 1, 0; // 5 개의정수배열생성및값초기화 double doublearray[] = {0.01, 0.02, 0.03, 0.04; // 5 개의실수배열생성및값초기화
19 배열을초기화하면서생성한결과
배열인덱스와배열원소접근 20 배열인덱스 배열의인덱스는 0 ~ ( 배열크기 1) int intarray = new int[5]; intarray[0] = 5; intarray[3] = 6; int n = intarray[3]; // 인덱스는 0~4까지가능 // 원소 0에 5 저장 // 원소 3에 6 저장 // 원소 3의값을읽어 n에저장 인덱스를잘못사용한경우 int n = intarray[-2]; int m = intarray[5]; 반드시배열생성후접근 // 인덱스로음수사용불가 // 5는인덱스의범위 (0~4) 넘었음 int intarray []; // 레퍼런스만선언함 intarray[1] = 8; // 오류. 배열이생성되어있지않음
레퍼런스치환과배열공유 21 레퍼런스치환으로두레퍼런스가하나의배열공유
예제 3-7 : 배열선언및생성 22 양수 5 개를입력받아배열에저장하고, 제일큰수를출력하는프로그램을작성하라. import java.util.scanner; public class ArrayAccess { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); int intarray[]; intarray = new int[5]; int max=0; // 현재가장큰수 System.out.println(" 양수 5 개를입력하세요."); for(int i=0; i<5; i++) { intarray[i] = scanner.nextint(); // 입력받은정수를배열에저장 if(intarray[i] > max) max = intarray[i]; // max 변경 System.out.print(" 가장큰수는 " + max + " 입니다."); scanner.close(); 양수 5 개를입력하세요. 1 39 78 100 99 가장큰수는 100 입니다..
배열의크기, length 필드 23 자바의배열은객체로처리 배열객체의 length 필드 배열의크기는배열객체의 length 필드에저장 length 필드를이용하여배열의모든값을출력하는사례 for(int i=0; i<intarray.length; i++) // intarray 배열크기만큼루프를돈다. System.out.println(intArray[i]);
함수호출시 C/C++ 와자바의배열전달비교 24 C/C++ 경우, 배열과크기를각각전달받음 int sum(int x[], int size) { int n, s=0; for(n=0; n<size; n++) s += x[n]; return s; int a[] ={1,2,3,4,5; int n = sum(a, 5); 자바경우, 배열만전달받음 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); 자바가 C/C++ 에비해배열을다루기 10 배편한구조임
예제 3-8 : 배열의 length 필드활용 25 배열의 length 필드를이용하여배열크기만큼정수를입력받고평균을출력하라. import java.util.scanner; public class ArrayLength { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); System.out.println("5 개의정수를입력하세요."); int intarray[] = new int[5]; double sum=0.0; for(int i=0; i<intarray.length; i++) intarray[i] = scanner.nextint(); // 키보드에서입력받은정수저장 for(int i=0; i<intarray.length; i++) sum += intarray[i]; // 배열에저장된정수값을더하기 System.out.print(" 평균은 " + sum/intarray.length); scanner.close(); 5 개의정수를입력하세요. 2 3 4 5 9 평균은 4.6.
배열과 for-each 문 26 for-each 문 배열이나나열 (enumeration) 의원소를순차접근하는데유용한 for 문 for-each 문으로정수배열의합을구하는사례 int [] n = { 1,2,3,4,5 ; int sum = 0; for (int k : n) { sum += k; for 문으로구성하면다음과같다. for(int i=0; i<n.length; i++) { int k = n[i]; sum += k; 반복될때마다 k 는 n[0], n[1],..., n[4] 로번갈아설정
예제 3-9 for-each 문활용 27 for-each 문을활용하여 int [] 배열의합을구하고, String [] 배열의문자열을출력하는사례를보인다. public class foreachex { public static void main(string[] args) { int [] n = { 1,2,3,4,5 ; int sum=0; for(int k : n) { // k 는 n[0], n[1],..., n[4] 로반복 System.out.print(k + " "); // 반복되는 k 값출력 sum += k; System.out.println(" 합은 " + sum); String f[] = { " 사과 ", " 배 ", " 바나나 ", " 체리 ", " 딸기 ", " 포도 " ; for(string s : f) // s 는 f[0], f[1],..., f[5] 로반복 System.out.print(s + " "); 1 2 3 4 5 합은 15 사과배바나나체리딸기포도
2 차원배열 28 2 차원배열선언 int intarray[][]; 또는 int[][] intarray; 2 차원배열생성 intarray = new int[2][5]; int intarray[] = new int[2][5]; // 배열선언과생성동시 2 차원배열의구조 2 차원배열의 length 필드 i.length -> 2 차원배열의행의개수로, 2 i[n].length-> n 번째행의열의개수 i[1].length -> 1 번째행의열의개수, 5
2 차원배열의초기화 29 배열선언과동시에초기화 int intarray[][] = { { 0, 1, 2, { 3, 4, 5, { 6, 7, 8 ; // 3x3 배열생성 char chararray[][] = { {'a', 'b', 'c', {'d, 'e', 'f' ; // 2x3 배열생성 double doublearray[][] = { {0.01, 0.02, {0.03, 0.04 ; // 2x2 배열생성
예제 3-10 : 2 차원배열생성및활용하기 30 2 차원배열에학년별로 1, 2 학기성적을저장하고, 4 년전체평점평균을출력하라. public class ScoreAverage { public static void main(string[] args) { double score[][] = { {3.3, 3.4, // 1학년 1, 2학기평점 {3.5, 3.6, // 2학년 1, 2학기평점 {3.7, 4.0, // 3학년 1, 2학기평점 {4.1, 4.2 ; // 4학년 1, 2학기평점 double sum=0; for(int year=0; year<score.length; year++) // 각학년별로반복 for(int term=0; term<score[year].length; term++) // 각학년의학기별로반복 sum += score[year][term]; // 전체평점합 int n=score.length; // 배열의행개수, 4 int m=score[0].length; // 배열의열개수, 2 4 2 System.out.println("4 년전체평점평균은 " + sum/(n*m)); 4 년전체평점평균은 3.725
메소드의배열리턴 31 배열리턴 배열의레퍼런스만리턴 ( 배열전체가리턴되는것이아님 ) 메소드의리턴타입 리턴하는배열타입과리턴받는배열타입일치 리턴타입에배열의크기를지정하지않음 int [] intarray; intarray = makearray();
배열을리턴받아사용하는과정 32 temp
예제 3-11 : 배열리턴 33 일차원정수배열을생성하여리턴하는 makearray() 를작성하고, 이메소드로부터배열을전달받는프로그램을작성하라. public class ReturnArray { static int[] makearray() { int temp[] = new int[4]; for(int i=0; i<temp.length; i++) temp[i] = i; // 배열초기화, 0, 1, 2, 3 return temp; // 배열리턴 makearray() 가종료해도생성된배열은소멸되지않음 public static void main(string[] args) { int intarray[]; intarray = makearray(); // 메소드가리턴한배열참조 for(int i=0; i<intarray.length; i++) System.out.print(intArray[i] + " "); 0 1 2 3
자바의예외처리 34 예외 (Exception) 실행중오동작이나결과에악영향을미치는예상치못한상황발생 자바에서는실행중발생하는에러를예외로처리 실행중예외가발생하면 자바플랫폼은응용프로그램이예외를처리하도록호출 응용프로그램이예외를처리하지않으면프로그램강제종료시킴 예외발생경우 정수를 0으로나누는경우배열의크기보다큰인덱스로배열의원소를접근하는경우정수를읽는코드가실행되고있을때사용자가문자를입력한경우
예제 3-12 : 0 으로나누기시예외발생으로응용프로그램이강제종료되는경우 35 두정수를입력받아나눗셈을하고몫을구하는프로그램코드이다. 사용자가나누는수에 0 을입력하면자바플랫폼에의해예외가발생하여프로그램이강제종료된다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import java.util.scanner; public class DivideByZero { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); int dividend; // 나뉨수 int divisor; // 나눗수 System.out.print(" 나뉨수를입력하시오 :"); dividend = scanner.nextint(); // 나뉨수입력 System.out.print(" 나눗수를입력하시오 :"); divisor = scanner.nextint(); // 나눗수입력 System.out.println(dividend+" 를 " + divisor + " 로나누면몫은 " + dividend/divisor + " 입니다."); divisor 가 0 이므로 ArithmeticException 예외발생 나뉨수를입력하시오 :100 나눗수를입력하시오 :0 Exception in thread "main" java.lang.arithmeticexception: / by zero at DivideByZero.main(DivideByZero.java:13)
자바의예외처리, try-catch-finally 문 36 예외처리 발생한예외에대해개발자가작성한프로그램코드에서대응하는것 try-catch-finally문사용 finally 블록은생략가능
예외가발생 / 발생하지않은경우제어의흐름 37 발생한예외가 catch() 의처리할예외타입과일치하는 catch 블록실행
자바의예외클래스 38 자바플랫폼은응용프로그램이실행중오류를탐지할수있도록많은예외를클래스형태로제공
예외클래스사례 39 배열의범위를벗어나원소를접근하는예외처리 ArrayIndexOutOfBoundsException 예외 int intarray [] = new int[5]; try { intarray[3] = 10; // 예외발생하지않음 intarray[6] = 5; // 예외발생 이문장실행시 ArrayIndexOutOfBoundsException 예외발생 catch(arrayindexoutofboundsexception e) { // 객체 e 에예외정보가넘어옴 System.out.println(" 배열의범위를초과하여원소를접근하였습니다.");
40 예제 3-13 : 0 으로나누는예외에대처하는 try-catch 블록만들기 try-catch-finally 블록을이용하여예제 3-12 를수정하여, 정수를 0 으로나누는경우에 "0 으로나눌수없습니다!" 를출력하는프로그램을작성하라. import java.util.scanner; public class DevideByZeroHandling { public static void main(string[] args) { Scanner scanner = new Scanner(System.in); int dividend; // 나뉨수 int divisor; // 나눗수 System.out.print(" 나뉨수를입력하시오 :"); dividend = scanner.nextint(); // 나뉨수입력 System.out.print(" 나눗수를입력하시오 :"); divisor = scanner.nextint(); // 나눗수입력 try { System.out.println(dividend+" 를 " + divisor + " 로나누면몫은 " + dividend/divisor + " 입니다."); catch(arithmeticexception e) { // ArithmeticException 예외처리코드 System.out.println("0 으로나눌수없습니다!"); finally { scanner.close(); // 정상적이든예외가발생하든최종적으로 scanner 를닫는다. divisor 가 0 인경우 ArithmeticException 예외발생 나뉨수를입력하시오 :100 나눗수를입력하시오 :0 0 으로나눌수없습니다. ArithmeticException 예외가발생해도프로그램이강제종료되지않고정상실행됨
예제 3-14 : 입력오류시발생하는예외 (InputMismatchException) 41 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