Download presentation
Presentation is loading. Please wait.
1
[INA470] Java Programming Youn-Hee Han http://link.kut.ac.kr
10. 배열 [INA470] Java Programming Youn-Hee Han
2
1. 배열의 선언과 사용 배열(array): 같은 타입의 변수들을 인덱스화 하여 모아 관리하는 것
Java에서 배열은 객체이다 !!!. 즉, 객체를 생성하는 것과 유사한 절차를 걸쳐서 배열을 생성한다.
3
1. 배열의 선언과 사용 배열을 선언하고 생성하는 절차 1. 먼저 배열 참조 변수부터 선언
int[] numbers; // 배열 참조 변수 선언 배열을 new 연산자를 사용하여서 생성 numbers = new int[6]; // 배열 객체 생성 선언만 한 상태에서는 내용이 비어 있음 동적 메모리 공간(Heap)에 배열 객체가 만들어지고 numbers 변수에는 그 객체의 참조값이 할당
4
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]; 배열은 일단 생성되면 그 크기를 변경할 수 없다.
5
1. 배열의 선언과 사용 [주의] 배열의 선언시에 크기 지정은 안됨 배열의 사용 int matrix[5]; //잘못됨
다음과 같은 코드에서 int[] numbers = new int[6] 첫 원소는 numbers[0], 마지막 원소는 numbers[5] 예 numbers[0] = 0; numbers[3] = 30;
6
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]); }
7
1. 배열의 선언과 사용 베열의 인덱스 범위 검사 배열 인덱스상 오류가 있다면 컴파일은 잘 되지만 실행시에 다음과 같이 오류 발생 ArrayTest2.java public class ArrayTest2 { public static void main(String[] args) { int[] numbers = new int[10]; numbers[10] = 0; // 인덱스 10은 사용할 수 없다. }
8
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를 사용하지 않아도 초기값 개수 만큼의 배열 객체가 자동으로 생성되고 그 안에 초기값들이 할당된다.
9
1. 배열의 선언과 사용 또 다른 참조 변수 선언 방법 자바에서는 C언어와 유사하게 배열 참조 변수를 선언할 수 있다.
int[] values; // ① 자바 방식 int values[]; // ② C언어 유사 방식 위 두 가지는 100% 동일 여러 개의 배열 변수 선언시 주의 int[] values, grades; // 2개의 변수 모두 배열로서 선언됨 int values, grades[]; // values는 int 변수, grades만 배열 변수 int values[], grades[]; // 2개의 변수 모두 배열로서 선언됨
10
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 + "입니다");
11
배열의 크기는 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);
12
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;
13
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); }
14
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 + "입니다");
15
3. 메소드와 배열 메소드의 매개 변수로 배열 전달 역시 call by value로 처리
하지만 주소가 복사되기 때문에 call by reference 효과가 발생
16
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 + "입니다"); }
17
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]);
18
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();
19
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;
20
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]); }
21
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]);
22
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);
23
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]); }
24
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); }
25
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];
26
6. 배열의 응용: 정렬과 탐색 정렬의 개념 정렬(Sorting)은 데이터를 크기순으로 오름차순(Ascending order)이나 내림차순(Descending order)로 나열하는 것 예 책들을 제목순이나 저자순, 발간연도순으로 정렬 사람을 나이나 키, 이름등으로 정렬
27
6. 배열의 응용: 정렬과 탐색 선택 정렬 (Selection Sorting)
원 데이터 중에서 가장 큰(또는 작은) 것을 선택하여 뒤의 알맞은 위치로 보내는 방식
28
6. 배열의 응용: 정렬과 탐색 선택 정렬 (Selection Sorting) 하나의 배열로 구현할 때
원소의 개수가 N일 때 N-1만큼의 반복 필요
29
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; }
30
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()* ( )) + 1; System.out.println("Before Sorting"); for (int value : numbers) System.out.print(value + " "); selectionSort(numbers); System.out.println("\nAfter Sorting"); }
31
6. 배열의 응용: 정렬과 탐색 탐색의 개념 목적하는 데이터의 검색 및 취득 이진 탐색 (Binary Search) 탐색키 (Search Key): 예 – 65, Random array: sequential search Sorted array: binary search pivot (혹은 middle) 의 개념 중요 pivot 1st step 2nd step 3rd step 4rd step found!!
32
6. 배열의 응용: 정렬과 탐색 이진 탐색 (Binary Search) 탐색키 (Search Key): 예 - 30
pivot (middle)= 7 pivot (middle)= 20 pivot (middle)= 30
33
6. 배열의 응용: 정렬과 탐색 이진 탐색 (Binary Search) 탐색키 (Search Key): 예 - 34
pivot (middle)= 27 pivot (middle)= 38 pivot (middle)= 30 pivot (middle)= 34
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) { …
35
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()* ( )) + 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탐색 실패"); }
Similar presentations