배열

같은 자료형의 변수들을 하나의 묶음으로 다루는 것
  • 배열은 저장된 값 마다 인덱스 번호가 부여됨. (0부터 시작)
  • 이름은 하나지만 저장공간은 여러개

 

 

 

 

 

배열 선언과 할당

배열 선언
자료형[ ] 배열명;
자료형 배열명[ ];

 

 

 

 

배열 할당
배열명 = new 자료형[배열크기];

 

 

 

배열 선언과 할당
자료형[ ] 배열명 = new 자료형[배열크기];
자료형 배열명[ ] = new 자료형[배열크기];

 

 

 

 

배열 초기화
  • index가 순차적으로 증가함에 따라 초기화 할 리터럴 값이 규칙적이라면 반복문을 통해 배열 초기화 가능

 

  • 인덱스를 이용한 초기화

 

 

 

  • for문을 이용한 초기화

 

 

 

 

  • 선언과 동시에 초기화

 

 

 

 

 

 

배열 저장구조
  • 배열은 참조 변수로 Heap영역에 할당되며 배열 공간의 주소를 저장
  • 배열 공간의 주소를 이용해 인덱스를 참조하는 방식으로 값 처리
  • int[ ] arr = new int[4];

 

  1. 숙지할 포인트 : 참조변수, 참조변수는 배열의 주소를 저장, 인덱스를 기준으로 참조
  2. 주소값 : heap영역의 주소를 저장

 

 

 

public class Application1 {

	
	public static void main(String[] args) {
		
		
		/* 배열이란?
		 * 동일한 자료형의 묶음(연속된 메모리 공간에 값을 저장하고 사용하기 위한 용도) 이다.
		 * 배열은 heap영역에 new 연산자를 이용하여 할당한다. 
		 * */
		
		/* 배열의 사용 이유
		 * 만약 배열을 사용하지 않는다면 변수를 여러개 사용해야 한다.
		 * 1. 연속된 메모리 공간으로 관리할 수 없다. (모든 변수의 이름을 사용자가 관리해야한다.)
		 * 2. 반복문을 이용한 연속 처리가 불가능하다.  
		 * */
		
		/* 변수 5개에 값을 저장한다.
		 * 이 때 사용자(개발자)는 변수의 이름을 모두 알아야 한다.
		 *  */
		
		int num1 = 10;
		int num2 = 20;
		int num3 = 30;
		int num4 = 40;
		int num5 = 50;
		
		/* 변수의 합을 저장하기 위한 용도의 변수 */
		int sum = 0;
		
		/* 반복문을 사용하지 못하고 일일히 더해줘야 한다. */
		sum += num1;
		sum += num2;
		sum += num3;
		sum += num4;
		sum += num5;
		
		System.out.println("sum : " + sum);
		
		/* 배열을 이용해보자 */
		/* 배열의 선언 및 할당 */
		int[] arr = new int[5];
		//new  연산자 + 내가 할 당하고싶은 크기
		
		/* 하나의 이름으로 관리되는 연속된 메모리 공간이고, 
            * 공간마다 찾아갈 수 있는 번호(인덱스)를 이용해 접근한다. 
		 * 연속된 패턴이 있다면 반복문을 이용할 수 있다.*/
		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		arr[3] = 40;
		arr[4] = 50;
		
		/* 값을 대입할 때도 반복문을 사용할 수 있다. */
		for(int i = 0, value = 0; i < arr.length; i++) {
		//초기값을 반드시 하나만 지정할 필요는 없다. 콤마로 나열 가능
		//콤마는 같은 타입선언을 의미한다.
		//배열이름.length = 배열이 가지고있는 길이를 알려준다. 
			arr[i] = value += 10;
			
		}
		
	
		/* 배열의 값을 누적해서 담을 변수 선언 */
		int sum2 = 0;
		
		/* 일반적인 변수처럼 사용할 수 있다. */
		sum2 += arr[0];
		sum2 += arr[1];
		sum2 += arr[2];
		sum2 += arr[3];
		sum2 += arr[4];
		
		System.out.println("sum2 : " + sum2);
		
		/* 배열의 값을 반복문을 이용해서 누적하여 담을 변수 */
		int sum3 = 0;
		
		for(int i = 0; i < arr.length; i++) {
			sum3 += arr[i];
			
		}
		System.out.println("sum3 : " + sum3);
		
		
	}
	

}


