Ch5 - 배열 1
배열 선언
P.151
"대괄호 []는 배열변수를 선언하는 기호로, 타입 뒤에 붙을 수도 있고 변수 뒤에 붙을 수도 있다"
"배열 변수는 참조 변수에 속한다. 배열도 객체이므로 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 객체를 참조하게 된다."
즉, iA는 참조변수로서 스택메모리에 올라가고,
배열객체는 힙메모리에 존재하며 주소값으로 연결된다.
이때 주소값은 iA에 저장되어 있으며,
배열객체의 첫번째 열 또한 이 주소를 가지고 있다.
값 목록으로 배열 생성
p. 152~3
"중괄호{}는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성하고, 배열 객체의 번지를 리턴한다. 배열 변수는 리턴된 번지를 저장함으로써 참조가 이루어진다"
단, 이렇게 배열 선언을 한 경우에는 다른 실행문에서 중괄호를 사용한 배열 생성은 허용되지 않는다. 변수를 미리 선언한 후, 값 목록을 입력하고 싶다면 new연산자를 사용해야 한다.
배열의 초기값
스택메모리에 올라가는 변수들과 달리, 배열변수를 포함한 힙메모리에 올라가는 변수들은 초기값이 자동으로 정해진다.
기본타입(정수) : byte[], short[], int[] - 0 | char[] - '\u0000' | long[] - 0L
기본타입(실수) : float[] - 0.0F | doulbe[] - 0.0
기본타입(논리) : boolean[] - false
참조타입 : 클래스[], 인터페이스[] - null
배열 길이
배열 객체의 length필드는 [배열변수.length]로 적으며, for문을 사용해서 배열 전체를 루핑할 때 매우 유용하다.
배열에 값을 {0,1,2,3}으로 채워넣는 실행문인데, 여기서 i < iA.length로 쓰는 이유는 배열의 마지막 인덱스는 배열 길이보다 1이 적기 때문이다.
(배열의 마지막 인덱스는 iA.length -1)
관련 코드 (수업시간 예시)
package p1;
import java.util.Scanner;
public class ArrayEx2 {
public static void main(String[] args) {
//149page
int[] iA; //스택 메모리에 iA라는 변수 생성.
//int[] iA = null; → 힙메모리에 주소가 없다는 의미를 가진다는 점에서 차이가 있다.
iA = new int[5]; //배열의 자료를 넣을 수 있도록 힙 메모리에 공간 할당 →주소값 반환
iA[0] = 20; //0열에 20이란 값을 넣음
System.out.println(iA); //iA가 참조하는 힙영역 배열의 주소값을 보여준다.
iA = null;
//주소값이 있던 자리에 null이 들어오면서 힙메모리와의 연결이 끊기고, 힙메모리 안의 값 20은 쓰레기값이 된다.
//1. 배열 선언과 동시에 힙메모리에 공간 확보 → 2. 값 입력
double[] dA = new double[5]; //배열 선언과 동시에 힙메모리에 공간 확보
dA[0] = 100.1; // 가장 직관적인 방법
//동시에 배열 선언, 힙메모리 할당, 값 입력
double[] ddA = {100.1, 200.1};
//단, 데이터 갯수에 따라 배열요소의 크기가 결정된다. (크기는 변경 불가, 복사를 통해서만 변경 가능)
//for문을 이용한 배열의 자료 출력
for (int i= 0; i<dA.length; i++) {
System.out.println("dA[" + i + "] = " + dA[i]);
}
for (int i= 0; i<ddA.length; i++) {
System.out.println("ddA[" + i + "] = " + ddA[i]);
}
}
}
다차원배열
p.162
"다차원 배열은 중첩 배열 방식(일차원 배열이 서로 연결된 구조)으로 구현되기 때문에 계단식 구조를 가진다.
배열의 길이
scores.length = 행의 크기 = 2
scores[0].length = 열의 크기 = 2scores[1].length = 열의 크기 = 3
관련 코드 (수업시간 예시)
package Review;
public class Array165Ex2 {
public static void main(String[] args) {
// 3차원
int[][][] i3A = new int[2][2][3]; // 2면 2행 3열
// 2면2행3열에 거꾸로 값넣어보기
// 1번
i3A[0][0][0] = 12;
i3A[0][0][1] = 11;
i3A[0][0][2] = 10;
i3A[0][1][0] = 9;
i3A[0][1][1] = 8;
i3A[0][1][2] = 7;
i3A[1][0][0] = 6;
i3A[1][0][1] = 5;
i3A[1][0][2] = 4;
i3A[1][1][0] = 3;
i3A[1][1][1] = 2;
i3A[1][1][2] = 1;
for(int i=0;i<i3A.length; i++) { //면
for(int j=0;j<i3A[i].length ; j++) { //행
for(int k=0; k<i3A[i][j].length ; k++) { //열
System.out.print(" " + i3A[i][j][k]+"\t");
}
System.out.println("----------------행 넘김");
}
System.out.println("=======================면 넘김");
}
// 2번 for방법
System.out.println();
System.out.println("<<<2.for로 채워넣기>>>");
int num = 12;
for (int i = 0; i < i3A.length; i++) {
for (int j = 0; j < i3A[0].length; j++) {
for (int k = 0; k < i3A[0][0].length; k++) {
i3A[i][j][k] = num;
System.out.print(i3A[i][j][k] +"\t");
num--;
}
System.out.println();
}
System.out.println("============================면 넘김");
}
// 3번 초기값 넣기
System.out.println();
System.out.println("<<<3.초기값 바로 넣기>>>");
int[][][] iA3 = { { { 12, 11, 10}, { 9, 8, 7} }, // 0면
{ { 6, 5, 4 }, { 3, 2, 1 } } };
for(int i=0; i<iA3.length; i++) {
for(int j=0; j<iA3[i].length; j++) {
for(int k=0; k<iA3[i][j].length; k++) {
System.out.print(" " + iA3[i][j][k] + "\t");
}
System.out.println("---------------행 넘김");
}
System.out.println("==========================면 넘김");
}
//4번 배열 선언하고 나중 초기값 넣기
System.out.println("\n<<<4.배열 선언 후 초기값 넣기>>>");
int[][][] i4A;
i4A = new int[][][] { { { 12, 11, 10 }, { 9, 8, 7 } },
{ { 6, 5, 4 }, { 3, 2, 1 } } };
for(int i=0; i<i4A.length; i++) {
for(int j=0; j<i4A[i].length; j++) {
for(int k=0; k<i4A[i][j].length; k++) {
System.out.print(" " + i4A[i][j][k] +"\t");
}
System.out.println("---------------행 넘김");
}
System.out.println("=========================면 넘김");
}
}
}
참고 -이것이 자바다