배열 (Array)

Agnes Park·2022년 1월 30일
0

JAVA

목록 보기
14/34

1. 배열(Array)의 기본 정의

  • 동일 타입의 여러개의 데이터를 담는 집합자료형
  • 배열 선언
    자료타입[] 변수이름;
  • 배열 원소 (element)
    배열에 담긴 각각의 데이터
  • 배열의 길이 (length)
    배열 원소의 개수, 즉 배열에 담긴 데이터의 개수
  • 배열 인덱스 (첨자, index)
    배열의 인덱스는 0부터 시작해서, (배열의 길이 - 1)까지가 됨
    배열인덱스를 사용하여 배열원소에 접근하여 사용
  • 배열을 new로 생성한뒤에는 자동초기화 가 됨.
    숫자타입들은 --> 0으로
    boolean타입은 --> false 로
    객체타입(Object) 타입은 --> null 로.

★ 배열변수의 타입, 배열원소의 타입 확실히 구분하자
★ JVM 메모리 상에 생기는 구조 이해 필수

package com.lec.java.array01;


public class Array01Main {

	public static void main(String[] args) {
		System.out.println("배열(Array)");
		
		// 배열이 필요한 이유
		// 동일 타입 데이터(들)을 위해 매번 새로운 변수 생성 불가
		
		int korean1 = 99;
		int korean2 = 88;
		int korean3 = 77;
		
		// 배열을 선언, 초기화
		int[] korean = new int[3];
		// int 타입의 배열을 선언
		// 3개의 int 타입을 저장할 수 있도록 초기화
		
		korean[0] = 90;	// 첫번째 배열원소에는 int 값 90 대입
		korean[1] = 80;
		korean[2] = 70;
//		korean[3] = 60;	// 배열의 인덱스는 0 ~ 2 까지만 가능 - 에러: ArrayIndexOutOfBoundsException
		
		System.out.println("국어0: " + korean[0]);
		System.out.println("국어1: " + korean[1]);
		System.out.println("국어2: " + korean[2]);
		
		// 변수 korean의 타입은???? ===> int[] 타입
		// 변수 korean[0]의 타입은???? ===> int 타입
		
		System.out.println("for문 사용해서 출력");
		for(int n = 0; n < 3; n++) {
			System.out.printf("korean[d] = %d\n", n , korean[n]);
		}
		
		System.out.println();
		// int 타입의 english라는 길이가 5인 배열을 선언 & 초기화
		int [] english = new int[5];
//		int []english;
//		int english[];
		
		System.out.println(english[1]);	// 0으로 자동 초기화
		
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array01Main

2. 배열(Array)의 선언과 초기화

  • 배열 선언 따로, 초기화 따로
    타입[] 이름 = new 타입[배열의 길이];
  • 배열을 선언과 동시에 초기화 1
    타입[] 이름 = new 타입[ ] {a, b, c, ...};
  • 배열을 선언과 동시에 초기화 2
    타입[] 이름 = {a, b, c, ...};
  • 배열의 길이를 자동으로 알 수 있는 방법
    배열이름.length
package com.lec.java.array02;

public class Array02Main {

	public static void main(String[] args) {
		System.out.println("배열의 선언과 초기화");
		
		int [] kor = new int[3];
		kor[0] = 100;
		kor[1] = 90;
		kor[2] = 80;
		
		// 배열 선언과 동시에 초기화 1
		int [] eng = new int[] {30, 20, 30, 40};
		for(int i =0; i < 4; i++) {
			System.out.println("영어" + i + ": " + eng[i]);
		}
		
		System.out.println();
		
		// 배열 선언과 동시에 초기화 2
		// 수학점수의 총점과 평균을 계산
		int [] math = {100, 96, 83, 25, 59, 99, 100, 22, 11};
		int total = 0;
		int n= 0;
		while(n < math.length) {
			System.out.println("수학" + n + ": " + math[n]);
			total += math[n];
			n++;
		}
		System.out.println("수학총점: " + total);
		double avg = (double)total / math.length;
		System.out.println("수학평균: " + avg);

		System.out.println("수학배열의 length: " + math.length);
		
		
		int [] score = {10,20,30,40,50};
		for (int i = 0; i < score.length; i++) {	// ctrl + space => use index on array (for문 자동완성)
			
		}
		
		// 배열변수를 출력하면 뭐가 나오나???
		System.out.println(score);	// 실제 배열 객체가 생긴 메모리 주소 ('[' : 1차원 배열이라는 의미)
		
		System.out.println("\n프로그램 종료");
        
	} // end main()

} // end class Array02Main

3. 여러가지 자료형의 배열

package com.lec.java.array03;

public class Array03Main {

	public static void main(String[] args) {
		System.out.println("여러가지 자료형의 배열");
		
		System.out.println();
		System.out.println("[1] double형 배열");
		// 타입[] 이름 = new 타입[배열 길이];
		// 타입[] 이름 = new 타입[] {a, b, ...};
		// 타입[] 이름 = {a, b, ...};

		double [] array1 = {1.2, 2.3, 3.4};
		for (int i = 0; i < array1.length; i++) {
			System.out.println("array1[" + i + "] = " + array1[i]);
		}
		
		
		System.out.println();
		System.out.println("[2] char형 배열");
		
		// TODO
		
		
		System.out.println();
		System.out.println("[3] boolean형 배열");

		// TODO
		
		
		System.out.println();
		System.out.println("[4] String형의 배열");

		String [] array4 = new String[3];
		array4[0] = "Hello Java";
		array4[1] = "Hello C++";
		array4[2] = "Hello HTML5";
		
		for (int i= 0;  i < array4.length; i++) {
			System.out.println("aaray4[" + i + "] = " + array4[i] + "(" + array4[i].length() + "글자)");
		}
		
		// array4의 타입은? => String[]
		// array4[0]의 타입은? ==> String
		
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array03Main

4. 2차원 배열 (2-dimensional array)

  • 직전의 예제와 같이 같이 배열 첨자를 하나만 쓰는 배열을 1차원 배열 (one-dimensional array) 이라고 함
    ex) 배열 첨자를 2개사용하면 2차원 배열
    배열 첨자를 3개사용하면 3차원 배열
    ...
  • 배열원소가 '1차원 배열' 들로 이루어진 배열을 2차원 배열 이라 한다 (배열첨자 2개 사용)
  • 배열원소가 '2차원 배열' 들로 이루어진 배열을 3차원 배열 이라 한다 (배열첨자 3개 사용)
package com.lec.java.array05;

import java.util.Scanner;


public class Array05Main {

	public static void main(String[] args) {
		System.out.println("2차원 배열");
		
		// 1차원배열 x 3개 갖고 있는 2차원 배열
		int[][] array = {
				{1, 2},	// <- array[0]
				{3, 4},	// <- array[1]
				{5, 6}	// <- array[2]
		};
		
		System.out.println(array.length);
		System.out.println(array[0][0]);
		System.out.println(array[0][1]);
		System.out.println(array[1][0]);
		System.out.println(array[1][1]);
		System.out.println(array[2][0]);
		System.out.println(array[2][1]);
//		System.out.println(array[2][2]);	// 오류 : ArrayIndexOutofBoundsException
		
		// ※ 흔히 2차원 배열을 행과 열로 표현하기도 함
		// array 는 행(row) 3개, 열(column)이 2개인 2차원 배열
		
		// 2차원 배열에서 length의 의미:
		// array.length: 2차원 배열의 원소, 즉 1차원배열의 개수 
		//  			행열의 개념에선 2차원 배열의 행(row)의 개수를 의미
		System.out.println("array[0].length = " + array[0].length);
		System.out.println("array[1].length = " + array[1].length);

		// array 의 타입은? --> int[][]
		// array[0] 의 타입은? --> int[]
		// array[0][0] 의 타입은? --> int
		
		System.out.println();
		// 2차원 배열 확인
		for(int x = 0; x < array.length; x++) {
			for(int y =0; y < array[x].length; y++) {
				System.out.print(array[x][y] + "\t");
			}
			System.out.println();
		}
		
		System.out.println();
		System.out.println(array);
		System.out.println(array[0]);
		System.out.println(array[0][0]);
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array05Main

[메모리 예시]

[연습문제]

package 배열2.자가진단06;

import java.util.Scanner;

public class Main {

/*
85 67 95 65
80 95 86 56
100 98 67 86
95 76 84 65
67 86 90 76
 */
	public static void main(String[] args) {
		
			// 5명 학생 x 4개 과목 점수 담을 2차원 배열
			int [][] score = new int[5][4];
			
			Scanner sc = new Scanner(System.in);
			
			for(int stu = 0; stu < score.length; stu++) {
				for(int subj = 0; subj < score[stu].length; subj++) {
					score[stu][subj] = sc.nextInt();
					
				}
			}
			
			sc.close();
			
			int success = 0;	// 합격한 학생수	
			
			// 학생별로 점수 계산
			for(int stu = 0; stu < score.length; stu++) {
				int sum = 0;
				double avg = 0.0;
				
				// stu 학생의 총점 구하기 => sum
				for(int subj = 0; subj < score[stu].length; subj++) {
					sum += score[stu][subj];	// stu 번째 학생의 subj 과목점수 합산
				}
			
				avg = (double)sum / score[stu].length;
				
				if(avg >= 80) {
					System.out.println("pass");
					success++;	// 합격자수 +1 증가
				} else {
					System.out.println("fail");
				}
			}
			
		System.out.println("Successful : " + success);
		
	}

}

5. 가변 배열 (ragged array)

가변 배열 : column(열)의 개수가 일정하지 않은 배열

가변 배열 선언 방법

  • 행의 개수만 지정을 하고, 열의 개수는 비워둠
  • 열(column)이 몇 개가 될 지 모르기 때문에 메모리 할당이 되지 않습니다.
package com.lec.java.array09;

public class Array09Main {

	public static void main(String[] args) {
		System.out.println("Ragged Array(가변 배열)");

		int [][] arr;
		arr = new int[3][];		// 1차원 배열 3개를 담는 2차원 배열 객체 생성
		
		arr [0] = new int[1];	// int 값 1개 갖는 1차원 배열 생성 (length 1)
		arr [1] = new int[2];	// int 값 2개 갖는 1차원 배열 생성 (length 2)
		arr [2] = new int[3];	// int 값 3개 갖는 1차원 배열 생성 (length 3)
		
		arr[0][0] = 1;
		arr[1][0] = 2;
		arr[1][1] = 3;
		arr[2][0] = 4;
		arr[2][1] = 5;
		arr[2][2] = 6;
		
		for(int x = 0; x < arr.length; x++) {
			for(int y = 0; y < arr[x].length; y++) {
				System.out.print(arr[x][y] + " ");
			}
			System.out.println();
		}
		
		
		
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array09Main

6. Enhanced for (향상된 for) 문

for (배열타입 변수 : 배열이름) { ... }

package com.lec.java.array10;

public class Array10Main {

	public static void main(String[] args) {
		System.out.println("Enhanced for (향상된 for) 문");
		
		int [] arr = {11, 22, 33, 44, 55};
		for(int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
		
		for(int x : arr) {
			System.out.print(x + " ");
		}
		System.out.println();
		
		System.out.println();
		int [][] array = {
				{1,2},
				{3, 4, 5, 6},
				{7, 8, 9}
		};
		
		for(int[] row : array) {
			for(int x : row) {
				System.out.print(x + " ");
			}
			System.out.println();
		}
		
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array10Main

7. java.util.Arrays 클래스

  • 배열을 다루는 유용한 메소드들 제공
    Arrays.toString() : 문자열 형태로 리턴
    Arrays.copyOf(원본배열, 복사할 length) -> 앞에서부터 복사
    Arrays.copyOfRange(원본배열, from, to))
    Arrays.fill() : 배열에 특정 값으로 채우기
    Arrys.sort(원본배열) : 오름차순 변경
    Arrays.asList() : array -> List 로
package com.lec.java.array13;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Array13Main {

	public static void main(String[] args) {
		System.out.println("java.util.Arrays 클래스");
	
		int [] arr = {10, 20, 30, 40, 50};
		
		System.out.println(Arrays.toString(arr));
		
		int [] arr2 = Arrays.copyOf(arr, 3);
		System.out.println(Arrays.toString(arr2));
		
		int [] arr3 = Arrays.copyOf(arr, 10);	// length 가 원본보다 크면, 나머지 부분은 기본값(0)들로 채워짐
		System.out.println(Arrays.toString(arr3));
		
		int [] arr4 = Arrays.copyOfRange(arr, 0, 2);	// 0번째부터 2 전까지 복사
		System.out.println(Arrays.toString(arr4));
		
		int [] arr6 = new int[4];
		Arrays.fill(arr6, 8); 	// 죄다 8로 채움
		System.out.println(Arrays.toString(arr6));
		
		int [] arr7 = {8, 9, 3, 5, 1, 2};
		System.out.println(Arrays.toString(arr7));
		Arrays.sort(arr7);	// sort에서 내림차순 지원 X
		System.out.println(Arrays.toString(arr7));
		
		
		
		System.out.println("\n프로그램 종료");
	} // end main

} // end class

8. Reference 타입 주의할 사항

package com.lec.java.array14;

import java.util.Arrays;

public class Array14Main {

	public static void main(String[] args) {
		System.out.println("Reference 타입 주의할 사항");
		
		int a = 10;
		int b = 20;
		System.out.println("a: " + a + ", b:" + b);
		a = b;	// '값'의 복사
		System.out.println("a: " + a + ", b:" + b);
		a = 30;
		System.out.println("a: " + a + ", b:" + b);
		
		int [] arrA = {10, 10, 10};
		int [] arrB = {20, 20, 20};
		System.out.println("A: " + arrA + ", B: " + arrB);
		System.out.println("A: " + Arrays.toString(arrA) + ", B:" + Arrays.toString(arrB));
		arrA = arrB;	// '값'의 복사. reference 타입이기 때문에 주솟값이 복사된다.
		
		// arrA = arrB  하는 순간 먼저 arrA 가 referencing 하던 배열 객체의 reference 는 끊긴다.
		// reference 가 끊긴 객체는 JVM 의 Garbage Collector 에 의해 메모리에서 삭제된다.

		System.out.println("A: " + arrA + ", B: " + arrB);
		System.out.println("A: " + Arrays.toString(arrA) + ", B:" + Arrays.toString(arrB));
		arrA[0] = 500;
		System.out.println("A: " + Arrays.toString(arrA) + ", B:" + Arrays.toString(arrB));
		
		System.out.println("\n프로그램 종료");
	} // end main

} // end class

[주솟값의 복사]

0개의 댓글