● 배열(array)이란?

: 인덱스와 인덱스에 대응하는 데이터들로 이루어진 자료 구조로 배열을 이용하면 한 번에 많은 메모리 공간 할당 가능하도록 하는 것을 의미합니다. 그래서 Data의 효율적인 처리할 수 있도록 해줍니다.

 

 

 

● 배열의 특징

같은 타의 데이터들이 순차적으로 저장

- 인덱스를 이용하여 원소 데이터 접근

- 반복문을 이용하여 처리하기에 적합

- 0부터 카운터 시작

- 하나의 이름으로 많은 양의 data를 관리

 

 

● 배열의 형식

 

1) 기본형

package Array;

public class Array {
	public static void main(String[] args) {
              
       int[] age = new int[3]
    
         age[0] = 20;
		 age[1] = 21;
		 age[2] = 22;
         
         for(int i =0 ; i < 3 ;i++) {
			System.out.println("나이 : " + age[i]);
		}
        
        결과값 : 20 , 21 , 22

	}
}

 

 

2) count 값을 넣지 않은 배열

package Array;

public class Array {
	public static void main(String[] args) {

int[] age = new int[] {20,21,22,23,24,25,26}; 
		
count 값을 넣지 않아야 error 나지 않습니다.  
초기 값을 넣으면 그 값보다 작은 수를 넣으면 
남은 공간에 무엇이 들어와야 하는지 모르기 때문에 java가 오류가 생깁니다. 
		
		
for(int i =0 ; i < age.length ;i++) {
System.out.println("나이 : " + age[i]);
}
       
결과값: 20, 21, 22, 23, 24, 25, 26   

age.length 의 age의 길이를 담기 때문에 code 문제 없이 수행합니다. 
이렇게 처리하게 되면 age의 값이 변동해도 for 반복문은 문제 없이 수행합니다. 
       
    }
}

 

 

3) new 참조형[] 생략 하는 배열 (+ 매서드 활용)

package Array;
public class Array {
	public static void main(String[] args) {
    		int[] arr = {1, 2, 3, 4, 5}; // new int[] 생략하고 초기화가 가능하다.   
        int num = 10;
        
        int [] result ; // 참조 변수 선언으로 stack 영역에 4byte 할당해준다. 
        
		 result = addAllArray(arr , num); // arr = a , num = n
		 
		 for(int i = 0; i < result.length; i++) {
			 System.out.println("result : " + result[i]);  결과값 11, 12, 13, 14, 15
		 }
		 
		 for(int i = 0; i < arr.length; i++) {
			 System.out.println("arr : " + arr[i]);	 결과값 11, 12, 13, 14, 15
		 }
	}
	
	public static int[] addAllArray(int[] a, int n) {  
    // 매개변수 + 지역변수 - int[] arr 과 같은 주소값을 가집니다.
	// 참조변수 일 때, 주소값을 전달 받도록 해서 사용합니다. 
		
	for(int i = 0; i < a.length;i++) {
		a[i] += n;
		System.out.println(a[i]);
            }
		return a; 	// 결과값 11, 12, 13, 14, 15
	} 
}

 

 

4) String 사용 배열(+참조자료형 활용)

