0627 java array

onnbi·2022년 7월 26일
0

java-tutorial

목록 보기
4/13
post-thumbnail

array

동일한 자료형을 가지는 변수들의 집합

  • 인덱스는 0부터 시작한다
  • 배열은 항상 참조형이다
  • 반복문을 사용할 수 있다

배열의 선언

자료형 [] 변수명;
자료형 [] 변수명 = new 자료형[];

int [] arr = new int[4];
//정수 4개를 저장할 수 있는 배열

배열의 초기화

배열을 선언 후 할당하게 되면 각 자료형의 기본값이 들어간다

  • 숫자형 = 0
  • boolean = false
  • char = ' '

null

참조형에서 주소는 스텍에 있고
데이터는 주소가 가리키는 곳 heap에 저장되어 있다
이 때 주소값이 비어 있으면 null 값이 들어 있다

배열의 인덱스로 직접 초기화

int[] arr1 = new int[5];
	for (int i=0; i<arr1.length; i++) {
		System.out.println(arr1[i]);
	} // int의 기본값 0, 0, 0, 0, 0 출력
	arr1[0] = 1;
	arr1[1] = 2;
	arr1[2] = 3;
	arr1[3] = 4;
	arr1[4] = 5;
	for (int i=0; i<arr1.length; i++) {
		System.out.println(arr1[i]);
	} //1, 2, 3, 4, 5 출력

선언과 동시에 초기화

int[] arr = {1, 2, 3, 4, 5};

new int[4] 배열이 만들어진다
arr[5]를 출력하게 되면 runtime error 발생

배열의 오름차순

lotto 프로그램 ( 중복 제거 / com 값과 user 값 대조 )

public void practice( ) {
	Scanner sc = new Scanner(System.in);
	int[] user = new int[6];
	Random r = new Random();
	
	for(int i=0; i<user.length; i++) {
		System.out.print((i+1)+"번째 숫자를 입력해 주세요 : ");
		user[i] = sc.nextInt();
		if(user[i]>45 || user[i]<1) {
			System.out.println("1~45 사이 값으로 입력하세요.");
			i--;
			continue;
		}
		// 중복을 제거
		// 0번, 1번, 2번, 3번, 4번, 5번
		for(int j=0; j<i; j++) {
			if(user[i] == user[i-1]) {
				System.out.println("이미 입력한 값입니다.");
				i--;
				continue;
			}
		}			
	}
		
	// 오름차순정렬
	for(int i=0; i<user.length-1; i++) {
		for(int j=0; j<user.length-1-i; j++) {
			if(user[j]>user[j+1]) {
				int tmp = user[j];
				user[j] = user[j+1];
				user[j+1] = tmp;
		}
	}

배열의 복사

배열은 참조형
안에 값이 어떻든, 변수가 다르면 주소가 다르다
주소가 다르기 때문에 다른 배열

얕은 복사

public void test1() {
		int[] arr1 = {1, 2, 3, 4, 5};
		System.out.println(arr1[2]); // 3
		System.out.println(arr1[3]); // 4
		// 얕은 복사 (주소 값 복사)
		int[] arr2 = arr1;
		System.out.println(arr2[4]); // 5
		// 같은 주소를 공유한다는 것은 같은 배열
		arr1[4] = 100;
		System.out.println(arr1[4]); // 100
		System.out.println(arr2[4]); // 100
		arr2[0] = 10;
		System.out.println(arr1[0]); // 10
		System.out.println(arr2[0]); // 10
}

깊은복사

  1. 배열 생성 후 제어문을 통한 직접 복사
  2. 배열 생성 후 System.arraycopy( )를 통한 복사
  3. clone( );

1. for문을 이용한 직접 복사

		int[] arr1 = {1, 2, 3, 4, 5, 6};
			// 1-1) 원본배열과 동일한 길이의 배열 생성
		int[] arr2 = new int[arr1.length];
			// 1-2) for문을 통한 데이터 복사
		for(int i=0; i<arr1.length; i++) {
			arr2[i] = arr1[i];
		}
		arr1[2] = 100;
		arr2[3] = 200;
		
		for(int i=0; i<arr1.length; i++) {
			System.out.print(arr1[i]+" ");
		}
			System.out.println();
			// 1 2 100 4 5 6 
		for(int i=0; i<arr2.length; i++) {
			System.out.print(arr2[i]+" ");
		}
			System.out.println();
			// 1 2 3 200 5 6 

2. system.arraycopy

배열의 일부 데이터만 복사 가능

		// 1) 원본 배열과 길이가 같은 배열 선언
		int[] arr3 = new int[arr1.length];
		// 2) System.arraycopy(괄호 안에 5개의 값을 설정)
		// (원본배열,
		//	원본배열에서 복사 시작할 위치,
		//	데이터가 복사될 배열,
		//	데이터가 복사될 배열 중 데이터가 들어갈 위치,
		//	복사할 길이)
		System.arraycopy(arr1, 2, arr3, 1, 2);
		// "arr1의 2번 인덱스부터 arr3의 1번 인덱스 위치에 2개 복사한다."
		
		for(int i=0; i<arr3.length; i++) {
			System.out.print(arr3[i]+" ");
		}
			System.out.println();
			// 0 100 4 0 0 0 
				
		int[] arr4 = new int[arr2.length];
		System.arraycopy(arr2, 2, arr4, 2, 4);
		
		for(int i=0; i<arr4.length; i++) {
			System.out.print(arr4[i]+" ");
		}
			System.out.println();
			// 0 0 3 200 5 6

3. clone( )

		int[] arr5 = arr1.clone();		

2차원 배열

배열의 배열
배열로 배열을 관리하는 구조이다

int[][] arr = new int[2][3];

[0][0] [0][1] [0][2]
[1][0] [1][1] [1][2]

2차원 배열의 초기화

  1. 직접 초기화
int k = 1;
// 후위연산 = 인접연산(대입) 하고 자기 자신을 올린다.
arr[0][0] = k++;
arr[0][1] = k++;
arr[0][2] = k++;
arr[1][0] = k++;
arr[1][1] = k++;
arr[1][2] = k++;
  1. 배열을 이용한 초기화
int[][] arr1 = {{1, 2, 3}, {4, 5, 6}};
  1. for문을 이용한 초기화
	int[][] arr2 = new int[2][3];
	int num = 1;
	for(int i=0; i<arr2.length; i++) { 	// 행의 길이
		for(int j=0; j<arr2[i].length; j++) { // 열의 길이
			arr[i][j] = num++;
		}
	}

2차원 배열 활용

/*
	[0][0] [0][1] [0][2] [0][3] [0][4]
	[1][0] [1][1] [1][2] [1][3] [1][4]
	[2][0] [2][1] [2][2] [2][3] [2][4] 
	[3[0]  [3][1] [3][2] [3][3] [3][4]
	[4][0] [4][1] [4][2] [4][3] [4][4]
*/

public void practice1() {
	int[][] arr = new int[5][5];
	int num = 1;
  // 이중포문 활용
	for (int i=0; i<arr.length; i++) {
		for(int j=0; j<arr[i].length; j++) {
			arr[i][j] = (j*5)+num;
		} num++;
	}
  // 출력
	for(int i=0; i<arr.length; i++) {
		for(int j=0; j<arr[i].length; j++) {
			System.out.print(arr[i][j]+" ");
		} System.out.println();
	}
}
profile
aelatte coding journal

0개의 댓글