JAVA 프로그래밍 6. 배열과배열리스트 한동일 학습목표 To become familiar with using arrays and array lists To learn about wrapper classes, auto-boxing and the generalized for loop To study common array algorithms To learn how to use two-dimensional arrays To understand when to choose array lists and arrays in your programs To implement partially filled arrays 2/49
자료형 (data type) 자료형 기본형 참조형 숫자형 - 정수형, 실수형 문자형 논리형 배열형 클래스형 인터페이스형 자료형은구조및개념, 값의범위, 연산등을정의. 3/49 참조형 (reference type) 객체를가리키는형 배열 같은형의여러값을저장하는데이용하는자료형 C/C++ 와달리객체로취급 클래스형 클래스이름 객체를가리키는참조형 인터페이스형 인터페이스이름 인터페이스를구현한객체에대한참조 4/49
배열 (Arrays) 순서가있고같은형의원소들의모임 배열사용단계 배열변수선언 배열변수 : 배열을가리키는변수 배열에속한원소의형과차원등을명시 int[] vector1, vector2; double vector3[], data; // data는배열형아님 short matrix[][]; Object[] myarray; 배열객체생성 new 연산자를통해동적으로생성 5/49 배열 아래와같이선언된경우 int[] short Object[] vector1, vector2; matrix[][]; myarray; 배열객체생성예 vector1 = new int[5]; vector2 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // error 발생 matrix = new short[10][100]; myarray = new Point[3]; 혹은배열변수선언과동시에배열할당 초기화는배열선언시 int[ ] vector2 = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int[ [] day = new int[31]; int day[ ] = new int[31]; 6/49
배열 배열변수선언과생성에따른메모리구조 int[] vector ; vector : vector = new int[3] ; vector : vector[0] vector[1] vector[2] 배열의초기값 Numbers : 0 Boolean : false 객체참조 : null 가급적프로그래머가원하는값으로설정이후사용할것 7/49 배열 배열요소의접근 : [] 사용 double[] data = new double[10]; // Fig 8.1 data[2] = 29.95; // Fig 8.2 Figure 8.1: An Array Reference and an Array 8/49 Figure 8.2: Storing a Value in an Array
배열 배열에값저장 배열의인덱스는 0 부터시작 length 필드를통한배열의길이획득 : 메소드아님! 인덱스범위 :0~ length - 1 범위초과 : IndexOutOfBoundException 이발생 int a[ ] = new int[50]; for(int i=0; i < a.length; i++) a[i] = i; double[] data = new double[10]; data[10] = 29.95; // ERROR 9/49 배열리스트 (Array Lists) 배열의제한점 초기에설정한크기로 length 가제한됨 프로그램중간에배열의크기를바꾸기위해서는새로운배열을생성하여복사해야함 배열리스트 (Array Lists) ArrayList 클래스 : 객체를집합적으로다룰수있는도구제공 크기를늘리거나줄이는메소드제공 임의위치의요소 (element) 를삭제하거나추가하는메소드제공 10/49
배열리스트 ArrayList 클래스 : 범용클래스 ArrayList<T> : T형객체들의모임 ArrayList<BankAccount> accounts = new ArrayList<BankAccount>(); accounts.add(new add(new BankAccount(1001)); accounts.add(new BankAccount(1015)); accounts.add(new BankAccount(1022)); T 위치에기본자료형 (ex: int, double) 사용불가 size() method : 배열리스트의크기정보추출 11/49 배열리스트 배열리스트요소 (element) 의추출 get() method 사용 index 는 0에서시작 BankAccount anaccount = accounts.get(2); // gets the third element of the array list 인덱스범위 : 0 ~.size() - 1 int i = accounts.size(); anaccount = accounts.get(i); // Error // legal index values are 0...i-1 12/49
값의할당 배열리스트 set() method 사용 이전값은없어지고새로운값이할당 BankAccount anaccount = new BankAccount(1729); accounts.set(2, anaccount); 객체의추가 : add() method 사용 accounts.add(a) // 배열리스트의마지막에 a 객체추가 accounts.add(i, a) // 배열리스트의 i 위치에 a 객체삽입 ( 그림 8.3 참고 ) 13/49 배열리스트 Figure 8.3: Adding an Element in the Middle of an Array List 14/49
배열리스트 객체의삭제 : remove method 사용 accounts.remove(i) // i 번째인덱스의값을삭제하고크기가 1 줄어듦 Figure 8.4: Removing an Element in the Middle of an Array List 15/49 랩퍼클래스 (Wrapper Class) 기본형에해당하는클래스 int -> Integer, char -> Character, double -> Double 제공하는이유 각형에관련된상수와메소드들에대한홈 (home) 역 할을담당 기본형을객체로다루어야하는경우랩퍼클래스를이용하여기본형에해당하는객체를생성 예 : 배열리스트이용시사용 16/49
랩퍼클래스 ( 포장클래스 ) Wrapper 클래스 Object Number System Integer Character String Byte Short Long Float Boolean Double StringBuffer 17/49 랩퍼클래스 기본형과이와연관된랩퍼클래스 18/49
상수 Boolean Class public static final Boolean TRUE = new Boolean(true) public static ti final Boolean FALSE = new Boolean(false) l 메소드 Boolean(boolean b) : 초기값으로 b 를받아 boolean 객체를만드는생성자 Boolean(String s) : "true" 나 "false" 와같은스트링값을받아 Boolean boolean booleanvalue() : 객체의 boolean 값을리턴 static ti boolean getboolean(string i name) : 시스템속성의 boolean 값을리턴 static Boolean valueof(string s) : 스트링 s에해당하는 Boolean 값을리턴 19/49 상수 Character Class public static final int MAX_RADIX =36 public static final char MAX_VALUE = \ffff public static final int MIN_RADIX =2 public static final char MIN_VALUE = \0000 메소드 Character(char value) : value 값으로객체를초기화하는생성자 char charvalue() : char 형으로변환하는기능 static ti boolean isdigit(char it( h ch) : 숫자인가를판별하는기능 static boolean isletter(char ch) : 문자인가를판별하는기능 static boolean isletterordigit(char ch) : 문자이거나숫자일때참을리턴 20/49
Number Class 추상클래스 (abstract class) Interger, Long, Float, Double 클래스들의슈퍼클래스 형변환에관한메소드가포함. 메소드 abstract int intvalue() : int 형으로변환하는메소드. abstract long longvalue() : long형으로변환하는메소드 abstract float floatvalue() : float형으로변환하는메소드 abstract double doublevalue() : double 형으로변환하는메소드 JAVA API 의 Number클래스참고 21/49 Integer Class 자바의기본형인 int 형을위한기호상수와 int 형을다루는데필요한메소드들을제공 상수 public static final int MAX_VALUE = 2147483647 public static final int MIN_VALUE = -2147483648 JAVA API 의 Integer 클래스참고 22/49
메소드 Integer Class static int parseint(string s) : 문자열로저장된숫자를 int 형으로바꾸는메소드 static int parseint(string s, int radix) : 문자열로저장된숫자를주어진진법의 int 형으로바꾸는메소드 static String tobinarystring(int i) : 2 진수형태의문자열로바꾸는메소드 static String tohexstring(int i) : 16 진수형태의문자열로바꾸는메소드 static Integer valueof(string s) : 문자열로저장된숫자를가지고있는 Integer 객체로바꾸는메소드 int intvalue() : Integer 객체의 int 값을제공하는메소드 23/49 Double Class 상수 public static ti final double MAX_VALUE = 1.79769313486231570e+308 public static final double MIN_VALUE = 4.94065645841246544e- 324 public static final double NaN = 0.0 / 0.0 public static final double NEGATIVE_INFINITY = -1.0 / 0.0 public static final double POSITIVE_INFINITY = 1.0 / 0.0 24/49
메소드 Double Class static long doubletolongbits(double value) : double 형으로표현되어있는비트를 long 형의비트패턴으로바꾸는메소드 static boolean isnan(double v) : 매개변수가 NaN 인지를검사하는메소드 static boolean isinfinite(double v) : 매개변수가무한대인지를검사하는메소드 static Double valueof(string s) : 스트링을 Double 형으로변환하는메소드 25/49 자동포장 (Auto-boxing) 기본데이터형과랩퍼클래스간의변환을자동으로구현 자바버전 50 5.0 부터지원 Double d = 29.95; // auto-boxing; same as Double d = new Double(29.95); double x = d; // auto-unboxing; same as double x = d.doublevalue(); 26/49
자동포장 (Auto-boxing) 자동포장을이용한산술연산 Double e = d + 1; 의미 d 를자동비포장하여 double 형으로변환 1 을더함 결과를새로운 Double 랩퍼객체로자동포장 새롭게만들어진랩퍼객체에대한참조를 e 에저장 27/49 개선된 for 루프 :foreach 배열전체탐색시기존방법 double[] data =...; double sum = 0; for (inti= 0; i< data.length; i++){ double e = data[i]; sum = sum + e; } 위와동일한동작을수행하는 for each 루프 double[] data =...; double sum = 0; for (double e : data) { // You should read this loop as "for each e in data" sum = sum + e; } 28/49
개선된 for 루프 :foreach for each 루프구문 for (Type variable : collection) statement Example: for (double e : data) sum = sum + e; Purpose: To execute a loop for each element in the collection. In each iteration, the variable is assigned the next element of the collection. Then the statement is executed. 배열전체를탐색하지않는경우나 for 루프의 index 를이용해야하는경우는기존방법이용 29/49 개선된 for 루프 :foreach 배열리스트전체탐색시기존방법 double sum = 0; for (int i = 0; i < accounts.size(); i++) { BankAccount a = accounts.get(i); sum = sum + a.getbalance(); } for each 루프 ArrayList<BankAccount> accounts =... ; double sum = 0; for (BankAccount a : accounts) { sum = sum + a.getbalance(); } 30/49
이차원배열 (2-D arrays) 배열의배열 (array of array) 배열의원소가다시배열이되는배열 다차원배열 int[ ][ ] matrix = new int[3][3]; index 쌍으로배열요소접근 matrix [i][j] = 3*i +j; 첫번째차원의크기는반드시명시 행의수획득 : matrix.length ti th 열의수획득 : matrix[0].length, matrix[1].length, 등등 int[ ][ ] matrix = new int[3][ ]; for (int i=0; i < matrix.length; i++) matrix[i] = new int[3]; 31/49 이차원배열 (2-D arrays) 이차원배열의초기화 // int A[ ][ ] = {{0, 1, 2},{ 3, 4, 5}}; int A[ ][ ] = new int[2][3]; for(int i=0; i < 2; i++) for(int j=0; j < 3; j++) A[i][j] = i*3+j; A[0][0] = 0 A[0][1] = 1 A[0][2] = 2 0 행 A[1][0] = 3 A[1][1] = 4 A[1][2] = 5 1 행 0 열 1 열 2 열 32/49
배열의복사 배열변수의복사 배열변수는해당배열에대한참조를저장 따라서참조복사는동일한배열을가리키는또하 나의참조를획득 double[] data = new double[10]; // fill array... double[] prices = data; 33/49 배열의복사 배열변수의복사 Figure 8.7: Two References to the Same Array 34/49
배열의복사 배열의복제 : clone 메소드사용 double[] prices = (double[]) data.clone(); Figure 8.8: Cloning an Array 35/49 배열의복사 배열요소의복사 System.arraycopy(from, fromstart, to, tostart, count); Figure 8.9: The System.arraycopy Method 36/49
배열의복사 배열요소의삽입 System.arraycopy(data, y i, data, i + 1, data.length -i-1); data[i] = x; Figure 8.10: Inserting a New Element Into an Array 37/49 배열의복사 배열요소의제거 System.arraycopy(data, i + 1, data, i, data.length - i - 1); Figure 8.11: Removing an Element from an Array 38/49
배열의복사 배열의크기확장 1 보다큰배열을새로생성 double[] newdata = new double[2 * data.length]; 2 모든요소를새로운배열로복사 System.arraycopy(data, 0, newdata, 0, data.length); 3 배열변수에새로운배열에대한참조저장 data = newdata; 39/49 배열의복사 배열의크기확장 Figure 8.11: Growing an Array 40/49
객체의배열 (Arrays of Object) 병렬배열을만들지말라 // Don't do this int[] accountnumbers; double[] balances; 각요소를객체로구성하고객체의배열이용 BankAccount[] = accounts; 41/49 [ 실습 1] Debug 첨부된 Average.java는 10개의홀수 (1~19) 의평균을구하는코드이다. 에러를바로잡고원하는결과가나오는지확인하라. n 개의홀수의평균을구할수있게코드를수정하라. 42/49
[ 실습 2] 배열리스트 첨부된 NamesTest.java 를보고출력결과를예상하라. Main 메소드의 for 문을 for each 문으로바꾸면서 for each문의용법에대해이해한다. 43/49 [ 실습 3] for each 루프 강의홈페이지의 Bank.java code 의다음메소드들을이해하고 BankTester.java code를이용하여테스트하라. ( 교재 357 페이지참고 ) gettotalbalance() count() getmaximum() 실행결과를확인하고최대, 최소값의탐색, 특정값의탐색방법등을파악하라. getmaximum() 메소드에서 for each 루프를사용하지않은이유는무엇인가? 앞의두메소드에서사용한 for each 루프를 for 루프로변환하여결과를재확인하라. 44/49
[ 실습 4] 배열의복사 강의홈페이지의 ArrayInsertRemove.java 파일을이해하고실행을통하여확인하라. Array copy test 1 부분의출력결과를예측하고주석부분을풀어서예측결과가맞는지확인하라. 틀린경우이유를파악하고잘못이해한부분을확인하라. Array copy test 2 부분의출력결과를예측하고주석부분을풀어서예측결과가맞는지확인하라. 틀린경우이유를파악하고잘못이해한부분을확인하라. 45/49 [ 실습 5] 2-Dim Array 첨부된 Matrix 는행렬곱을구하는코드이다. 참고 : 행렬곱의규칙을찾아반복문으로수정하라. 3*3 행렬의행렬곱을구할수있게수정하라. 같은출력을얻되 Matrix.java 코드에서 print 메소드를없애라. 디버깅시아래의곱셈결과예참고. 46/49
[ 실습 6] 이차원배열 10 행 10 열의이차원배열을사용하여아래와같은출력결과를나타내는프로그램을각각작성하시오. 출력결과 1) 출력결과 2) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 1 1 2 4 7 11 16 22 29 37 46 3 5 8 12 17 23 30 38 47 6 9 13 18 24 31 39 48 10 14 19 25 32 40 49 15 20 26 33 41 50 21 27 34 42 51 28 35 43 52 36 44 53 45 54 55 47/49 [ 실습 7] 배열실습 강의홈페이지의 ArrayTest.java code 를수정하여다음문장이실행된후, data 배열에는어떤요소가저장되는지출력을통해서확인하라. double[] data = new double[10]; for (int i = 0; i < data.length; i++) data[i] = i * i; ArrayTest.java code를수정하여 10개의정수배열을입력받아이를배열에저장한후이를출력하는프로그램을작성하라. ArrayTest.java code 를수정하여 0 ~ 100 사이의정수를랜덤하게 10개발생시키고이를배열에저장한후출력하는프로그램을작성하라. 48/49
[ 실습 8] 배열데이터의표현 [ 실습 7] 에서마지막으로완성된 ArrayTest.java code 와도형그리기기능을통합하여랜덤하게생성된 0 ~ 100 사이의정수 10개를아래그림의왼쪽과같이도표로그리는프로그램을완성하라. 이를수정하여아래그림의오른쪽과같이좀더실제적인도표로완성하라. 49/49