//콘솔창
//sum : 150
//sum2 : 150
//sum3 : 150

 

 

import java.util.Scanner;

public class Application2 {

	public static void main(String[] args) {


		/* 배열의 사용 방법 */
		
		/* 배열의 선언 */
		/* 자료형[] 변수명;
		 * 자료형 변수명[]; 두가지로 선언할 수 있다.
		 * 
		 *  */
		
		/* 선언이란 : stack에 배열의 주소를 보관할 수 있는 공간을 만드는 것이다. 
		 * 즉, 실제값이 담기는 공간이 아니라 '주소'가 담기는 공간인 것*/
		
		int[] iarr;
		char carr[];
		
		/* 선언한 레퍼런스 변수에 배열을 할당하여 대입할 수 있다.
		 * new 연산자는 heap 영역에 공간을 할당하고 발생한 주소값을 반환하는 연산자이다.
		 * 발생한 주소를 레퍼런스 변수(참조할 변수)에 저장하고 이것을 참조하여 사용하기 때문에 참조자료형(reference type) 
		 * 이라고 한다. 즉, 힙영역에 주소값을 가지고있는 변수 */
		
		/* 배열을 할당할 시에는 반드시 배열의 크기를 지정해주어야 한다. */
		//iarr = new int[];
		//크기 기입이 누락됐다면 컴파일 에러가 뜬다.
		iarr = new int[5];
		carr = new char[10];
		// 변수 = new 타입[크기];
		
		
		/* 위의 선언과 할당을 동시에 할 수도 있다. */
		int[] iarr2 = new int[5];
		char carr2[] = new char[10];
		//타입[] 변수 = new 타입[];
		
		
		/* heap 메모리는 이름으로 접근하는 것이 아닌 주소로 접근하는 영역이다.
		 * stack에 저장된 주소로 heap에 할당 된 배열을 찾아갈 수 있다. */
		System.out.println("iarr : " + iarr);
		System.out.println("carr : " + carr);

		//콘솔
//		iarr : [I@7637f22
//		carr : [C@3830f1c0
		
		
		/* hashcode() : 일반적으로 객체의 주소값을 10진수로 변환하여 생성한 객체의 고유한 정수값을 반환한다.
		 * 동일 객체인지 비교할 때 사용할 목적으로 쓰여지며, 동등객체를 동일객체(주소가 같은지) 
		 * 취급하기 위한 용도로 overriding 에서 사용한다. 
		 * 이 부분은 뒤에서 다루게 되니, 그 전까지는 쉽게 주소값이라고 생각하고 사용하면 된다.
		 *  */
		
		System.out.println("iarr의 hashcode : " + iarr.hashCode());
		System.out.println("iarr의 hashcode : " + carr.hashCode());
		//해쉬코드 : 배열 주소를 10진수로 변환하는 메소드라고 생각할것 
//		iarr의 hashcode : 123961122	//콘솔
//		iarr의 hashcode : 942731712 //콘솔
		
		
		/* 배열의 길이를 알 수 있는 기능을 필드로 제공하고 있다.
		 * 필드 또한 뒤에서 다루게 될 것이다. (일종의 변수)
		 * 참고로 String의 문자열 길이는 메소드로 제공하고 있기 때문에 length로 사용한다. */
		
		System.out.println("iarr2의 길이 : " + iarr2.length);
		System.out.println("iarr2의 길이 : " + carr2.length);
		
//		iarr2의 길이 : 5
//		iarr2의 길이 : 10
		// 혼동주의
		// 스트링에서 메소드로 제공했던것은 length()였지만, 
		// 배열의 길이를 알아올때는 배열이름.length 방법으로 받아와야한다.
		
		
		/* 스캐너를 통해 입력 받은 정수로 배열 길이를 지정하여 배열을 할당할 수 있다. */
		Scanner sc = new Scanner(System.in);
		
		System.out.print("새로 할당할 배열의 길이를 입력하세요 : ");
		int size = sc.nextInt();
		
		double[] darr = new double[size];
		
		System.out.println("darr의 hashCode : " + darr.hashCode());
		System.out.println("darr의 길이 : " + darr.length);
		
//		darr의 hashCode : 1170794006
//		darr의 길이 : 15
		
		
	
		/* 한 번 지정한 배열의 크기는 변경하지 못한다. */
		
		/* 배열의 사이즈를 변경한 것이 아니고, 새로운 배열을 생성하여(new) 그 주소값을 레퍼런스 변수에 덮어쓴것이다. 
		 * 기존의 값이 아닌 더 큰값이 필요하다면 덮어 쓰도록 한다.*/
		darr = new double[30];
		
		/* hashCode 를 보면 다른 값을 가지고 있는 것을 확인할 수 있다. */
		System.out.println("수정 후 darr의 hashCode : " + darr.hashCode());
		System.out.println("수정 후 darr의 길이 : " + darr.length);
		
//		수정 후 darr의 hashCode : 1289479439
//		수정 후 darr의 길이 : 30
		
		/* 한 번 할당된 배열은 지울 수 없다.
		 * 다만 레퍼런스 변수를 null로 변경하면, 더 이상 주소가 참조되지 않는 배열은 
		 * 일정 시간이 지난 후 heap의 old 영역으로 이동하여 GC(가비지 컬렉터) 가 삭제시킨다.
		 * 한번 찾아갈 수 있는 주소값을 잃어버린 배열은 다시 참조 불가능하다. 
		 * null : 아무것도 참조하고있는게 없으며(쓰이지 않음), 비웠다. 는 의미
		 * */
		darr = null;
		
		
		/* java.lang.NullPointerException */
		/* 아무것도 참조하지 않고 null이라는 특수한 값을 참조하고 있는 도중에 
		 * 참조연산자를 사용하게 될 때 발생하는 에러이다. */
		System.out.println("삭제 후 darr의 길이 : " + darr.length);
		//NullPointerException 발생, 원인 : 참조변수가 null 즉, 아무객체도 참조하고있지않기 때문
		
		
		
		
		
	}

}

 

 

 

 

 

 

 

