Array[Java]

SnowCat·2023년 6월 1일
0

Java - Language

목록 보기
4/17
post-thumbnail

메모리 구조

  • 모든 자바 프로그램은 JVM을 통해 실행되며, JVM을 운영체제로 부터 메모리를 할당받아 관리하게 됨
  • 메소드 영역에는 자바 프로그램에 사용되는 클래스 정보와 클래스 변수를 저장하게 됨
  • 힙 영역은 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역으로 낮은 주소부터 값을 채우게 됨
  • 스택 영역은 메소드가 호출될 때 메소드의 스택 프레임을 저장하는 영역으로 높은 주소부터 스택 방식으로 데이터를 저장하게 됨

1차원 배열

  • 자바에서 배열은 같은 타입의 배열들로 이루어진 유한 집합을 의미함
int[] grade1 = new int[3];
int[] grade2 = new int[3];

grade1[0] = 85;
grade1[1] = 65;
grade1[2] = 90;

grade2[0] = 85; // 배열의 길이보다 적은 수의 배열 요소만 초기화

for (int i = 0; i < grade1.length; i++) {
    System.out.print(grade1[i] + " "); // 85 65 90 
}

// char의 경우 \u0000 (null 문자), byte, short, int는 0, long은 0L, float는 0.0, double은 0.0d, boolean은 false, 이외의 타입은 null로 자동 초기화됨
for (int i = 0; i < grade2.length; i++) {
    System.out.print(grade2[i] + " "); // 85 0 0 

}

System.out.print(grade[4]); // ArrayIndexOutOfBounds error
  • 선언시에 배열을 초기화 할 경우 아래와 같은 방법을 사용
int[] grade1 = {70, 90, 80}; //값을 직접 지정하거나
int[] grade2 = new int[]{70, 90, 80}; // 새로운 배열 객체를 전달해 선언과 동시에 초기화 가능

int[] grade3;
grade3 = {70, 90, 80}; // 선언된 배열에 값을 직접 대입하면 오류 발생

int[] grade4;
grade4 = new int[]{70, 90, 80}; // 이미 선언된 배열은 이 방법으로만 초기화할 수 있음

다차원 배열

  • 2차원 이상 배열을 다차원 배열이라고 함
  • 다차원 배열을 나타내는 타입을 따로 존재하지 않으며 1차원 배열을 중첩해 다차원 배열을 나타낼 수 있음
/*
 * 다음과 같이 선언해도 됨
 * int[][] arr = {{1, 2, 3}, {4, 5, 6}};
 */
 
int[][] arr = new int[2][3];
int n = 1;
for (int i = 0; i < arr.length; i++){
	for (let j = 0; j < arr.length; j++ {
    	arr[i][j] = k;
        n++;
    }
}

/*
1 2 3
4 5 6
*/
for (int i = 0; i < arr.length; i++){
	for (let j = 0; j < arr.length; j++ {
    	System.out.println(arr[i][j] + " ");
    }
    System.out.println();
}

가변 배열

  • 2차원 이상의 배열에서 열의 길이를 명시하지 않음으로써 행마다 다른 길이의 배열을 저장할 수 있음
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[1];

배열의 복사

  • 자바에서 배열은 한번 생성하면 길이를 변경할 수 있음
  • 배열의 길이를 늘리고 싶은 경우 새로운 배열을 생성해야 함
int[] arr1 = new int[]{1, 2, 3, 4, 5};

int newLen = 10;

/*
 * 1. System 클래스의 arraycopy() 메소드
 * 매개변수 순서는 (원본배열, 원본배열에서 복사해올 시작점, 값을 받을 배열, 값을 받을 배열에서의 시작점, 원본배열에서 복사할 길이) 순서로 작성됨
 * 네이티브로 작성되어있기 때문에 가장 빠른 성능을 보여주고 세밀한 배열 조작이 가능하지만, 읽고쓰기 복잡함
 */
int[] arr2 = new int[newLen];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);
 
/*
 * 2. Arrays 클래스의 copyOf() 메소드
 * 매개변수 순서는 (원본배열, 복사해올 길이)
 * System.arraycopy를 래핑한 객체로, 가독성이좋으나 속도가 arraycopy에 비해서는 느림
 * 일반적으로 배열을 복사할때는 이 메서드를 가장 많이 사용함
 */
int[] arr3 = Arrays.copyOf(arr1, 10);

/*
 * 3. Object 클래스의 clone() 메소드
 * 객체를 복사해오는 방식이기 떄문에 이전과 같은 길이의 배열밖에 생성할 수 없음
 */
int[] arr4 = (int[])arr1.clone();

/*
 * 4. for 문과 인덱스를 이용한 복사
 */
int[] arr5 = new int[newLen];
for (int i = 0; i < arr1.length; i++) {
	arr5[i] = arr1[i];
}

Enhanced for 문

  • 배열과 컬렉션의 모든 요소를 순회할때 간소화된 문법으로 Enhanced for 문을 사용할 수 있음
  • 배열을 순회할 때 순회 대상은 deep copy된 새로운 배열 객체가 됨으로 값을 변경해도 원본 배열에 변화가 없음에 유의
    배열을 순회하며 값을 변경하고 싶은경우 그냥 for문을 사용해야함
// for문과 동일한 문법을 사용하나 조건식의 내부를 (타입 변수이름: 순회할 대상) 으로 작성한다는 차이가 있음
int[] arr = new int[]{1, 2, 3, 4, 5};
for (int e : arr) {
    System.out.print(e + " "); // 1 2 3 4 5
}

출처
http://www.tcpschool.com/java/java_array_memory
https://stackoverflow.com/questions/18638743/is-it-better-to-use-system-arraycopy-than-a-for-loop-for-copying-arrays

profile
냐아아아아아아아아앙

0개의 댓글