[INA470] Java Programming Youn-Hee Han

Slides:



Advertisements
Similar presentations
멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Advertisements

5 장 조건과 반복 ②. Contents Counting and Looping [while 문 사용 ] Powers of 2 [while 문 사용 ] More Guessing [do 문 사용 ] Election Day [do 문 사용 ] Finding Maximum &
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
어서와 Java는 처음이지! 제3장선택과 반복.
프로그래밍 개론 Ⅰ 제 3장. 클래스와 객체의 사용 ①.
제 7주 2015년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
객체지향 프로그래밍.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
7장 배열 ②.
어서와 Java는 처음이지! 제4장 배열.
Java Seminar 6.
Java Presentation 중간 시험2 풀이
시스템 생명 주기(System Life Cycle)(1/2)
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 1 강원대학교 컴퓨터과학전공 문양세.
윤 홍 란 제3장 클래스와 객체의 사용-1 윤 홍 란
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
명품 JAVA Programming 제 7 장 제네릭과 컬렉션.
명품 JAVA Essential.
명품 JAVA Essential.
Java RMI (Remote Method Invocation)
명품 JAVA Essential.
명품 JAVA Programming 제 4 장 클래스와 객체.
[INA470] Java Programming Youn-Hee Han
시스템 생명 주기(System Life Cycle)(1/2)
7장 배열 ②.
Power Java 제10장 배열.
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
명품 JAVA Essential.
명품 Java Programming.
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
윤 홍 란 4 장 클래스 작성 윤 홍 란
Chapter 9 정렬(sorting) SANGJI University Kwangman KO
5장 조건과 반복 ①.
주소록 프로그램.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
7장 배열 ①.
6장 객체-지향 설계 ①.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
12 검색.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
5장 조건과 반복 ②.
제2장 데이터 및 수식.
6장 객체-지향 설계 ①.
어서와 Java는 처음이지! 제4장 배열 IT응용시스템공학과 김형진 교수.
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
알고리즘(Algorithm)  알고리즘 개요 (효율, 분석, 차수) Part 년 봄학기
[CPA340] Algorithms and Practice Youn-Hee Han
[INA470] Java Programming Youn-Hee Han
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
자바 5.0 프로그래밍.
5장 조건과 반복 ①.
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
CHAP 12:탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2005.
CHAP 12 : 탐색.
CHAP 12 : 탐색 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
강의 #11 탐색(Search).
탐색 선형 탐색, 이진 탐색, 이진 탐색 트리.
Lecture 05 문자열, 배열, 디버깅 Kwang-Man Ko
자바 암호 프로그래밍 Java Cryptography Programming
Presentation transcript:

[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탐색 실패"); }