-
배열: 같은 자료형의 변수를 하나의 묶음으로 다루는 것. 배열은 저장된 값마다 인덱스 번호가 0부터 시작하여 설정.
배열 선언
- 자료형[] 배열명;
- 자료형 배열명[];
배열 할당
- 자료형[] 배열명 = new 자료형[배열크기];
- 자료형 배열명[] = new 자료형[배열크기];
배열 초기화
- 인덱스 이용 초기화
arr[0] = 1;
arr[1] = 2;
- for문 이용 초기화
for(int i = 0; i < arr.length; i++) {
arr[i] = i; }
- 선언 동시 초기화
int[] arr = {1, 2, 3, 4, 5};
int[] arr = new int[] {1, 2, 3, 4, 5}
더보기1234567891011121314151617181920212223242526272829303132333435363738public void testArray() {//배열 선언: stack 공간 생성, 주소값을 가지고 있음boolean[] booleanArr;//배열 할당: heap에 공간 생성, 진짜 데이터를 가지고 있음double[] doubleArr = new double[2];//배열 초기화//인덱스 이용doubleArr[0] = 100.123456;doubleArr[1] = Math.random();// 0 <= Math.random() < 1//1부터 10까지의 정수// 0*10 + 1 <= (int)(Math.random()*10) + 1 <1*10 +1//선언과 동시에 초기화String[] strArr = {"치킨", "피자", "족발"};char[] charArr = new char[] {'a', 'b', 'c', 'd', 'e'};//for문을 이용한 초기화int[] intArr = new int[6];for(int i = 0; i <intArr.length; i++) {intArr[i] = i;}//출력//하나씩 접근해서 출력하는 방법for(int i = 0; i < doubleArr.length; i++) {System.out.println(doubleArr[i]);}for(int i = 0; i < intArr.length; i++) {System.out.println(intArr[i]);}//전체 출력 - String 자체로 뽑아오는 것System.out.println(Arrays.toString(strArr));System.out.println(Arrays.toString(charArr));}cs Arrays.toString -> 배열의 내용을 String으로 출력. 배열 자체에서 toString을 출력하면 배열의 주소값이 나온다.
배열 복사
- 얕은 복사: 객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는 것
int[] arr1 = new int[4];
int[] arr2 = arr1;
- 깊은 복사: 새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것(for문 사용, arraycopy 사용, Arrays.copyOf사용)
더보기123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990public void testShallowCopy() {//얕은 복사int[] originArr = { 1, 2, 3, 4, 5};int[] copyArr = new int[10];copyArr = originArr;System.out.println("===== 변경 전 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));originArr[2] = 100;System.out.println("===== 변경 후 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));System.out.println("===== 주소 값 =====");System.out.println(originArr);System.out.println(copyArr);}public void testDeepCopy() {//깊은 복사int[] originArr = {1,2,3,4,5};//for문 이용int[] copyArr = new int[10];for(int i = 0; i < originArr.length; i++) {copyArr[i] = originArr[i];}System.out.println("===== 변경 전 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));originArr[2] = 100;System.out.println("===== 변경 후 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));System.out.println("===== 주소 값 =====");System.out.println(originArr);System.out.println(copyArr);}public void testDeepCopy2() {//깊은 복사 - arraycopy()int[] originArr = {1,2,3,4,5};int[] copyArr = new int[10];System.arraycopy(originArr, 0, copyArr, 0, originArr.length);System.out.println("===== 변경 전 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));originArr[2] = 100;System.out.println("===== 변경 후 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));System.out.println("===== 주소 값 =====");System.out.println(originArr);System.out.println(copyArr);}public void testDeepCopy3() {//깊은 복사 - Arrays.copyOf()int[] originArr = {1,2,3,4,5};//할당하지 않고 바로 사용 가능//깊은 복사는 가능하지만 배열의 크기는 늘어나게 만들 수 없음int[] copyArr = Arrays.copyOf(originArr, originArr.length);//copyArr은 originArr을 복사하여 새롭게 생긱 객체를 참조하게 되었으므로 길이는 5가 됨System.out.println("===== 변경 전 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));originArr[2] = 100;System.out.println("===== 변경 후 ====");System.out.println(Arrays.toString(originArr));System.out.println(Arrays.toString(copyArr));System.out.println("===== 주소 값 =====");System.out.println(originArr);System.out.println(copyArr);}cs System.arraycopy(src, srcPos, dest, destpos, length)
src: 원본 배열/ srcPos: 원본 배열의 복사할 시작점/ dest: 카피 배열/ destpos: 카피 배열의 붙여넣기 시작점/ length: 원본 배열에서 가져올 길이
Arrays.copyOf(original, newlength)
original: 원본 배열/ newlength: 복사할 길이
※문제. 홀수인 양의 정수를 입력 받아 배열의 중간까지는 1부터 1씩 증가하여 오름차순으로 값을 넣고, 중간 이후부터 끝까지는 1씩 감소하여 내림차순으로 값을 넣어 출력하는 프로그램을 작성하시오.
1234567891011121314151617public void method1() {Scanner sc = new Scanner(System.in);System.out.print("홀수 입력: ");int[] arr = new int[sc.nextInt()];//증가하는 for문int num = 1;for(int i = 0; i < arr.length/2; i++) {arr[i] = num++;System.out.print(arr[i] + " ");}//감소하는 for문for(int i = arr.length/2; i < arr.length; i++) {arr[i] = num--;System.out.print(arr[i] + " ");}}cs 홀수가 arr의 데이터 개수가 되고, 이에 따라 증가하는 for문과 감소하는 for문을 나누어 출력하는 문제.
배열 선언과 할당을 동시에 하되, 할당 값에 Scanner를 이용한 입력값을 넣어야 한다.
※문제. 사용자가 입력한 배열의 길이만큼의 문자열 배열을 선언 및 할당하고 배열의 인덱스에 넣을 값 역시 사용자가 입력하여 초기화하시오. 단, 사용자에게 배열에 값을 더 넣을지 물어보고 몇 개를 더 입력할 건지, 늘린 곳에 어떤 데이터를 넣을 것인지 받고, 사용자가 더 이상 입력하지 않겠다고 하면 배열 전체 값을 출력하시오.
완전 복잡... 하나하나 차근차근 하자면 1. 크기를 입력 받고, 2. 순서대로 인덱스 값을 입력받는데 3. 무한 루프로 추가 값을 받되 4. if문으로 추가할 경우와 안 할 경우를 구분하여 결과값을 출력해야 한다.
12345678910111213141516171819202122232425262728293031323334353637public void method2() {Scanner sc = new Scanner(System.in);System.out.print("배열의 크기 입력: ");String[] strArr = new String[sc.nextInt()];sc.nextLine();for(int i = 0; i <strArr.length; i++) {System.out.println(i+1 + "번째 문자열: ");strArr[i] = sc.nextLine();}while(true) {System.out.print("더 값을 입력하시겠습니까?(y/n): ");String select = sc.nextLine();if(select.toUpperCase().equals("Y")) {System.out.print("추가할 개수: ");int add = sc.nextInt();String[] newArr = new String[strArr.length + add];System.arraycopy(strArr, 0, newArr, 0, strArr.length);sc.nextLine();for(int i = strArr.length; i < newArr.length; i++) {System.out.print(i +1 + "번째 문자열: ");newArr[i] = sc.nextLine();}strArr = newArr;}else if(select.toUpperCase().equals("N")) {System.out.println(Arrays.toString(strArr));break;}}cs arraycopy를 통해 newArr을 선언하되, 더 값을 입력하지 않을 때는 strArr을 출력해야 하는 점에 유의해야 한다.
'혼자 있는 방 > Java' 카테고리의 다른 글
중간 복습(Review) (0) 2021.05.06 DemensionArray(2차원 배열) (1) 2021.05.04 Repetitive(반복문) 2 (0) 2021.05.02 Repetitive(반복문) 1 (0) 2021.04.30 Conditional(조건문) (0) 2021.04.30 댓글