오늘 배열과 배열복사(arraycopy)에 대해서 배워보겠습니다.
목차 | |
1. | 변수 |
2. | 배열 |
3. | 배열 복사 (arraycopy) |
4. | 예제 문제 |
5. | 느낀점 |
1. 변수
2. 배열
/* 배열(Array) : 같은 타입, 같은 의미를 가지는 변수들의 집합 (참조변수)
* 객체를 생성하는 키워드 : new
* - 배열을 선언하는 방법
* 타입 [] 배열이름;
* 타입 배열이름[];
*
* - 선언하고 생성(new) 초기화 하는 방법 : 객체를 생성하면 자동 초기화 해줌.
* 타입 [] 배열이름 = new 타입[길이]; // 가장 많이 사용하는 방식
* 타입 [] 배열이름 = new 타입[]{값, 값, 값, 값};
* 타입 [] 배열이름 = {값, 값, 값, 값}; // 연습할 때 사용
*
* - 배열의 길이는 0 이상이어야 한다.
* - 배열의 시작 번지는 0부터 시작
* - 배열[5] => 0 1 2 3 4
* - index = 배열의 길이 - 1
* - 배열의 길이는 length(총 길이)를 이용하면 배열의 길이를 알 수 있음.
*/
int arr1[]; // 선언만 한 경우
arr1 = new int[5]; // 선언된 변수에 객체 생성(초기화)
int arr2[] = new int[5]; // 가장 일반적인 경우
int arr3[] = new int[] {1,2,3,4,5};
int arr4[] = {6,7,8,9,10};
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println(arr1[3]);
System.out.println(arr1[4]);
arr1[0] = 10;
System.out.println(arr1[0]);
arr1[1] = 11;
arr1[2] = 12;
arr1[3] = 13;
arr1[4] = 14;
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println(arr1[3]);
System.out.println(arr1[4]);
// System.out.println(arr1[5]); // 없는 번지는 error
System.out.println(arr1.length);
for(int i = 0; i < arr1.length; i ++) {
System.out.print(arr1[i] + " ");
}
System.out.println();
System.out.println("---------------");
// arr3을 출력
for(int i = 0; i < arr3.length; i ++) {
System.out.print(arr3[i] + " ");
}
System.out.println();
System.out.println("---------------");
// arr2 짝수만 삽입
for(int i = 0; i < arr2.length; i ++) {
arr2[i] = (i + 1) * 2;
System.out.print(arr2[i] + " ");
}
System.out.println();
System.out.println("---------------");
배열을 사용하는 이유는 관리가 편하고, 반복문을 사용할 수 있기 때문에 많은 양의 데이터를 쉽게 관리할 수 있기 때문입니다.
- 5명의 점수를 입력 받아 배열에 저장하고, 점수, 합계, 평균을 출력해보기
Scanner scan = new Scanner(System.in);
int arr1[] = new int[5];
int sum = 0;
double avg = 0;
System.out.println("점수 입력");
for (int i = 0; i < arr1.length; i ++) {
int msg = scan.nextInt();
if ((msg >= 0) && (msg <= 100)) {
arr1[i] = msg;
sum += arr1[i];
} else {
System.out.println("다시 입력해주세요.");
i --;
}
}
System.out.println("------성적표------");
// 향상된 for문
for(int a : arr1) {
System.out.print(a + " ");
}
avg = sum / (double)arr1.length;
System.out.println("합계: " + sum + ", 평균: " + avg);
scan.close();
※ 향상된 for문에 대하여
기존의 for문은 번지를 비교할 수 있었지만 향상된 for문의 경우에는 번지에 있는 값을 따른 공간에 불러서 이용하기에 번지가 없다. 그렇기에 향상된 for문을 이용하면 for문 안에 있는 객체 값을 전부 다 차례대로 출력한다.
▣ 문자 배열
// 문자 배열
String arr[] = new String[5];
arr[0] = "hong";
arr[1] = "kim";
arr[2] = "lee";
arr[3] = "park";
arr[4] = "choi";
// 일반 for문을 이용하여 arr 출력
for (int i = 0; i < arr.length; i ++) {
System.out.print(arr[i] + " ");
}
System.out.println("");
// 향상된 for문을 이용하여 arr 출력
for (String temp : arr) {
System.out.print(temp + " ");
}
3. 배열 복사
/* 배열은 처음 선언할 때 정한 개수를 변경할 수 없음.
* 배열은 추가 / 삭제 불가능.
* 배열의 값을 추가하려면 기존 배열을 버리고, 더 큰 배열로 교체
*/
// 한 배열을 공유
int arr[] = new int[] {1,2,3,4};
int arr1[] = arr;
int arr2[] = new int[5];
arr[0] = 10;
arr1[1] = 20;
// arr 출력
for(int i : arr) {
System.out.print(i + " ");
}
System.out.println();
// arr1 출력
for(int i : arr1) {
System.out.print(i + " ");
}
System.out.println();
// arr를 arr2로 복사
for(int i = 0; i < arr.length; i ++) {
arr2[i] = arr[i];
}
arr[0] = 100;
for(int i : arr1) {
System.out.print(i + " ");
}
System.out.println();
for(int i : arr2) {
System.out.print(i + " ");
}
▣ System.arraycopy
int arr[] = new int[] {50, 78, 48, 59, 63};
int arr1[] = new int[] {85, 97, 58};
// 두 개의 배열을 합쳐 하나의 배열로 생성 후 출력
int arr2[] = new int[arr.length + arr1.length];
System.arraycopy(arr, 0, arr2, 0, arr.length);
System.arraycopy(arr1, 0, arr2, arr.length, arr1.length);
for(int i : arr2) {
System.out.print(i + " ");
}
▣ 랜덤 생성
/* arr1 숫자 10개를 담을 수 있는 배열 생성
* 1 ~ 50까지의 랜덤수를 추출하여 입력 후 출력
*/
int arr1[] = new int[10];
for (int i = 0; i < arr1.length; i ++) {
int ran = (int)((Math.random()*50)+1);
arr1[i] = ran;
}
for (int tmp : arr1) {
System.out.print(tmp + " ");
}
▣ 숫자 정렬(오름차순, 내림차순)
// 정렬하여 출력
/* 작은 수부터 = 오름차순
* 큰 수부터 = 내림차순
* 8 41 19 35
*
*/
System.out.println();
System.out.println("---정렬 후--");
for (int i = 0; i < arr1.length - 1; i ++) { // n번째하고 n+1번째랑 비교해야하기 때문에 (length-1)번째까지 해야함
for(int j = i + 1; j < arr1.length; j ++) {
if(arr1[i] > arr1[j]) { // 오름차순 > / 내림차순 <
// 두 수의 교환
int tmp = arr1[i];
arr1[i] = arr1[j];
arr1[j] = tmp;
}
}
}
for(int a : arr1) {
System.out.print(a + " ");
}
▣ 랜덤으로 섞기
/* 정렬되어있는 arr 배열을 섞는 코드
* 랜덤 번지를 선택하여 순차적으로 하나씩 교환
* 0 ~ 9번지를 랜덤으로 출력
* (int)(Math.random()*10);
*/
for(int i = 0; i < arr.length; i ++) {
int r = (int)(Math.random()*10);
int tmp =arr[i];
arr[i] = arr[r];
arr[r] = tmp;
}
System.out.println();
System.out.println("--arr 교환 후--");
for(int a : arr) {
System.out.print(a + " ");
}
▣ 다차원 배열
/* 2차원 배열
* 10 20 30
* 40 50 60
* 70 80 90
* 100 110 120
* 130 140 150
* 자료형 배열명[][] = new 자료형[5][3]; // 5행 3열
*/
int arr[][] = new int[5][3];
int cnt = 1;
for(int i = 0; i < arr.length; i ++) { // 0 ~ 4행 반복
for(int j = 0; j < arr[0].length; j ++) { // 첫 행의 열 length
arr[i][j] = cnt*10;
cnt++;
System.out.print(arr[i][j] + " ");
}
System.out.println(); // 한 행마다 줄바꿈
}
4. 예제 문제
◎ 문제 1번
/* arr 배열의 합계와 평균을 출력
* 최대값, 최솟값 출력
* 합격자 수 출력 (점수가 70이상이면 합격) => 전체 몇 명중에 몇 명이 합격하였습니다!
* 배열 = {10, 45, 59, 60, 12, 3, 75, 20, 35}
*/
◎ 문제 2번
// 과제
/* 가위바위보 게임
* 가위바위보를 랜덤으로 선택( 0 = 가위, 1 = 바위, 2 = 보)
* 내가 가위바위보 중 하나를 입력
* 승 / 패 / 무의 결과를 출력
* ex
* com = 0(가위)
* user = 가위
* com : 가위, user : 가위 => 무승부
*/
정답:
◎ 문제 1번
int arr[] = new int[] {10, 89, 96, 45, 59, 60, 12, 3, 75, 20, 35};
int max = 0; // 최댓값
int min = 0; // 최솟값
int sum = 0; // 합계
double avg = 0; // 평균
int count = 0; // 합격자 수
max = arr[0]; // 최댓값의 초기값
min = arr[0]; // 최솟값의 초기값
// 계산
for(int i = 0; i < arr.length; i++) {
sum += arr[i];
avg = sum / (double)arr.length;
if (arr[i] > max) { // 최댓값 계산
max = arr[i];
}
if (arr[i] < min) { // 최솟값 계산
min = arr[i];
}
if (arr[i] >= 70) { // 합격자 수
count += 1;
}
}
System.out.println("합계: " + sum + " / " + "평균: " + avg);
System.out.println("최댓값: " + max + " / " + "최솟값: " + min);
System.out.println("전체 " + arr.length + "명중에 " + count + "명이 합격하였습니다!");
▣ Math
// Math.max / Math.min
// max = Math.max(max, arr[i]);
// min = Math.min(min, arr[i]);
Math.max와 Math.min을 활용하면 if문을 활용하지 않아도 최댓값과 최솟값을 바로 구할 수 있습니다.
◎ 문제 2번
Scanner scan = new Scanner(System.in);
int com = (int)(Math.random()*2); // 0 ~ 2까지의 랜덤 정수 & 플레이어의 가위바위보 입력값
String arr[] = new String[] {"가위", "바위", "보"}; // 가위, 바위, 보 출력
int user = 0; // 플레이어의 가위바위보 입력값
System.out.println("가위바위보 게임");
while(true) {
System.out.println("(가위 / 바위 / 보)중에 한 가지를 입력해주세요.");
String msg = scan.next(); // 플레이어 가위바위보 입력
// 플레이어가 가위바위보 입력 시, user 변수에 숫자 입력 (잘못 입력될 시, 게임 종료)
if(msg.equals("가위")) {
user = 0;
} else if(msg.equals("바위")) {
user = 1;
} else if(msg.equals("보")) {
user = 2;
} else {
System.out.println("잘못 입력하셨습니다.");
System.out.println("게임을 종료합니다.");
break;
}
if (user == com) { // 가위바위보 출력 & 무승부, 패배, 승리 출력
System.out.println("com = " + arr[com]);
System.out.println("user = " + arr[user]);
System.out.println("com : " + arr[com] + " / user : " + arr[user] + " => 무승부");
} else if (((user == 0) && (com == 1)) || ((user == 1) && (com == 2)) || ((user == 2) && (com == 0))) {
System.out.println("com = " + arr[com]);
System.out.println("user = " + arr[user]);
System.out.println("com : " + arr[com] + " / user : " + arr[user] + " => 패배");
} else if (((user == 0) && (com == 2)) || ((user == 1) && (com == 0)) || ((user == 2) && (com == 1))) {
System.out.println("com = " + arr[com]);
System.out.println("user = " + arr[user]);
System.out.println("com : " + arr[com] + " / user : " + arr[user] + " => 승리");
break;
}
}
scan.close();
5. 느낀점
오늘 배웠던 개념이 어려워 보였지만 막상 활용해보니 쉬웠던 것 같다. 오늘 문제들을 풀면서 최댓값, 최솟값, 정렬(오름차순, 내림차순)의 조건들을 바로 떠오르지 못해서 문제를 푸는 과정 중에 차질이 생겼다. 오늘 복습을 통해서 Math, 정렬에 대해 집중적으로 공부를 해야겠다고 생각하게 되었다.
'Java' 카테고리의 다른 글
Java 기초(객체 지향 언어) - AWS 풀스택 과정 6일차 (0) | 2024.07.22 |
---|---|
Java 기초(String, Method) - AWS 풀스택 과정 5일차 (0) | 2024.07.19 |
Java 기초(While, Do ~ While) - AWS 풀스택 과정 3일차 (0) | 2024.07.17 |
Java 기초(Switch, For) - AWS 풀스택 과정 2일차 (0) | 2024.07.16 |
Java 설정 및 기초(Print, Scanner, If) - AWS 풀스택 과정 1일차 (0) | 2024.07.16 |