정수를 원하는 만큼 입력받는다. 그러나 처음 지정한 공간에서 더 이상 공간이 부족하다면 어떤 조건을 기준으로 새로운 공간을 생성하고, 그걸 얼마만큼 늘려줄 것인지를 추가로 생각한다. 또한, 한번 만든 배열의 길이는 절대 늘어날 수 없으므로 참조를 이용한 스위칭도 생각해야 할 것이다.
package array;
import java.util.Scanner;
public class Ex01 {
static void show(int[] arr) {
System.out.printf("arr[%d] : { ", arr.length);
for(int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
System.out.print(i == arr.length - 1 ? " }\n" : ", ");
}
}
public static void main(String[] args) {
// 길이가 자동으로 증가하는 배열 만들어보기
// Reference Type 의 이해
// 자바에서 primitive를 제외한 모든 유형의 데이터는 참조변수를 활용한다
// 참조변수는 그 자체가 본체는 아니고, 참조하는 대상을 바꿀 수 있다
Scanner sc = new Scanner(System.in);
int length = 3;
int[] arr = new int[length];
int[] tmp; // 새로운 배열을 위한 참조 변수 (초기값은 없음)
int input; // 사용자가 입력하는 정수를 받는 변수
// C언어의 배열은 길이에 변수를 넣을 수 없다. 자바는 가능하다
show(arr);
// 조건1) 사용자가 0을 입력할 때 까지, 정수를 입력받는다
// 조건2) 입력받은 정수는 모두 배열에 저장되어야 한다
// 조건3) 순서를 유지하기 위해, 정렬은 수행하지 않는다
// 조건4) 만약, 배열의 모든 값을 입력받았다면, 단위길이만큼 증가시킨 새로운 배열을 생성
// 조건5) 새로운 배열은 기존 배열의 숫자를 모두 복사하여 가지고 있어야 한다
while(true) {
System.out.print("정수 입력 : ");
input = sc.nextInt();
if(input == 0) {
break;
}
for(int i = 0; i < arr.length; i++) {
if(arr[i] == 0) { // 빈칸을 찾아서
arr[i] = input; // 입력값을 저장하고
break; // for 탈출
}
}
show(arr);
if(arr[arr.length - 1] != 0) { // 배열이 꽉 찼으면
tmp = new int[arr.length + length]; // 새로운 배열을 생성하고
for(int i = 0; i < arr.length; i++) { // 기존 배열값을
tmp[i] = arr[i]; // 신규 배열에 복사한다
}
arr = tmp;
}
}
System.out.println("끗");
sc.close();
}
}
이중 for문을 응용하여 원하는 값을 채울 수 있다
package array;
public class Ex05 {
public static void main(String[] args) {
int[] arr1 = { 1, 2, 3, 4, 5 };
int[] arr2 = { 6, 7, 8, 9, 10 };
int[] arr3 = { 11, 12, 13, 14, 15 };
int[] arr4 = { 16, 17, 18, 19, 20 };
int[] arr5 = { 21, 22, 23, 24, 25 };
int[][] arr = { arr1, arr2, arr3, arr4, arr5 };
System.out.println(arr[0][0]);
System.out.println(arr[2][3]);
System.out.println(arr[4][4]);
arr = new int[5][5]; // 모든 값은 0으로 초기화된다
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
arr[i][j] = i * 5 + j + 1;
}
}
System.out.println(arr[0][0]);
System.out.println(arr[2][3]);
System.out.println(arr[4][4]);
arr = new int[][] {
// i j [0] [1] [2] [3] [4]
/* [0] */ { 1, 2, 3, 4, 5 },
/* [1] */ { 6, 7, 8, 9, 10 },
/* [2] */ { 11, 12, 13, 14, 15 },
/* [3] */ { 16, 17, 18, 19, 20 },
/* [4] */ { 21, 22, 23, 24, 25 }
};
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
System.out.printf("arr[%d][%d] : %d\n", i, j, arr[i][j]);
}
}
}
}
public class StringList {
// 클래스 내부의 함수들이 공통적으로 참조할 수 있는 변수
// 함수의 지역변수와 구분하기 위해서, 멤버 필드라고 부른다
// 멤버필드는 노란색, 지역변수는 군청색 (이클립스 어두운 테마 기준)
private String[] arr = new String[0];
public void add(String str) {
String[] tmp;
tmp = new String[arr.length + 1];
for(int i = 0; i < arr.length; i++) {
tmp[i] = arr[i];
}
arr = tmp;
arr[arr.length - 1] = str;
}
// 오버로딩 : 현재 클래스 안에 같은 이름의 함수가 2개 이상 있다
// 오버라이딩 : 슈퍼클래스에게 [상속] 받아서 이미 있는데, 같은 형식으로 새로 쓰면 덮어쓴다
@Override // Object.toString()
public String toString() { // System.out.println(객체); 위 아래 두개는 동일하다
String ret = "["; // System.out.println(객체.toString());
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null) {
ret += arr[i];
}
ret += i == arr.length - 1 ? "]" : ", ";
}
return ret;
}
public int size() {
return arr.length;
}
}