배열 저장구조
  • Heap 영역은 값이 없는 공간이 존재 할 수 없으므로 처음 배열 선언 시 자료형별 기본값으로 초기화 됨

 

 

 

public class Application3 {

	public static void main(String[] args) {

		/* 기본적으로 배열을 선언하고 할당하게 되면
		 * 배열의 각 인덱스에는 자바에서 지정한 기본값으로 초기화 된 상태가 된다.\
		 * heap영역은 값이 없는 빈 공간이 존재할 수 없다.
		 *  */
		
		/* 값의 형태별 기본값
		 * 정수 : 0
		 * 실수 : 0.0
		 * 논리 : false
		 * 문자 : \u0000
		 * 참조 : null
		 * */
		
		int[] iarr = new int[5];
		
		/* int의 기본 값인 0으로 초기화 되어있다. */
		for (int i = 0; i < iarr.length; i++) {
			System.out.println("iarr[" + i + "]의 값 : " + iarr[i]);
		
//			콘솔창
//			iarr[0]의 값 : 0
//			iarr[1]의 값 : 0
//			iarr[2]의 값 : 0
//			iarr[3]의 값 : 0
//			iarr[4]의 값 : 0
		}
			
			/* 지정한 기본 값 외의 값으로 초기화를 하고싶은 경우 블럭을 이용한다.
			 * 블럭을 사용하는 경우에는 new를 사용하지 않아도 되며, 값의 개수만큼 자동으로 크기가 설정된다. 
			 * */
			int[] iarr2 = {11, 22, 33, 44, 55};
			
			/* 이러한 형식으로도 사용가능하다. */
			int[] iarr3 = new int[] {11, 22, 33, 44, 55};
			
			System.out.println("iarr2의 길이 : " + iarr2.length);
			System.out.println("iarr3의 길이 : " + iarr3.length);
			
//			콘솔
//			iarr2의 길이 : 5
//			iarr3의 길이 : 5
			
			
			/* 초기화 값 확인 */
			for(int i = 0; i < iarr2.length; i++) {
				System.out.println("iarr2[" + i + "]의 값 : " + iarr2[i]);
			}
			
			for(int i = 0; i < iarr3.length; i++) {
				System.out.println("iarr3[" + i + "]의 값 : " + iarr3[i]);
					
			}
			
			/* 문자열 배열로도 사용할 수 있다. */
			String[] sarr = {"apple", "banana", "grape"};
			
			for(int i = 0; i < sarr.length; i++)
			System.out.println("iarr3[" + i + "]의 값 : " + sarr[i]);
				
//			iarr3[0]의 값 : apple
//			iarr3[1]의 값 : banana
//			iarr3[2]의 값 : grape
				
			
		}
		

}

 

 