package Array;
public class Array {
	public static void main(String[] args) {
    String[] strArr = new String[3]; // 12byte 할당. 
    
    System.out.println(strArr[0]); 
    null 출력 : 선언이 되어서 메모리가 할당 되어 있지만 아무값도 입력되지 않아서 null이 출력합니다.
    
	    strArr[0] = "홍길동";
	    strArr[1] = "이순신";
	    strArr[2] = "세종대왕";
	
     for(int i = 0; i< strArr.length ; i ++){ 
			 System.out.println(strArr[i]); 
			 }
		

 문자열이 저장되어 있는 주소값을 저장하려는 것입니다. 메모리 어딘가에 있는 문자열을 각각의 시장 주소값을 저장하기 위해서 new를 선언하여 strArr으로 주소값을 저장시키는 것입니다.

 

 

 

배열 2가지 관점

 

1. 기본자료형

 

- 반드시 동일한 자료형으로 배열이 가능합니다.

- 하나의 변수안에 같은 자료형으로 순서에 맞게 입력하여 관리합니다.

- 변수의 이름으로 메모리에 접근하고 순서(번호)로 접근합니다.

- 하나의 이름으로 많은 양의 data를 관리합니다.

 

int[] younghee = new int[5];
		
younghee[0] = 90; // 국어
younghee[1] = 95; // 영어
younghee[2] = 85; // 수학
younghee[3] = 95; // 사회
younghee[4] = 90; // 과학
		
데이터 처리에 반복문을 이용
		
for(int i = 0 ; i < 5; i++) {
	ystem.out.println(younghee[i]);
}

 

반복분을 이용해 결과값을 가져오는데 아주 유용합니다.

결과값 = 90, 95, 85, 95, 90

 

 

2. 참조자료형

package 배열.Apple;

public class Applemain {
	public static void main(String[] args) {
		// new Mart[3]; 
		// 만약 : class Mart 총 할당 된 메모리량이 50byte라면 
		// Heap 안에 50byte 씩 3개가 할당 되어지는 것이 아닙니다!!
				
		Mart eMart = new Mart("이마트" ,  100 , 500);
		Mart homeplus = new Mart("홈플러스" , 200 , 1000);
		Mart walmart = new Mart("월마트" , 300, 2000);
				
		Mart[] mart = new Mart[3]; //4byte씩 3개가 할당 된다(주소값만을 넣어주는 것이다)
		mart[0] = new Mart("이마트" ,  100 , 500); // 실질적으로 할당된 주소값을 저장
		mart[1] = new Mart("홈플러스" , 200 , 1000);
		mart[2] = new Mart("월마트" , 300, 2000);
				
		mart[0]. displayMart(); // 이마트
		mart[1]. displayMart(); // 홈플러스
		mart[2]. displayMart(); // 월마트

 

위와 같이 참자료형 자체를 배열로 사용하려고 할 때 우리가 주의해야 할 사항이 있습니다.

그것은!! 선언한 참조자료형 자체 모두가 저장이 되어서 할당 되는 것이 아니라는 사실입니다.

그렇다면 어떻게 배열로 사용할 수 있을까요? 그것은 참조자료형의 주소값을 저장함으로 그 저장되어있는 것을 불러올 수 있게 만드는 것입니다.

 

만약에  mart.매개변수(); 를 불러오면 error 가 나타납니다. 왜냐하면 mart 배열 안에 class Mart 자체를 넣은 것이 아니라 new Mart("이마트" , 100 , 500);의 이름값만 가지고 있는 것이기 때문입니다.

 

= 자료형의 배열 선언은 하나의 이름으로 heap 영역에서 각각의 인스턴스에 접근하도록 하는 것이므로 참조 자료형의 이름(주소값)을 하나로 관리하겠다는 의미로 이해하시면 됩니다.

 

 

● 2차원 배열

package Array;

public class Array {
	public static void main(String[] args) {
		int[][] arr = new int[3][4]; // 대괄호를 2
		4byte 가 12개 할당 받은 것이다 = 48byte , arr 의 이름으로 다 관리한다.
        
        // int [3][4] / 3행 4열
		
		arr[0][0] = 0;
		arr[0][1] = 1;
		arr[0][2] = 2;
		arr[0][3] = 3;
		
		arr[1][0] = 4;
		arr[1][1] = 5;
		arr[1][2] = 6;
		arr[1][3] = 7;
		
		arr[2][0] = 8;
		arr[2][1] = 9;
		arr[2][2] = 10;
		arr[2][3] = 11;

		for(int i = 0; i< 3;i++) {     // 행의 개념
			for(int j=0; j<4; j++) {   // 열의 개념
				System.out.println("[" + i +"]"+"["+j+"]"+ " = "  + arr[i][j]);
			}
		}
         
         
        new int[i][j]; 변경 되어도 error 나지 않도록 하는 방법
		2차원 -> 행 : length / 열 : arr[num].length 
		for(int i = 0; i< arr.length ;i++) {       // 행의 개념
			for(int j=0; j<arr[i].length; j++) {      // 열의 개념
				System.out.println("[" + i +"]"+"["+j+"]"+ " = "  + arr[i][j]);
			}
		}
		
	}
}

 

주의 해야할 점!!

for(int i = 0; i< arr.length ;i++) { // 행의 개념

for(int j=0; j<arr[i].length; j++) { // 열의 개념
for(int j=0; j System.out.println("[" + i +"]"+"["+j+"]"+ " = " + arr[i][j]);

 

위의 코드에서 for(int j=0; j<arr[i].length; j++)  대괄호 안에 i 가 들어가야 하는 이유!?

package exam12;

public class RaggedArray {
	public static void main(String[] args) {
		
		int[][] ar = {
	             {0 ,1},           
	             {4, 5, 6},
	             {8, 9, 10, 11}
		 };
		
		for(int i = 0; i< ar.length ;i++) {       // 행의 개념
			for(int j=0; j<ar[i].length; j++) {   // 열의 개념
				System.out.println("[" + i +"]"+"["+j+"]"+ " = "  + ar[i][j]);
			}
		}
	}
}

arr[i].length 괄호 안에 i 가 들어가야 하는 이유는 열의 개수가 항상 동일한 것이 아니기 때문입니다.

 

 

● 행과 열의 분리선언

: 기능은 지원 되지만 많이 사용하지 않습니다. 가급적이면 처음부터 초기화 시키는 것이 좋습니다.

int[][] a = new int[3][]; // ragged array
		a[0] = new int[2];
		a[1] = new int[3];
		a[2] = new int[4];
		

 

● for - each 문

public static void main(String[] args) {
		int[] arr = {1,2,3,4,5};
		int sum = 0;
	
		for(int e :arr) { 
			 System.out.println("e = " + e);
			 sum += e;
		}

주의!!!

(;) 세미콜론이 아닌 (:) 콜론 하나만 사용해야 합니다. 배열의 전체를 참조할 필요가 있는 경우에 유용되는 반복문입니다.
for (int e :arr){ } arr의 숫자 하나씩 e에 담아주면서 반복합니다.

 

혼돈하지 말아야 할 것!

for(int e :arr) { 
e++; 
System.out.print(e + " " ); // 한줄에 다 출력되게 만들 때 = print 사용.
		}

- e라는 별도의 저장공간을 할당 받아서 수행하는 것이기 때문에 arr 의 값은 변경 없습니다.

 

 

 

 

'빅데이터 > JAVA' 카테고리의 다른 글

[JAVA] 상속(inheritance)  (0) 2020.05.05
[JAVA] 콘솔 출력  (0) 2020.05.04
[JAVA] String  (0) 2020.05.02
[JAVA] Scanner  (0) 2020.04.30
[JAVA] System.out.println() , 자바의 메모리 모델  (0) 2020.04.30

+ Recent posts