배열의 복사(copy)
1. 얕은 복사
int [ ] num1 = {10,20,30,40,50};
int [ ] num2;
num2 = num1;
num1 [0] = 100;
system.out.print(num1 [0]); -> 100
system.out.print(num2 [0]); -> 100 -> 10 아님
int [ ] num1 = {10,20,30,40,50};
int [ ] num2;
num2 = num1;
num1[0] = 100;
system.out.print(num1[0]); -> 100
system.out.print(num2[0]); -> 100
객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하고 있는 것!
2. 깊은 복사
다른 객체를 생성하여 새로운 객체에 데이터 내용을 복사하는 것!
3가지 방법
1) for문을 이용한 1:1 복사
2) System.arraycopy() 메서드를 이용한 복사
3) clone() 이용한 복사
1) for문을 이용한 1:1 복사
// 1. for문을 이용한 1:1 복사
int[] num1 = { 10, 20, 30, 40, 50 };
int[] num2;
num2 = num1;
num1[0] = 100;
int[] num3 = new int[num1.length];
for (int i = 0; i < num3.length; i++) {
num3[i] = num1[i];
}
2) System.arraycopy() 메서드를 이용한 복사
// 2. System.arraycopy()
int[] num5 = new int[num1.length];
// num1 = > {10,20,30,40,50}
System.arraycopy(num1, 0, num5, 0, num1.length);
// 전체복사
3) clone() 이용한 복사
int[] num1 = { 10, 20, 30, 40, 50 };
int[] num4;
num4 = num1.clone();
<실습>
1. 사용자의 전화번호를 입력받고, 13자리의 문자형 배열에 저장한 후, 가운데 4자리를 * 로 가리기!
(단, 원본 배열 값은 변경 없이 배열 복사본으로 변경하세요.)
public void test8() {
// 사용자의 전화번호를 입력받고, 13자리의 문자형배열에 저장한후, 가운데 4자리를 *로 가리기
// 단, 원본배열값은 변경없이 배열 복사본으로 변경하세요
Scanner sc = new Scanner(System.in);
System.out.println("전화번호 입력 : ");
String phoneNumber = sc.next();
// 010-1111-1111
char[] arr = new char[13];
for (int i = 0; i < arr.length; i++) {
if (i >= 4 && i <= 7) {
arr[i] = '*';
} else {
arr[i] = phoneNumber.charAt(i);
}
System.out.print(arr[i]);
}
}
String으로 받은 이유는 - 때문이다.
코드를 출력하면 결과가 나온다.
전화번호 입력 :
010-1234-5678
010-****-5678
2. 주민등록번호 성별 자리 이후부터 *로 가리기!
(단, 원본 배열 값은 변경 없이 배열 복사본으로 변경하세요.)
public void test9() {
// 주민등록번호 성별자리 이후부터 *로 가리기.
// 단,원본 배열값은 변경없이 배열 복사본으로 변경하세요
Scanner sc = new Scanner(System.in);
System.out.println("주민등록번호 입력 :");
String num = sc.next();
// 900000-0000000
char[] arr = new char[14];
for (int i = 0; i < arr.length; i++) {
if (i > 7) {
arr[i] = '*';
} else {
arr[i] = num.charAt(i);
}
System.out.print(arr[i]);
}
}
코드를 출력하면 결과가 나온다.
주민등록번호 입력 :
901212-1234567
901212-1******
3. 배열의 크기로 홀수인 양의 정수를 입력받아 배열은 만드세요.
배열의 중간까지는 1부터 1씩 증가하여 오름차순으로 값을 넣고, 중간 이후부터는 끝까지 1씩 감소하여 내림차순으로
값을 넣어 출력하는 프로그램을 작성하세요.
public void test10() {
// 배열의 크기로 홀수인 양의 정수를 입력받아 배열을 만드세요.
// 배열의 중간까지는 1부터 1씩 증가하여 오름차순으로 값을 넣고
// 중간 이후부터 끝까지는 1씩 감소하여 내림차순으로 값을 넣어 출력하는 프로그램을 작성하시오
// int count = 0;
// Scanner sc = new Scanner(System.in);
// System.out.println("양의 정수 홀수 입력 :");
// int num = sc.nextInt();
// int[] arr = new int[num];
//
// for(int i=0; i<num/2+1;i++) {
// arr[i] = ++count;
// }
// for(int i=num/2+1;i<arr.length; i++) {
// arr[i] = --count;
// System.out.print();
Scanner sc = new Scanner(System.in);
System.out.println("양의 정수 홀수 입력 :");
int num = sc.nextInt();
int[] arr = new int[num];
for (int i = 0; i < arr.length; i++) {
if (i > arr.length / 2) {
arr[i] = arr.length - i;
} else {
arr[i] = i + 1;
}
System.out.print(arr[i]);
}
}
코드를 출력하면 결과가 나온다.
양의 정수 홀수 입력 :
9
123454321
4. 문자열에서 문자 찾기!
public void test11() {
Scanner sc = new Scanner(System.in);
System.out.println("문자열 입력 : ");
String str = sc.next();
System.out.println("검색 값 입력 : ");
char ch = sc.next().charAt(0);
int count = 0;
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) == ch) {
count++;
}
}
System.out.println("찾는 문자는 총 : " + count + "개");
}
코드를 출력하면 결과가 나온다.
문자열 입력 :
koreagood
검색 값 입력 :
o
찾는 문자는 총 : 3개
5. 버블 정렬
public void test12() {
// 정렬
// 규칙에 맞춰서 순서를 재배열
// 오름차순, 내림차순
// 5 , 3 , 2 , 4 , 1
// -> 오름차순정렬
// -> 최종결과 -> 1 , 2 , 3 , 4 , 5
// 버블 정렬
// 5 4 3 2 1
// 4 3 2 1 5
// 3 2 1 4 5
// 2 1 3 4 5
// 1 2 3 4 5
// int [] arr = new int[2] ;
// arr [0] = 5;
// arr [1] = 3;
// if(arr[0] > arr[1]) {
// int tmp = arr[1];
// arr[1] = arr[0];
// arr[0] = tmp;
int[] arr1 = { 5, 4, 3, 2, 1 };
// 버블정렬 로직을 통해서 아래 출력 결과가 1 2 3 4 5 이 되도록
for (int i = 0; i < arr1.length; i++) { // 총 배열 길이보다 1개 작게
for (int j = 0; j < arr1.length - 1 - i; j++) { // 매 반복마다 1씩 줄어들수 있게
if (arr1[j] > arr1[j + 1]) {
int tmp = arr1[j];
arr1[j] = arr1[j + 1];
arr1[j + 1] = tmp;
}
}
for (int j = 0; j < arr1.length; j++) {
System.out.print(arr1[j] + "");
}
System.out.println();
}
}
코드를 출력하면 결과가 나온다.
43215
32145
21345
12345
12345
6. 로또 프로그램
public void test13() {
int[] input = new int[6];
int count = 0;
Scanner sc = new Scanner(System.in);
System.out.println("==== 로또 프로그램 ====");
Random r = new Random();
for (int i = 0; i < 6; i++) { // num.length; 까지 해도됨
System.out.println(i + 1 + "번째 번호 입력 :");
int num = sc.nextInt(); // num[i] = sc.nextint();
input[i] = num;
for (int j = 0; j < i; j++) {
if (num == input[j]) {
System.out.println("숫자가 중복되었습니다."); // 여기까지는 그냥 중복 이라고 출력
i--; // **** 초기화 *****
// 중복 for문이 끝나면 전체 for문의 증감으로 간다
break; // ???????????????????????
}
}
}
int[] output = new int[6];
for (int i = 0; i < 6; i++) {
int cNum = r.nextInt(45) + 1;
output[i] = cNum;
for (int j = 0; j < i; j++) {
if (cNum == output[j]) {
i--;
}
}
}
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (input[i] == output[j])
count++;
}
}
for (int i = 0; i < input.length; i++) { // 총 배열 길이보다 1개 작게
for (int j = 0; j < input.length - 1 - i; j++) { // 매 반복마다 1씩 줄어들수 있게
if (input[j] > input[j + 1]) {
int tmp = input[j];
input[j] = input[j + 1];
input[j + 1] = tmp;
}
if (output[j] > output[j + 1]) {
int tmp = output[j];
output[j] = output[j + 1];
output[j + 1] = tmp;
}
}
}
// for (int i = 0; i < input.length; i++) { // 총 배열 길이보다 1개 작게
// for (int j = 0; j < input.length - 1 - i; j++) { // 매 반복마다 1씩 줄어들수 있게
// if (input[j] > input[j + 1]) {
// int tmp = input[j];
// input[j] = input[j + 1];
// input[j + 1] = tmp;
// }
// }
// }
for (int i = 0; i < 6; i++) {
System.out.print(input[i] + " ");
}
System.out.println();
for (int i = 0; i < 6; i++) {
System.out.print(output[i] + " ");
}
System.out.println("맞은 갯수는 " + count);
switch (count) {
case 6:
System.out.println("1등");
break;
case 5:
System.out.println("2등");
break;
case 4:
System.out.println("3등");
break;
case 3:
System.out.println("4등");
break;
case 2:
case 1:
case 0:
System.out.println("꽝");
break;
}
}
코드를 출력하면 결과가 나온다.
==== 로또 프로그램 ====
1번째 번호 입력 :
17
2번째 번호 입력 :
37
3번째 번호 입력 :
12
4번째 번호 입력 :
27
5번째 번호 입력 :
9
6번째 번호 입력 :
44
9 12 17 27 37 44
3 10 12 29 37 40 맞은 개수는 2
꽝
다차원 배열
행과 열로서 구성된 배열을 2차원 배열이라고 한다.
2차원 배열은 수학의 행렬을 떠올리면 되는데 가로 인덱스와 세로 인덱스를 사용한다.
자바는 2차원 배열을 중첩 배열 방식으로 구현한다.
타입[ ][ ] 변수 = {{값1,값2, ...} , {값1, 값2, ...}, ... };
<실습>
public void test16() {
int[][] arr = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
int[][] arr1 = new int[3][4];
int count = 1;
for (int i = 0; i < arr1.length; i++) { // 행의길이
for (int j = 0; j < arr1[i].length; j++) { // 열의길이
arr1[i][j] = count;
count++;
System.out.print(arr1[i][j] + "\t");
}
System.out.println(); //
}
}
코드를 출력하면 결과가 나온다.
1 2 3 4
5 6 7 8
9 10 11 12
public void test17() {
int count = 1;
int[][] arr1 = new int[5][5];
for (int i = 0; i < arr1.length; i++) {
for (int j = 4; j >= 0; j--) {
arr1[i][j] = count;
count++;
}
}
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + "\t");
}
System.out.println();
}
}
코드를 출력하면 결과가 나온다.
5 4 3 2 1
10 9 8 7 6
15 14 13 12 11
20 19 18 17 16
25 24 23 22 21
public void test18() {
int count = 1;
int[][] arr1 = new int[5][5];
for (int i = 0; i < 5; i++) {
for (int j =0; j < 5; j++) {
arr1[j][i] = count;
count++;
}
}
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + "\t");
}
System.out.println();
}
}
public void test19() {
int count = 1;
int[][] arr1 = new int[5][5];
for (int i = 0; i < 5; i++) {
for (int j = 4; j >= 0; j--) {
arr1[j][i] = count;
count++;
}
}
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j] + "\t");
}
System.out.println();
}
}
test18 코드를 출력하면 결과가 나온다.
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
test19 코드를 출력하면 결과가 나온다.
5 10 15 20 25
4 9 14 19 24
3 8 13 18 23
2 7 12 17 22
1 6 11 16 21
'이공계전문기술연수 > Java' 카테고리의 다른 글
<이공계전문기술연수>18. Java 상속 (0) | 2019.08.21 |
---|---|
<이공계전문기술연수> 16. Java 객체지향프로그래밍(OOP) 클래스 (0) | 2019.08.16 |
<이공계전문기술연수> 14. Java 배열(1) (0) | 2019.08.15 |
<이공계전문기술연수> 13. 참조 타입 / 참조 변수 (0) | 2019.08.15 |
<이공계전문기술연수> 12. Java 반복문: while문 / break문 (0) | 2019.08.13 |