import java.util.Scanner;

public class Application4 {

	public static void main(String[] args) {

		/* 배열을 이용한 예제 */
		/* 5명의 자바 점수를 정수로 입력 받아서 합계와 평균을 실수로 구하는 프로그램을 만들어 보세요 */
		
		/* 5명의 자바점수를 저장할 배열 할당 */
		int[] scores = new int[5];
		
		Scanner sc = new Scanner(System.in);
		
		/* 반복문을 이용하여 배열 인덱스에 하나씩 접근해서 점수를 입력 받는다 */
		for (int i=0; i < scores.length; i++) {
			System.out.print((i +1) + "번 째 학생의 자바 점수를 입력해주세요 : ");
			scores[i] = sc.nextInt();		//?? 
		
		}

		/* 합계와 평균을 구한다. */
		double sum = 0.0;
		double avg = 0.0;
		
		/* 합계는 모든 인덱스의 값을 sum 변수에 누적해서 담아준다. */
		/* 배열의 인덱스 범위를 넘어가는 호출을 했을경우 out of bounds exception 에러가 발생 */
		for (int i = 0; i < scores.length; i++) {
			sum += scores[i];
			//i <= scores.length;로 범위를 입력해선 안된다. 범위를 넘어가기에 에러발생
			
		}
		
		/* 평균은 합계를 구한 값에서 배열의 길이(갯수)로 나눈다. */
		avg = sum / scores.length;
		
		System.out.println("sum : " + sum);
		System.out.println("avg : " + avg);
		
/* 콘솔창
		1번 째 학생의 자바 점수를 입력해주세요 : 100
		2번 째 학생의 자바 점수를 입력해주세요 : 90
		3번 째 학생의 자바 점수를 입력해주세요 : 80
		4번 째 학생의 자바 점수를 입력해주세요 : 70
		5번 째 학생의 자바 점수를 입력해주세요 : 60
		sum : 400.0
		avg : 80.0
	*/	
		
		
		
		
		
		
	}

}

 

 

public class Application5 {

	public static void main(String[] args) {
		
		/* 랜덤한 카드를 한장 뽑아서 출력해보자 */
		/* 먼저 모양과 카드 숫자별로 값을 저장할 두 종류의 배열을 만들자 */
		
		String[] shapes = {"SPADE", "CLOVER", "HEART", "DIAMOND"};
		String[] cardNumbers = {"2", "3", "4", "5", "6", "7", "8", 
        		"9", "10", "JACK", "QUEEN", "KING", "ACE"};
		
		/* 배열 인덱스 범위의 난수발생 */
		int randomShapeIndex = (int)(Math.random() * shapes.length);
 		int randomCardNumbers = (int)(Math.random() * cardNumbers.length);
 		
 		System.out.println("당신이 뽑은 카드는 " + shapes[randomShapeIndex] + " " 
			+ cardNumbers[randomCardNumbers] + "카드입니다.");

	}

}

 

 

 

 

2차원 배열

2차원 배열은 1차원 배열들의 묶음
  • 자료형이 같은 1차원 배열들의 묶음
  • 2차원 배열은 할당 된 공간 마다 인덱스 번호 두 개 부여 (앞 번호는 행, 뒷 번호는 열)

 

 

2차원 배열 선언과 할당

 

배열 선언
1) 자료형[ ][ ] 배열명;
2) 자료형 배열명[ ][ ];
3) 자료형[ ] 배열명[ ];

 

 

배열 할당
자료형[ ][ ] 배열명 = new 자료형[행크기][열크기];

 

 

배열의 선언과 할당
자료형[ ][ ] 배열명 = new 자료형[행크기][열크기];
자료형 배열명[ ][ ] = new 자료형[행크기][열크기];
자료형[ ] 배열명[ ] = new 자료형[행크기][열크기];
  • 인덱스는 0부터 시작한다.
  • 첫번째 칸이 행에 해당, 두번째 칸이 열에 해당
  • 선언은 [4][4]로 하지만 그 인덱스가 가질 수 있는 가장 마지막 배열은 [3][3]이 된다. 

 

 

2차원 배열 구조
  • int[ ][ ] arr = new int[2][4];

  1. 2차원 배열은 각각의 1차원 배열을 묶어서 저장해주어야 하기 때문에 하나의 공간이 더 생긴다.
  2. 그 하나의 공간(0x123)은 1차원 배열을(0x678) 참조하고 있는 또하나의 참조변수이다. 

 

 

 

 

