Download presentation
Presentation is loading. Please wait.
1
어서와 Java는 처음이지! 제4장 배열
2
배열이 필요한 이유 예를 들어서 학생이 10명이 있고 이들의 성적의 평균을 계산한다고 가정하자. 학생이 10명이므로 10개의 변수가 필요하다. 하지만 만약 학생이 100명이라면 어떻게 해야 하는가? int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9,…,s99;
3
배열의 개념 배열(array): 동일한 타입의 변수들의 모임
4
배열을 만드는 절차 먼저 배열 참조 변수부터 선언 배열을 new 연산자를 사용하여서 생성
int intArray [5]; // 크기 지정 안됨 먼저 배열 참조 변수부터 선언 배열을 new 연산자를 사용하여서 생성
5
배열의 인덱스 다음과 같은 배열을 가정하자. 배열 요소에는 번호가 붙어 있는데 이것을 인덱스(index)라고 부른다.
첫 번째 요소의 번호는 0이고, 마지막 요소의 번호는 9가 된다.
6
인덱스를 통한 요소의 접근 배열은 변수들이 모인 것이니, 배열을 이루고 있는 배열 요소는 하나의 변수로 생각하면 된다.
배열의 첫 번째 요소에 80을 저장하려면 다음과 같이 한다.
7
배열은 객체로 관리 int intArray []; intArray = new int[5]; 5
7 int intArray []; intArray = new int[5]; int size = intArray.length; // size는 5 intArray[0] int length 5 intArray 배열객체 length 필드를 이용하여 배열의 모든 값을 출력하는 사례 for(int i=0; i<intArray.length; i++) // intArray 배열 크기만큼 루프를 돈다. System.out.println(intArray[i]);
8
함수 호출시 C/C++와 자바 배열 전달 비교 C/C++ 경우, 배열과 크기를 각각 전달 받음 자바 경우, 배열만 전달받음
8 C/C++ 경우, 배열과 크기를 각각 전달 받음 자바 경우, 배열만 전달받음 int sum(int x[], int size) { int n, s=0; for(n=0; n<size; n++) s += x[n]; return s; } 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, 5); int a[] ={1,2,3,4,5}; int n = sum(a); 자바가 C/C++에 비해 배열을 다루기 편한 구조임
9
예제: 반복문과 배열 크기가 10인 정수형 배열을 생성하고 여기에 0부터 9까지의 값으로 배열을 채우는 프로그램을 살펴보자.
public class ArrayTest1 { public static void main(String[] args) { int[] s = new int[10]; for (int i = 0; i < s.length; i++) { s[i] = i; } System.out.print(s[i] + " ");
10
LAB: 성적 평균 계산하기
11
SOLUTION import java.util.Scanner; public class ArrayTest2 {
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 < scores.length; i++) { System.out.print("성적을 입력하시오:"); scores[i] = scan.nextInt(); } for (int i = 0; i < scores.length; i++) total += scores[i]; System.out.println("평균 성적은" + total / STUDENTS + "입니다");
12
배열의 인덱스 범위 프로그래머가 인덱스가 범위를 벗어나지 않았는지를 확인하고 책임을 져야 한다.
13
배열의 초기화
14
LAB: 문자열 배열
15
SOLUTION public class PizzaTopping {
public static void main(String[] args) { String[] toppings = { "Pepperoni", "Mushrooms", "Onions", "Sausage", "Bacon" }; for (int i = 0; i < toppings.length; i++) { System.out.print(toppings[i] + " "); }
16
LAB: 최대값과 최소값 구하기 인터넷에서 특정한 상품(예를 들어서 TV)을 구입하고자 한다. 인터넷에서 판매되는 가격이 1차원 배열 prices[]에 저장되어 있다고 가정했을 때, 어떻게 하면 최소가격으로 상품을 구입할 수 있을까?
17
LAB:최소값 알고리즘 최소값을 구할 때는 일단 배열의 첫 번째 요소를 최소값으로 가정
18
SOLUTION public class GetMin {
public static void main(String[] args) { int s[] = { 12, 3, 19, 6, 18, 8, 12, 4, 1, 19 }; int minimum; minimum = s[0]; for (int i = 1; i < s.length; i++) { if (s[i] < minimum) minimum = s[i]; } System.out.print("최소값은 " + minimum);
19
실습 최대값 구하기(GetMax)
20
LAB: 특정한 값 찾기 순차 탐색(sequential search)은 탐색 방법 중에서 가장 간단하고 직접적인 탐색 방법이다. 순차 탐색은 배열의 원소를 순서대로 하나씩 꺼내서 탐색키와 비교하여 원하는 값을 찾아가는 방법이다.
21
LAB: 순차탐색 알고리즘 배열의 원소를 순서대로 하나씩 꺼내서 탐색키와 비교하여 원하는 값을 찾아가는 방법
22
SOLUTION import java.util.Scanner; public class SeqSearch {
public static void main(String[] args) { int s[] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; int value, index = -1; Scanner scan = new Scanner(System.in); System.out.print("탐색할 값을 입력하시오: "); value = scan.nextInt(); for (int i = 0; i < s.length; i++) { if (s[i] == value) index = i; } if (index < s.length && index >= 0) System.out.println("" + value + "값은 " + index + "위치에 있습니다.");
23
LAB: 주사위 던지기
24
SOLUTION public class RollDice {
public static void main(String[] args) { final int SIZE = 6; int freq[] = new int[SIZE]; for (int i = 0; i < 10000; i++) ++freq[(int) (Math.random() * SIZE)]; System.out.println("===================="); System.out.println("면빈도"); for (int i = 0; i < SIZE; i++) System.out.println("" + (i + 1) + "\t" + freq[i]); }
25
LAB: 극장 예약 시스템
26
SOLUTION import java.util.Scanner; public class TheaterReserve {
public static void main(String args[]) { final int size = 10; int[] seats = new int[size]; while (true) { System.out.println(" "); for (int i = 0; i < size; i++) System.out.print(i+1 + " "); System.out.println("\n "); System.out.print(seats[i] + " ");
27
SOLUTION System.out.print("원하시는 좌석번호를 입력하세요(종료는 -1): ");
Scanner scan = new Scanner(System.in); int s = scan.nextInt(); if (s == -1) break; if (seats[s-1] == 0) { seats[s-1] = 1; System.out.println("예약되었습니다."); } else { System.out.println("이미 예약된 자리입니다.");
28
실습 {1.0, 2.0, 3.0, 4.0} 과 같은 초기값을 가지는 double형의 배열을 생성한다. 모든 배열 요소를 출력한 후에 모든 요소를 더하여 합을 출력하고 요소 중에서 가장 큰 값을 찾아서 출력하는 프로그램을 작성하라. 합은 10.0 최대값은 4.0
29
무명 배열 자바에서는 배열의 이름을 지정하지 않고 단순히 초기값만으로 배열을 생성시킬 수있다.
무명 배열(anonymous arrays)은 즉시 배열을 만들어서 함수의 인수로 전달하고자 할 때 많이 사용된다.
30
무명 배열의 예
31
for-each 루프 향상된 루프 구조
32
for-each 루프의 예
33
for-each 루프:예제 String 배열 s
34
for-each 루프 // AS-IS : for (int i = 0; i < a.length; i++) { doSomething(a[i]); } // TO-BE : for (Element e : elements) { doSomething(e); }
35
for-each 루프
36
for-each 루프 for each 루프를 사용할 수 없는 경우 배열 원소의 값을 변경하는 경우
역순으로 배열을 처리하는 경우 일부 원소만을 처리하는 경우 하나의 반복문에서 두 개 이상의 배열을 처리하는 경우 전통적인 for 문 사용!!
37
배열의 복사 배열 참조 변수의 복사
38
import java.util.Arrays
배열의 복사 한 배열의 모든 값을 다른 배열로 복사하고 싶다면 Arrays 클래스의 copyOf() 메소드를 사용 (예) int [] list_copy = Arrays.copyOf(list, list.length); import java.util.Arrays
39
main() 매개 변수
40
명령어 프롬프트
41
main() 메소드 public static void main(String [] args) { } main()의 메소드 특징
41 public static void main(String [] args) { } 다른 클래스에서 메소드 접근 허용 객체 생성전부터 호출 가능 리턴 값 없음 문자열 배열 인자 main()의 메소드 특징 자바 응용프로그램은 main()에서 부터 시작 public 속성 static 속성 리턴 타입은 void 인자는 문자열 배열(String [])로 전달
42
main(string [] args) 메소드의 인자 전달
42 C:\>java Hello abc 3 % 5.7 생성 “abc” “3” “%” “5.7” class Hello args 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.length => 4 args[0] => “abc” args[1] => “3 args[2] => “%” args[3] => “5.7”
43
이클립스에서 main() 메소드 인자전달 43 Run 메뉴의 Run Configurations 항목에서 main() 메소드의 인자를 나열
44
main()의 인자 이용 예 public class Calc {
44 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);
45
배열 정렬 (Sorting) 배열에 저장된 숫자를 크기 순으로 정렬하려면 Arrays.sort() 사용
46
배열 정렬
47
배열 정렬
48
2차원 배열
49
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}};
50
2차원 배열의 length 필드 2차원 배열의 length i.length -> 2차원 배열의 행의 개수로서 2
50 length 5 i[0] int[][] i = new int[2][5]; int size1 = i.length; //2 int size2 = i[0].length; //5 i[0][0] i[0][1] i[0][2] i[0][3] i[0][4] i length 2 i[1] i[1][0] i[1][1] i[1][2] i[1][3] i[1][4] 2차원 배열의 length i.length -> 2차원 배열의 행의 개수로서 2 i[n].length는 n번째 행의 열의 개수 i[0].length -> 0번째 행의 열의 개수로서 5 i[1].length -> 1번째 행의 열의 개수로서 역시 5
51
2차원 배열 예제
52
예제 : 3년간 매출 총액과 평균 구하기 52 한 회사의 지난 3년간 분기별 매출 총액과 연평균 매출을 구하는 프로그램을 작성하시오. public class SalesRevenue { public static void main (String[] args) { int intArray[][] = {{90, 90, 110, 110}, // 1사분기, 2사분기, 3사분기, 4사분기 {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년간 매출 총액은 이며 연평균 매출은 460.0입니다.
53
LAB: TIC-TAC-TOE 게임 1 2 1 2
54
SOLUTION import java.util.Scanner; public class Tic_Tac_Toe {
public static void main(String[] args) { char[][] board = new char[3][3]; int x, y; Scanner scan = new Scanner(System.in); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) board[i][j] = ' '; // Blank
55
SOLUTION do { for (int i = 0; i < 3; i++) {
System.out.println(" " + board[i][0] + "| " + board[i][1] + "| " + board[i][2]); if (i != 2) System.out.println("---|---|---"); } System.out.print("다음 수의 좌표를 입력하시오: "); x = scan.nextInt(); y = scan.nextInt(); if (board[x][y] != ' ') { System.out.println("잘못된 위치입니다. "); continue; } else board[x][y] = 'X';
56
SOLUTION int i = 0, j = 0; for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) if (board[i][j] == ' ') break; } if (i < 3 && j < 3) board[i][j] = 'O'; } while (true);
57
LAB: 지뢰찾기 게임
58
LAB: 지뢰찾기 게임 10 지뢰 10
59
SOLUTION 1/3만큼 true public class MineSweeper {
public static void main(String[] args) { boolean[][] board = new boolean[10][10]; // 초기값 false for (int i = 0; i < 10; i++) for (int j = 0; j < 10; j++) if( Math.random() < 0.3 ) board[i][j] = true; for (int i = 0; i < 10; i++) { if (board[i][j]) System.out.print("# "); else System.out.print(". "); System.out.println(); } 1/3만큼 true
60
LAB: 랜덤 워크 술에 취한 딱정벌레가 10 X 10 크기의 타일로 구성된 방안에 있다. 딱정벌레는 임의의(랜덤) 위치를 선택하여 여기저기 걸어 다닌다. 딱정 벌레가 지나간 경로를 화면에 표시하여 보자.
61
LAB: 랜덤 워크
62
SOLUTION public class RandomWalk {
public static void main(String[] args) { int x = 5, y = 5; boolean tile[][] = new boolean[10][10]; // 초기화 false int steps; tile[5][5] = true; for (steps = 0; steps < 10; steps++) { int direction = (int) (Math.random() * 4); if (direction == 0 && x > 0) x--; else if (direction == 1 && x < 9) x++; else if (direction == 2 && y > 0) y--; else if (y < 9) y++; tile[y][x] = true;
63
SOLUTION System.out.println("--------------------------");
for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (tile[i][j] == true) System.out.print("# "); else System.out.print(". "); } System.out.println(); System.out.println("전체 이동 수는 = " + steps);
64
실습 Random Walk 프로그램을 작성하고 분석해 보자…
65
06 ArrayList 동적배열: 실행 중에 배열 크기가 바뀐다.
ArrayList<String> = new ArrayList<String>(); java.util.ArrayList
66
ArrayList<E> ArrayList<E>의 특성
Collection List 66 ArrayList<E>의 특성 java.util.ArrayList, 가변 크기 배열을 구현한 클래스 <E>에서 E 대신 요소로 사용할 특정 타입으로 구체화 ArrayList에 삽입 가능한 것 객체, null 기본 타입은 박싱/언박싱으로 Wrapper 객체로 만들어 저장 ArrayList에 객체 삽입/삭제 리스트의 맨 뒤에 객체 추가 add(E) 리스트의 중간에 객체 삽입 add(index, E) 임의의 위치에 있는 객체 삭제 가능 remove(index) 벡터와 달리 스레드 동기화 기능 없음 다수 스레드가 동시에 ArrayList에 접근할 때 동기화되지 않음 개발자가 스레드 동기화 코드 작성 ArrayList
67
ArrayList<String>컬렉션의 내부구성
67 ArrayList<String> = new ArrayList<String>(); add()를 이용하여 요소를 삽입하고 get()을 이용하 여 요소를 검색합니다
68
ArrayList<E> 클래스의 주요 메소드
68
69
69 69
70
비정방형 배열 정방형 배열 비정방병 배열(Ragged Array) 각 행의 열의 개수가 같은 배열
70 정방형 배열 각 행의 열의 개수가 같은 배열 비정방병 배열(Ragged Array) 각 행의 열의 개수가 다른 배열 비정방형 배열의 생성 i[0][0] i[0][3] 정방형 i i[3][0] i[3][3] int i[][]; i = new int[4][4]; int i[][]; // 2차원 배열의 레퍼런스 선언 i = new int [4][]; // 각 행의 레퍼런스 배열 생성 i[0] = new int [1]; // 첫 행의 1개 정수 배열 생성 i[1] = new int [2]; // 둘째 행의 2개 정수 배열 생성 i[2] = new int [3]; // 셋째 행의 3개 정수 배열 생성 i[3] = new int [4]; // 네째 행의 4개 정수 배열 생성 비정방형 i i=new int [4][]; i[0] = new int[1]; i[3] = new int[4]; i[0][0] i[1][0] i[1][1] i[3][0] i[3][1] i[3][2] i[3][3]
71
비정방형 배열의 length 비정방형 배열의 length i.length -> 2차원 배열의 행의 개수로서 4
71 i=new int [4][]; i[0] = new int[1]; i[3] = new int[4]; i[0][0] i[1][0] i[1][1] i[3][0] i[3][1] i[3][2] i[3][3] 비정방형 배열의 length i.length -> 2차원 배열의 행의 개수로서 4 i[n].length는 n번째 행의 열의 개수 i[0].length -> 0번째 행의 열의 개수로서 1 i[1].length -> 1번째 행의 열의 개수로서 2 i[2].length -> 2번째 행의 열의 개수로서 3 i[3].length -> 3번째 행의 열의 개수로서 4
72
예제 : 비 정방형 배열의 생성과 접근 다음 그림과 같은 비정방형 배열을 만들어 값을 초기화하고 출력하시오.
72 다음 그림과 같은 비정방형 배열을 만들어 값을 초기화하고 출력하시오. public class IrregularArray { public static void main (String[] args) { int a = 0; int intArray[][] = new int[4][]; intArray[0] = new int[3]; intArray[1] = new int[2]; intArray[2] = new int[3]; intArray[3] = new int[2]; for (int i = 0; i < intArray.length; i++) for (int j = 0; j < intArray[i].length; j++) intArray[i][j] = (i+1)*10 + j; for (int i = 0; i < intArray.length; i++) { System.out.print(intArray[i][j]+" "); System.out.println(); } 20 21 40 41
73
Q & A
Similar presentations