열심히 끝까지
Java1 day04 본문
[4일차 수업 내용]
배열(Array)
* <= 더 많이 쓰인다 의 축약특수문자
============================================================================
1. 배열(Array)
1-1 ) 배열이란?
- 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
- 여기서 중요한 것은 같은 타입이여야 한다는 것
- 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없음.
ex ) int [ ] score = new int[5]; // 5개의 int 값을 저장할 수 있는 배열 생성
1-2 ) 배열의 생성
- 배열을 선언하는 방법은 타입의 변수를 선언하고 변수 또는 타입의 배열임을 의미하는
대괄호[ ]를 붙임
선언 방법 | 선언 예 |
*타입[ ] 변수이름; | int[ ] score; String[ ] names; |
타입 변수이름[ ]; | int score[ ]; String names[ ]; |
* 배열의 생성
- 배열을 선언한 다음에는 배열을 생성
- 배열을 선언한 것은 단지 배열을 다루기 위한 참조변수를 위한 공간이 만들어질 뿐
배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어 짐
타입[ ] 배열이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언)
배열이름 = new 타입[길이]; // 배열을 생성(실제 저장공간을 생성)
1-3 ) 배열의 길이와 인덱스
- 생성된 배열의 각 저장공간을 배열의 요소(element)라고 하며, 배열이름(인덱스)의 형식으로
요소에 접근
- 인덱스(index)는 배열의 요소마다 붙여진 일련번호, 각 요소를 구별하는데 사용
*인덱스의 범위는 0부터 배열의 길이 -1
int[ ] score = new int[8]; // 길이 : 8, 마지막 index : 7
- 배열의 값을 저장하고 읽어오는 방법은 변수와 같음.
- 단, 변수이름 대신 배열이름[인덱스]를 사용한다는 점만 다름
* 배열의 길이
- 배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수
- 배열의 길이는 양의 정수
1-4 ) 배열의 초기화
- 배열은 생성과 동시에 자동적으로 자신의 타입에 해당되는 기본값으로 초기화하므로
배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만 원하는 값을 따로 지정할 수 있음
int[ ] score = new int[8];
score[0] = 5;
score[4] = 12;
score[7] = 6;
int[ ] score = new int[ ]{50, 60, 70, 80, 90}; // 길이 : 5, 마지막 인덱스 : 4
int[ ] score = {50, 60, 70, 80, 90};
- 저장할 값들을 괄호{ }안에 쉼표로 구분해서 나열하면 되고,
괄호 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 배열의 길이는 쓰지 않아도 괜찮음
int[ ] score;
score = new int[ ]{5, 6, 7, 8, 9}; // 가능한 방법
score = {5, 6, 7, 8, 9}; // 에러, 선언과 초기화를 따로 하는 경우, new int[ ] 생략 불가
1-5 ) 배열의 출력
int[ ] arr = {100, 95, 80, 70, 60};
for( int i = 0; i < arr.length; i++ ) { // arr.length : 배열의 길이를 반환
System.out.println( arr[ i ] ); // i : 0, 1, 2, 3, 4
}
// 어제 배운 반복문 중 심화, day03에 자세한 설명 있으니 기억 안나면 다시 볼 것
for( int ele : arr){
System.out.println(ele); // 100, 95, 80, 70, 60
}
1-6 ) 배열의 복사
① for문을 이용한 복사
int[ ] arr = new int[ ]{1, 2, 3, 4, 5);
int[ ] tmp = new int[ arr.length * 2 ]; // 복사할 때, 복사할 배열의 2배가 되어야 에러가 안난다고 함
for(int i = 0; i < arr.length; i++) { // tmp.length(10)를 넣으면 단위가 달라서 에러
tmp[ i ] = arr[ i ];
}
② System.arraycopy()를 이용한 배열의 복사
- for문 대신 System 클래스의 arraycopy( )를 사용하면 보다 간단하고 빠르게 복사 가능
int[ ] arr = new int[ ]{1, 2, 3, 4, 5};
int[ ] result = new int[ arr.length * 2 ];
System.arraycopy( 복사할 배열, 복사 시작할 인덱스, 복사받을 배열, 복사 받을 인덱스, 복사 길이);
ㄴSystem.arraycopy( arr, 0, result, 0, arr.lengh);
==> arr 배열의 0번 인덱스 값부터 result 배열에 복사
==> 복사를 할 때는 result 배열의 0번 인덱스부터 채워 넣음
==> 이 때 arr 배열의 길이만큼(개수만큼) 복사
Arrays.toString(arr); // [1, 2, 3, 4, 5]
Arrays.toString(result); // [1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
2. 다차원 배열
- 지금까지 우리가 배운 배열은 1차원 배열인데, 2차원 이상의 배열도 선언해서 사용 가능
2-1 ) 2차원 배열 선언과 인덱스
선언 방법 | 선언 예 |
*타입[ ][ ] 변수이름; | int[ ][ ] score; |
타입 변수이름[ ][ ]; | int score[ ][ ]; |
타입[ ] 변수이름[ ]; | int[ ] score[ ]; |
- 2차원 배열은 행과 열로 구성되어 있기 때문에 index가 행과 열에 각각 하나씩 존재
- 행 index의 범위 : 0 ~ 행의 길이-1 / 열 index의 범위 : 0 ~ 열의 길이 -1
- 각 요소에 접근하는 방법은 배열이름[행인덱스][열인덱스]
2-2 ) 2차원 배열의 초기화
- 2차원 배열도 괄호를 사용, 생성과 초기화를 동시에 가능
- 다만, 1차원 배열보다 괄호{ }를 한번 더 써서 행렬로 구분
int[ ][ ] arr = new int[ ][ ]{ {1, 2, 3}, {4, 5, 6} };
int[ ][ ] arr = { {1, 2, 3}, {4, 5, 6} };
배열 예시
package example 01; // 이 뒤로 나오는 package 생략
import java.util.Arrays; // Arrays + ctrl + space
public class ArrayEx01 {
public static void main(String[] args) {
int[ ] score = new int[5]; // 길이 : 5, 마지막 인덱스 : 4
int k = 1;
score[0] = 50;
score[1] = 60;
score[k+1] = 70;
score[2] = 80; // 70 -> 80으로 변환
score[3] = 90;
System.out.println("score : " + Arrays.toString(score));
System.out,println();
int imp = score[k+2] + score[4]; // 90
System.out.println("tmp : " + tmp);
System.out.println();
for(int i = 0; i< score.length; i++) {
System.out.println("각 요소의 값 : " + score[i]);
}
System.out.println();
for(int ele : score) {
System.out.println("각 요소의 값 : " + ele);
}
System.out.println();
// ArrayIndexOutOfBoundsException ==> Index Control (중요!!!!!)
// 혼자서 공부하다보면 자주 마주할 에러 기억해 둘 것
}
}
-----------------------------------------------
import java.util.Arrays;
public class ArrayEx02 {
public static void main(String[] args) {
int[ ] arr1 = new int[10];
int[ ] arr2 = new int[10];
int[ ] arr3 = {100, 95, 80, 70, 60}; // int[ ] arr3 = new int[ ]{100, 95, 80, 70, 60};
char[ ] chArr = {'a', 'b', 'c', 'd', '0'};
for(int i = 0; i < arr1.length; i ++) {
arr1[ i ] = i + 1;
}
for(int i = 0; i < arr1.lengthl i++) {
System.out.print(arr1[ i ] + " "); // 1 2 3 4 5 6 7 8 9 10
}
System.out.println();
for(int i = 0; i < arr2.length; i ++) {
arr2[ i ] = (int)(Math.random() * 10) + 1;
}
for(int ele : arr2 ) {
System.out.print(ele + " ");
}
System.out.println();
System.out.println(Arrays.toString(ccArr));
}
}
-------------------------------------------------
import java.util.Arrays;
public class ArrayEx03 {
public static void main(String[] args) {
// for문을 이용한 복사
int[ ] arr = new int[5];
int[ ] tmp = new int[arr.length * 2];
for(int i = 0; i < arr.length; i++) {
arr[ i ] = (int)(Math.random() * 100) + 1;
}
System.out.println("arr : " + Arrays.toString(arr));
for(int i = 0; i < arr.length; i++) {
tmp[ i ] = arr[ i ];
}
System.out.println("tmp : " + Arrays.toString(tmp));
}
}
-----------------------------------------------------
import java.util.Arrays;
public class ArrayEx04 {
public static void main(String[] args) {
// System.arraycopy()를 이용한 복사
char[ ] abc = {'a', 'b', 'c', 'd'};
char[ ] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
char[ ] result = new char[abc.length + num.length);
System.arraycopy(abc, 0, result, 0, abc.length);
System.out.println("[abc배열을 result에 복사한 후]");
System.out.println("result : " + Arrays.toString(result));
System.arraycopy(num, 0, result, abc.length, num.length);
System.out.println("[num배열을 result에 복사한 후]");
System.out.println("result : " + Arrays.toString(result));
}
}
-----------------------------------------------------
public class ArrayEx05 {
public static void main(String[] args) {
// 총합과 평균 구하기
int[ ] score = {100, 88, 97, 65, 42};
int sum = 0;
double average = 0.0;
// 총점 : 392, 평균 : 78.4
for(int i = 0; i < score.length; i++) {
sum += score[ i ];
}
average = sum / (double)score.length;
System.out.println("총점 : " + sum + ", 평균 : " + average);
}
}
-----------------------------------------------------
public class ArrayEx06 {
public static void main(String[] args) {
// 최댓값과 최솟값 찾기
int[ ] score = {79, 88, 91, 33, 100, 55, 95};
int max = 0;
int min = 0;
max = score[0]; // 최댓값이라고 가정
min = score[0]; // 최솟값이라고 가정
for(int i = 1; i < score.length; i++) {
if(max < score[ i ]) {
max = score[ i ];
}
if(min > score[ i ]) {
min = score[ i ];
}
}
System.out.println("최대값 : "+ max); //100
System.out.println("최솟값 : "+ min); // 33
/*
* i == 1일 때
* max == 79, min == 79, score[1] == 88
* score[1] > max ==> 88 > 79 ==> max = score[1]; ==> max = 88
* score[1] < min ==> 88 < 79 ==> false
*
* i == 2일 때
* max == 88, min == 79, score[2] == 91
* 최종적으로 max == 91, min == 79
*
* i == 3일 때
* max == 91, min == 79, score[3] == 33
* score[3] > max ==> 33 > 91 ==> false
* score[3] < min ==> 33 < 79 ==> min = score[3]; ==> min = 33
*/
}
}
---------------------------------------------------------------
import java.util.Arrays;
public class ArrayEx07 {
public static void main(String[] args) {
// 배열 요소 섞기(shuffle)
int[ ] numArr = new int[10];
for(int i = 0; i < numArr.length; i++) {
numArr[ i ] = i;
}
System.out.println("[섞기 전]");
System.out.println("Arrays.toString(numArr));
System.out.println();
for(int i = 0; i < numArr.length; i++) {
int n = (int)(Math.random() * 10); // 난수의 범위 : 0 ~ 9
//System.out.println("n : " + n); // for 최댓값을 작게 설정해 직접 보는 것도 중요
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] = tmp;
}
System.out.println("[섞은 후]");
System.out.println(Arrays.toString(numArr));
}
}
----------------------------------------------------------
import java.util.Arrays;
public class ArrayEx08 {
public static void main(String[] args) {
// 빈도수 구하기
int[ ] numArr = new int[10];
int[ ] counter = new int[10];
for(int i = 0; i < numArr.length; i++) {
numArr[i] = (int)(Math.random() * numArr.length); // 범위 0 ~ 9
}
System.out.println("배열 : " + Arrays.toString(numArr));
System.out.println();
for(int i = 0; i < numArr.length; i++) {
counter[numArr[i]]++;
}
/* 매번 바뀜
* i == 0
* counter[numArr[0]]++ ==> counter[1]++;
*
* i == 1
* counter[numArr[1]]++ ==> counter[4]++;
*
* i == 5
* counter[numArr[5]]++ ==> counter[9]++;
*
* i == 6
* counter[numArr[6]]++ ==> counter[9]++;
*/
for(int i = 0; i < counter.length; i++) {
System.out.println( i + "의 개수 : " + counter[i]);
}
}
}
----------------------------------------------------------------
import java.util.Arrays;
public class ArrayEx09 {
public static void main(String[] args) {
int[][] arr = new int[][] { {1, 2, 3}, {4, 5, 6}};
System.out.println(arr);
System.out.println(arr.length); // 2
System.out.println(arr[0].length); // 3
System.out.println(Arrays.deepToString(arr));
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
}
'Java1(주말)' 카테고리의 다른 글
Java1 day05 (0) | 2022.04.23 |
---|---|
Java1 day04 보충 (0) | 2022.04.23 |
Java1 day03 보충 (0) | 2022.04.17 |
Java1 day03 (0) | 2022.04.16 |
Java1 day02 보충 2 (0) | 2022.04.16 |