2차원 배열 초기화

 

  • 인덱스를 이용한 초기화

 

 

  • for문을 이용한 초기화

  1. 반복문이 중첩되어야 행과 열에 해당하는 인덱스에대한 처리를 할 수 있다.
  2. 행에대한 부분은 외부 for 문으로, 열에대한 부분은 내부 for문으로

 

 

  • 선언과 동시에 초기화

 - 'arr[1][1] 은 6에 해당한다' 등으로 알아볼 수 있다. 

 

 

public class Application1 {

	public static void main(String[] args) {
		
		/* 다차원 배열
		 * 다차원 배열은 2차원 이상의 배열을 의미한다.
		 * 배열의 인덱스마다또 다른 배열의 주소를 보관하는 배열을 의미한다.
		 * 즉, 2차원 배열은 1차원 배열 여러개를 하나로 묶어서 관리하는 배열을 의미한다.
		 * 더 많은 차원의 배열을 사용할 수 있지만 일반적으로 2차원 배열보다 더 높은 차원의 배열은 사용 빈도가 현저히 적다. 
		 * */

		/* 1. 배열의 주소를 보관할 레퍼런스 변수 선언(stack) */
		int[][] iarr1;
		int iarr2[][];
		int[] iarr3[];
		
		/* 2. 여러개의 1차원 배열의 주소를 관리하는 배열을 생성(heap) */
		/* heap에 공간을 할당할 때는 new연산자를 이용한다.
		 * 배열의 주소를 관리하는 배열의 길이는 앞 부분에 정수형으로 표하며 반드시 크기를 지정해주어야 한다. */
		
		// iarr1 = new int[][];		//크기를 지정하지않으면 컴파일 에러 발생
		// iarr1 = new int[][4];	
		//주소를 묶어서 관리할 배열의 크기를 지정하지않으면 에러 발생
		// 다차원배열에서 참조변수 두개가 있는데 그 중 가운데 참조배열을 선언하지 않은 것과 마찬가지이다. 
		iarr1 = new int[3][];
		
		
		/* 3. 주소를 관리하는 배열의 인덱스마다 배열을 할당한다(heap) */
		iarr1[0] = new int[5];
		iarr1[1] = new int[5];
		iarr1[2] = new int[5];
		
		/* 참고 : 위에서 진행한 2,3번을 동시에 진행 할 수도 있다.
		 * 앞 부분 정수는 주소를 관리하는 배열의 크기, 뒷부분 정수는 각 인덱스에 할당하는 배열의 길이이다.
		 * 관리하는 여러개의 배열의 길이가 동일한 경우 아래와 같이 한번에 할당할 수도 있다.
		 * 하지만 여러개의 배열의 길이가 각각 다른경우 위에서 했던 방식처럼 인덱스별로 배열을 따로 할당해 주어야 한다.
		 * 서로 같은 길이의 여러개 배열을 하나로 묶어 관리하는 2차원 배열을 "정변배열"이라고 하며,
		 * 서로 길이가 같지않은 여러개의 배열을 하나로 묶어 관리하는 2차원 배열을 "가변배열"이라고 한다. 
		 *  */
		
		iarr2 = new int[3][5];
		
		/* 4. 각 배열의 인덱스에 차례로 접근해서 값 출력 */
		/* 할당 후에 아무 값을 대입하지 않아도 heap 영역에는 값이 없는 상태로 
		 * 공간을 생성할 수 없기 때문에 기본 값이 들어있다. */
		
		/* 4-1. 배열 하나씩 접근해서 출력하기 */
		
		/* 0번 인덱스의 배열 값 출력 */
		for (int i = 0; i < iarr1[0].length; i++) {
			System.out.print(iarr1[0][i] + " ");
		}	//0 0 0 0 0 출력
		
		System.out.println();
		
		/* 1번 인덱스의 배열 값 출력 */
		for (int i = 0; i < iarr1[1].length; i++) {
		System.out.print(iarr1[1][i] + " ");		
		}	// 0 0 0 0 0 출력

		System.out.println();
		
		/* 2번 인덱스의 값 출력 */
		for (int i =0; i < iarr1[2].length; i++) {
			System.out.print(iarr1[2][i] + " ");
		}
		
		System.out.println();	//위에가 print이므로 개행
		
		
		/* 4-2. 중첩 for문을 이용해서 배열의 값 출력 */
		for(int i =0; i < iarr1.length; i++) {
			
			
			for (int j = 0; j < iarr1[i].length; j++) {
				
				System.out.print(iarr1[i][j] + " ");
			}
			System.out.println();
			
		}
		// 콘솔창 출력
		//		0 0 0 0 0 
		//		0 0 0 0 0 
		//		0 0 0 0 0 
		//		0 0 0 0 0 
		//		0 0 0 0 0 
		//		0 0 0 0 0 
		
		
		
}

}

 

 

 

 

 

 

