[INA470] Java Programming Youn-Hee Han http://link.kut.ac.kr 10. 배열 [INA470] Java Programming Youn-Hee Han http://link.kut.ac.kr
1. 배열의 선언과 사용 배열(array): 같은 타입의 변수들을 인덱스화 하여 모아 관리하는 것 Java에서 배열은 객체이다 !!!. 즉, 객체를 생성하는 것과 유사한 절차를 걸쳐서 배열을 생성한다.
1. 배열의 선언과 사용 배열을 선언하고 생성하는 절차 1. 먼저 배열 참조 변수부터 선언 int[] numbers; // 배열 참조 변수 선언 배열을 new 연산자를 사용하여서 생성 numbers = new int[6]; // 배열 객체 생성 선언만 한 상태에서는 내용이 비어 있음 동적 메모리 공간(Heap)에 배열 객체가 만들어지고 numbers 변수에는 그 객체의 참조값이 할당
1. 배열의 선언과 사용 배열을 선언하고 생성하는 절차 선언과 동시에 생성 가능 어떠한 자료의 배열도 생성가능하다. int[] numbers = new int[6] 어떠한 자료의 배열도 생성가능하다. float[] distances = new float[20]; Char[] letters = new char[50]; Date[] dates = new Date[30]; 배열의 크기를 표시할 때 상수 (또는 일반 변수) 사용 가능 final int SIZE = 31; int SIZE2=40; double[] temperature = new double[SIZE]; double[] temperature2 = new double[SIZE2]; 배열은 일단 생성되면 그 크기를 변경할 수 없다.
1. 배열의 선언과 사용 [주의] 배열의 선언시에 크기 지정은 안됨 배열의 사용 int matrix[5]; //잘못됨 다음과 같은 코드에서 int[] numbers = new int[6] 첫 원소는 numbers[0], 마지막 원소는 numbers[5] 예 numbers[0] = 0; numbers[3] = 30;
1. 배열의 선언과 사용 예제 #1 import java.util.Scanner; ArrayTest1.java import java.util.Scanner; public class ArrayTest1 { public static void main(String[] args) { int[] salary = new int[2]; Scanner scan = new Scanner(System.in); System.out.print("직원1의 월급을 입력하시오: "); salary[0] = scan.nextInt(); System.out.print("직원2의 월급을 입력하시오: "); salary[1] = scan.nextInt(); System.out.println("직원1의 월급은 " + salary[0]); System.out.println("직원2의 월급은 " + salary[1]); }
1. 배열의 선언과 사용 베열의 인덱스 범위 검사 배열 인덱스상 오류가 있다면 컴파일은 잘 되지만 실행시에 다음과 같이 오류 발생 ArrayTest2.java public class ArrayTest2 { public static void main(String[] args) { int[] numbers = new int[10]; numbers[10] = 0; // 인덱스 10은 사용할 수 없다. }
1. 배열의 선언과 사용 배열 초기화 public class ArrayTest3 { ArrayTest3.java public class ArrayTest3 { public static void main(String[] args) { int[] numbers = { 10, 20, 30 }; for (int i = 0; i < numbers.length; i++) System.out.println(numbers[i]); int[] numbers2 = new int[3]; numbers2[0] = 10; numbers2[1] = 20; numbers2[2] = 30; } 배열 선언과 동시에 중괄호를 사용하여 배열 원소의 초기값을 적을 수 있다. 이 경우 new를 사용하지 않아도 초기값 개수 만큼의 배열 객체가 자동으로 생성되고 그 안에 초기값들이 할당된다.
1. 배열의 선언과 사용 또 다른 참조 변수 선언 방법 자바에서는 C언어와 유사하게 배열 참조 변수를 선언할 수 있다. int[] values; // ① 자바 방식 int values[]; // ② C언어 유사 방식 위 두 가지는 100% 동일 여러 개의 배열 변수 선언시 주의 int[] values, grades; // 2개의 변수 모두 배열로서 선언됨 int values, grades[]; // values는 int 변수, grades만 배열 변수 int values[], grades[]; // 2개의 변수 모두 배열로서 선언됨
2. 배열의 사용예 사용자에게 5명의 성적을 입력받아 평균을 출력 import java.util.Scanner; ArrayTest4.java import java.util.Scanner; public class ArrayTest4 { public static void main(String[] args) { final int STUDENTS = 5; int total = 0; Scanner scan = new Scanner(System.in); int[] scores = new int[STUDENTS]; for (int i = 0; i < STUDENTS; i++) { System.out.print("성적을 입력하시오:"); scores[i] = scan.nextInt(); } for (int i = 0; i < STUDENTS; i++) total += scores[i]; System.out.println("평균 성적은" + total / STUDENTS + "입니다");
배열의 크기는 length라는 필드로 알 수 있습니다. 2. 배열의 사용예 배열의 크기 for-each 루프 Java 1.5 부터 지원 위 코드는 반복이 진행되면서 첫 번째 원소부터 마지막 원소까지 차례대로 value에 대입되면서 for 문의 몸체가 수행된다. 배열의 크기는 length라는 필드로 알 수 있습니다. int[] numbers = new int[100]; for(int i=0; i < numbers.length; i++) numbers[i] = (int)(Math.random()*1000); for (int value: numbers) System.out.println(value);
2. 배열의 사용예 난수 발생 및 출력 예제 [a, b) 의 정수를 난수로 발생시킬 때의 구문 Numbers.java public class Numbers { public static void main(String[] args) { int[] numbers = new int[5]; for (int i = 0; i < numbers.length; i++) numbers[i] = (int) (Math.random()*1000); for (int value : numbers) System.out.println(value); } Math.random() 메소드는, “0.0 이상에서 1.0 미만 (greater than or equal to 0.0 and less than 1.0)”의 실수를 임의의로 발생시킴 numbers[i] = (int) (Math.random()*(b-a)) + a;
2. 배열의 사용예 for~each 활용 예제 배열의 모든 원소를 처리하는 경우엔 for ~ each 구문이 좋다. 배열의 크기에 신경쓰지 않아도 되고 인덱스 변수 생성이 필요 없다. for~each 구문이 적합하지 않은 경우 배열 원소의 값을 변경하는 경우 역순으로 배열 원소를 처리하는 경우 일부 원소만을 출력하는 경우 두 개 이상의 배열을 처리하는 경우 Strings2.java public class Strings2 { public static void main(String[] args) { String[] strings = { "Java", "C", "C++" }; for (String s : strings) System.out.println(s); }
2. 배열의 사용예 사용자가 배열의 크기를 지정 import java.util.Scanner; ScoreTest.java import java.util.Scanner; public class ScoreTest { public static void main(String[] args) { int total = 0; int size; Scanner scan = new Scanner(System.in); System.out.print("배열의 크기를 입력하시오:"); size = scan.nextInt(); int[] scores = new int[size]; for (int i = 0; i < size; i++) { System.out.print("성적을 입력하시오:"); scores[i] = scan.nextInt(); } for (int i = 0; i < size; i++) total += scores[i]; System.out.println("평균 성적은" + total / size + "입니다");
3. 메소드와 배열 메소드의 매개 변수로 배열 전달 역시 call by value로 처리 하지만 주소가 복사되기 때문에 call by reference 효과가 발생
3. 메소드와 배열 메소드의 매개 변수로 배열 전달 사용 예 import java.util.Scanner; ScoreTest1.java import java.util.Scanner; public class ScoreTest1 { final static int STUDENTS = 5; public static void main(String[] args) { int[] scores = new int[STUDENTS]; getValues(scores); getAverage(scores); } private static void getValues(int[] array) { Scanner scan = new Scanner(System.in); for (int i = 0; i < array.length; i++) { System.out.print("성적을 입력하시오:"); array[i] = scan.nextInt(); private static void getAverage(int[] array) { int total = 0; for (int i = 0; i < array.length; i++) total += array[i]; System.out.println("평균 성적은 " + total / array.length + "입니다"); }
3. 메소드와 배열 메소드의 반환값으로 배열 전달 메소드가 반환값으로 배열을 전달 할 수 있다. 이 때에도 배열 참조값이 복사됨 Test.java import java.util.Scanner; public class Test { public static void main(String[] args) { int[] array; array = getData(); printData(array); } private static int[] getData() { int[] testData = { 10, 20, 30, 40, 50 }; return testData; private static void printData(int[] array) { for (int i = 0; i < array.length; i++) System.out.println(array[i]);
4. 객체들의 배열 객체들의 배열에서는 객체에 대한 참조값을 각 원소가 저장 배열 객체 생성 배열에 객체 할당 Car[] cars = new Car[6]; 배열에 객체 할당 cars[0] = new Cars(); cars[1] = new Cars(); For루프를 이용한 객체 할당 for (int i; i < cars.length; i++) cars[i] = new Car();
4. 객체들의 배열 객체들의 배열 예제 import java.util.Scanner; class Car { CarTest.java import java.util.Scanner; class Car { public int speed // 속도 public int mileage // 주행거리 public String color // 색상 public Car() { speed = mileage = 0; color = "red"; } public void speedUp() { // 속도 증가 메소드 speed += 10; public String toString() { // 객체의 상태를 문자열로 반환하는 메소드 return "속도: " + speed + " 주행거리: " + mileage + " 색상: " + color;
4. 객체들의 배열 객체들의 배열 예제 (계속) public class CarTest { CarTest.java public class CarTest { public static void main(String[] args) { final int NUM_CARS = 5; Car[] cars = new Car[NUM_CARS]; for (int i = 0; i < cars.length; i++) cars[i] = new Car(); cars[i].speedUp(); System.out.println(cars[i]); }
5. 2차원 배열 2차원 배열 생성 2차원 배열의 값 할당 및 출력 for (int i=0; i < 3; i++) for (int j=0; j < 5; j++) s[i][j] = 0; System.out.println(s[i][j]);
5. 2차원 배열 2차원 배열 예제 Rainfall.java import java.util.Scanner; public class Rainfall { public static void main(String[] args) { final int YEARS = 3; QUARTERS = 4; double[][] rain = new double[YEARS][QUARTERS]; Scanner scan = new Scanner(System.in); for (int y = 0; y < YEARS; y++) { for (int q = 0; q < QUARTERS; q++) { System.out.print(y + "차년도" + q + "분기 강수량: "); rain[y][q] = scan.nextDouble(); } double total = 0.0; total += rain[y][q]; System.out.println(y + "차년도 강수량은 " + total);
5. 2차원 배열 2차원 배열의 초기화 예제 ArrayTest5.java import java.util.Scanner; public class ArrayTest5 { public static void main(String[] args) { int[][] array = { { 10, 20, 30, 40 }, { 50, 60, 70, 80 }, { 90, 100, 110, 120 } }; for (int r = 0; r < array.length; r++) { for (int c = 0; c < array[r].length; c++) { System.out.println(r + "행" + c + "열:" + array[r][c]); }
5. 2차원 배열 톱니형 배열 (Ragged Array) 2차원 배열에서 각 행의 크기를 다르게 할 수 있음 내부적으로 2차원 배열의 각 행은 다시 배열로 취급 메모리 절약 가능 각 행을 나타내는 배열의 length 값은 다를 수 있다. int[][] raggedArray = new int[3][]; raggedArray[0] = new int[3]; raggedArray[1] = new int[4]; raggedArray[2] = new int[5]; for (int i=0; i < raggedArray.length; i++) { System.out.println(i + “행의 길이는 “ + raggedArray[i].length); }
5. 2차원 배열 톱니형 배열 (Ragged Array) 다차원 배열 for (int i=0; i < 3; i++) for (int j=0; j < 5; j++) s[i][j] = 0; System.out.println(s[i][j]); for (int i=0; i < s.length; i++) for (int j=0; j < s[i].length; j++) s[i][j] = 0; System.out.println(s[i][j]); double[][] sales = new double[3][2][12];
6. 배열의 응용: 정렬과 탐색 정렬의 개념 정렬(Sorting)은 데이터를 크기순으로 오름차순(Ascending order)이나 내림차순(Descending order)로 나열하는 것 예 책들을 제목순이나 저자순, 발간연도순으로 정렬 사람을 나이나 키, 이름등으로 정렬
6. 배열의 응용: 정렬과 탐색 선택 정렬 (Selection Sorting) 원 데이터 중에서 가장 큰(또는 작은) 것을 선택하여 뒤의 알맞은 위치로 보내는 방식
6. 배열의 응용: 정렬과 탐색 선택 정렬 (Selection Sorting) 하나의 배열로 구현할 때 원소의 개수가 N일 때 N-1만큼의 반복 필요
6. 배열의 응용: 정렬과 탐색 선택 정렬 (Selection Sorting) 코딩 예 SelectionSort.java public class SelectionSort { public static void selectionSort(int[] list) { int temp, least; for (int i = 0; i < list.length - 1; i++) { least = i; for (int j = i + 1; j < list.length; j++) if (list[j] < list[least]) least = j; // 최소값 탐색 // i번째 원소와 least 위치의 원소를 교환 temp = list[i]; list[i] = list[least]; list[least] = temp; }
6. 배열의 응용: 정렬과 탐색 선택 정렬 (Selection Sorting) 코딩 예 SelectionSort.java public static void main(String[] args) { int[] numbers = new int[1000]; for (int i = 0; i < numbers.length; i++) numbers[i] = (int) (Math.random()* (1000 - 1)) + 1; System.out.println("Before Sorting"); for (int value : numbers) System.out.print(value + " "); selectionSort(numbers); System.out.println("\nAfter Sorting"); }
6. 배열의 응용: 정렬과 탐색 탐색의 개념 목적하는 데이터의 검색 및 취득 이진 탐색 (Binary Search) 탐색키 (Search Key): 예 – 65, Random array: sequential search Sorted array: binary search 35 38 70 75 12 25 18 54 65 90 86 pivot (혹은 middle) 의 개념 중요 pivot 12 18 25 35 38 54 65 70 75 86 90 1st step 2nd step 3rd step 4rd step found!!
6. 배열의 응용: 정렬과 탐색 이진 탐색 (Binary Search) 탐색키 (Search Key): 예 - 30 pivot (middle)= 7 pivot (middle)= 20 pivot (middle)= 30
6. 배열의 응용: 정렬과 탐색 이진 탐색 (Binary Search) 탐색키 (Search Key): 예 - 34 pivot (middle)= 27 pivot (middle)= 38 pivot (middle)= 30 pivot (middle)= 34
6. 배열의 응용: 정렬과 탐색 이진 탐색 (Binary Search) 코딩 예 BinarySearch.java public class BinarySearch { public static int binarySearch(int[] list, int key) { int low, high, middle; low = 0; high = list.length - 1; while (low <= high) { // 아직 숫자들이 남아있으면 middle = (low + high) / 2; // 중간 요소 결정 if (key == list[middle]) return middle; // 일치하면 탐색 성공 else if (key > list[middle]) low = middle + 1; // 중간 원소보다 크다면 else high = middle - 1; // 중간 원소보다 작다면 } return -1; public static void selectionSort(int[] list) { …
6. 배열의 응용: 정렬과 탐색 이진 탐색 (Binary Search) 코딩 예 BinarySearch.java public static void main(String[] args) { int[] numbers = new int[1000]; for (int i = 0; i < numbers.length; i++) numbers[i] = (int) (Math.random()* (1000 - 1)) + 1; System.out.println("Before Sorting"); for (int value : numbers) System.out.print(value + " "); selectionSort(numbers); System.out.println("\nAfter Sorting"); int retValue = binarySearch(numbers, 30); if (retValue != -1) System.out.println("\n위치 " + retValue + " 에서 발견"); else System.out.println("\n탐색 실패"); }