Java/Study

Ch5 - 배열 1

어굴애 2021. 2. 27. 23:22

배열 선언

 

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("=========================면 넘김");
			}
		}
	}

참고  -이것이 자바다