public class Application2 {

	public static void main(String[] args) {


		/* 2차원 정변 배열을 선언 및 할당하고 차례로 값을 대입해서 출력해보자 */
		
		/* 1. 배열의 선언 및 할당
		 * 정변 배열의 경우 각 인덱스별 배열을 따로 할당할 수도 있지만
		 * 선언과 동시에 모든 배열을 할당할 수 있다.
		 * 자료형[][] 변수명 = new 자료형[할당할 배열의 갯수][할당할 배열의 길이] 
		 * */

		int[][] iarr = new int[3][5]; 	
		// 길이 5의 배열을 3개 할당하고 그 주소를 묶어 관리하는 배열의 주소를 stack의 iarr에 저장한다.
		
		/* 2. 각 배열의 인덱스에 접근해서 값 대입 후 출력 */
		// 1 2 3 4 5
		// 6 7 8 9 10
		// 11 12 13 14 15 
		
		
		/* 배경에 저장하기 위한 하나씩 증가하는 값을 저장할 변수 */
		int value = 1;	
		// 1을 대입한 이후는 가장 처음인 [0][0]의 시작이 1이기 때문이다. 
		// 그래야 순차적으로 2,3,4,5가 나오기 때문
		
		/* 배열의 갯수만큼 반복적으로 접근하기 위한 용도의 반복문 */
		for(int i = 0; i < iarr.length; i++) {
			/* 하나의 배열의 0번부터 마지막 인덱스까지 차례로 접근해서 값을 대입하는 용도의 반복문 */
			for(int j = 0; j < iarr[i].length; j++) {
				iarr[i][j] = value++;
				// 후위연산자 덕분에 대입을 먼저한 후 증가를 시킨 2값을 위로 돌려줄 수 있다.
				
				// iarr을 통해서 행의 상태를 알 수 있고 
				// iarr[i]을 통해서 0번행을 기준으로 열의 상태를 알수있다. 
				
			}
		}
		
		/* 값 출력 */
		for ( int i = 0; i < iarr.length; i++ ) {
			
			for ( int j = 0; j < iarr[i].length; j++ ) {
				System.out.print(iarr[i][j] + " ");		//하나의 행은 같은 열에 출력
			}
			System.out.println();						//한 행이 끝나면 다음줄로 바뀜
		}
		
//		1 2 3 4 5 
//		6 7 8 9 10 
//		11 12 13 14 15 
		
		
	}

}

 

 

 

public class Application3 {

	public static void main(String[] args) {


		/* 2차원 가변 배열을 선언 및 할당하고 차례로 값을 대입해서 출력해보자. */
		

		/* 1. 배열의 선언 및 할당
		 * 가변 배열의 경우 각 인덱스별 배열을 따로 할당 해야 한다.
		 * 선언과 동시에 모든 배열을 할당할 수 없으며, 할당할 배열의 갯수만 지정하고 각 인덱스에 서로다른
		 * 길이의 배열을 따로 할당해야 한다.
		 * 자료형[][] 변수명 = new 자료형 [할당할 배열의 갯수][];
		 * 변수명[배열 인덱스] = new 자료형[배열의 길이] 
		 *  */
		
		/* 1-1. 주소를 관리하는 배열의 주소를 보관하기 위한 변수 선언 */
		int[][] iarr = new int[3][];
		
		/* 1-2. 주소를 관리하는 배열의 각 인덱스마다 배열을 할당하여 주소값 대입 */
		iarr[0] = new int[3];
		// iarr[1] = new char[2]; //자료형이 다른 배열은 하나로 묶어서 관리할 수 없다.
		iarr[1] = new int[2];
		
		int[] arr = new int[5];
		iarr[2] = arr;			  // 미리 할당해둔 배열을 이용해서도 활용할 수 있다. 
		// 레퍼런스변수는 주소값을 받는 변수이므로 주소값을 대입할시 똑같은 주소를 참조하는 셈이 된다. 
		
		
		
		
		/* 2. 각 배열의 인덱스마다 접근하여 값 대입 후 출력 */
		/* 값대입 */
		iarr[0][0] = 1;
		iarr[0][1] = 2;
		iarr[0][2] = 3;
		// iarr[0][3] = 4;
		// java.lang.ArrayIndexOutOfBoundsException 발생
		// 존재하지 않는 인덱스에 접근하는 경우 발생하는 에러
		
		iarr[1][0] = 4;
		iarr[1][1] = 5;
		
		
		iarr[2][0] = 6;
		// iarr[2] = arr; 을 주석 처리후 이것을 작동하면 아래와같은 에러가 발생한다.
		// java.lang.NullPointerException
		iarr[2][0] = 6;
		iarr[2][1] = 7;
		iarr[2][2] = 8;
		iarr[2][3] = 9;
		iarr[2][4] = 10;
		
		// iarr[3][0] = 11;	
		// 존재하지 않는 배열에 접근하는 경우게도 ArrayIndexOutOfBoundsException 발생
		
		
		/* 가변 배열 역시 반복문을 이용해서 값을 대입하고 출력할 수 있다. */
		
		/* 반복문을 이용한 값 대입 */
		
		/* 배열 인덱스마다 저장할 값이 보관될 변수 선언 */
		int value = 0;
		/* 모든 배열에 순차적으로 접근하는 반복문 */

		for( int i = 0; i < iarr.length; i++ ) {	//행이몇개있냐에 따라 반복
			/* 배열마다 인덱스에 차례로 접근하는 반복문 */
			for (int j = 0; j < iarr[i].length; j++) {
				iarr[i][j] = ++value;

			}
		}
		
		
		/* 반복문을 이용한 값 출력 */
		for ( int i = 0; i < iarr.length; i++ ) {
			for (int j = 0; j < iarr[i].length; j++ ) {
				System.out.print(iarr[i][j] + " ");
			}
			System.out.println();
		}
	}
}




/*
1 2 3 
4 5 
6 7 8 9 10 */

 

 

 

public class Application4 {

	public static void main(String[] args) {

		/* 2차원 배열도 할당과 동시에 기본값 외의 값으로 초기화 하고 싶은 경우 리터럴을 이용할 수 있다. */
		
		/* 선언과 할당을 하며 초기화 */
		/* 정변배열 */

		int[][] iarr = { {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15} };
		
		/* 반복문을 이용한 값 출력 */
		
		
		for (int i = 0; i < iarr.length; i++) {
			
			for (int j = 0; j < iarr[i].length; j++) {
				System.out.print(iarr[i][j] + " ");
			}
			System.out.println();
		}
	/*	
		1 2 3 4 5 
		6 7 8 9 10 
		11 12 13 14 15 */
		
		System.out.println();
		
		
		/* 가변 배열 */
		int[][] iarr2 = { {1,2,3}, {4,5,6,7}, {8,9,10,11,12} };
		
		
		/* 반복문을 이용한 값 출력 */
		for (int i = 0; i < iarr2.length; i++) {
			
			for (int j = 0; j < iarr2[i].length; j++) {
				System.out.print(iarr2[i][j] + " ");
			}
			System.out.println();
		}

		
		System.out.println();
		
		
		/* 미리 할당한 배열을 이용한 방식 */
		int[] arr1 = {1,2,3,4,5};
		int[] arr2 = {6,7,8,9,10};
		
		int [][] iarr3 = {arr1, arr2};	// 변수를 대입함으로서 값도 대입
		
		/* 반복문을 이용한 값 출력 */
		for ( int i = 0; i < iarr3.length; i++ ) {
			
			for ( int j = 0; j < iarr3[i].length; j++ ) {
				System.out.print(iarr3[i][j] + " ");
			}
			System.out.println();
			
		}
		/*
		1 2 3 4 5 
		6 7 8 9 10 
		*/
		
	}

}

 

 

 

 

 

'Programming > JAVA' 카테고리의 다른 글

클래스와 객체(2)  (0) 2021.12.29
배열, 클래스와 객체  (0) 2021.12.28
반복문  (0) 2021.12.24
스캐너와 조건문  (0) 2021.12.23
메소드  (0) 2021.12.22

+ Recent posts