JAVA_배열 (Array)

JW__1.7·2022년 7월 26일
0

JAVA 공부일지

목록 보기
12/30

배열 (Array)

  • 한 번에 많은 메모리 공간을 할당해서 여러 개의 값을 저장하는 자료 구조 (Data Structure)
  • 여러 개의 변수를 하나의 이름으로 관리하는 자료 구조
  • 같은 데이터 타입의 자료들을 순차적으로 저장
  • 구성 요소
    • 인덱스(Index) : 각 변수의 위치 정보. 0부터 시작
    • 배열명 : 모든 변수를 관리하는 하나의 이름
  • 각 변수는 배열명에 대괄호 [ ]와 인덱스를 붙여서 구분

배열의 필요성

메모리에 순차적으로 저장되지 않아 모든 변수에 개별 접근해야 한다.

	int a, b, c, d, e;					 |-------|
    total += a;						  d  |   8   |
	total += b;						     |-------|		
	total += c;						     |-------|		
	total += d;						  b  |   6   |
    total += e;						     |-------|	
										 |-------|		
  	  							   	  e  |   9   |		
  	  									 |-------|		
  	 								  a  |   5   |		
  	  									 |-------|
	  									 |       |
  	   									 |-------|
  	  								  c  |   7   |
  	  									 |-------|		

메모리에 순차적으로 저장되어 인덱스를 이용한 순차접근이 가능하다

int[] arr = new int[5];								   |-------|
    for(int i = 0; i < arr.length; i++) { 		arr[0] |   5   |
    	total += arr[i];						       |-------|
    }											arr[1] |   6   |
	     											   |-------|
 												arr[2] |   7   |		 
  	  												   |-------|			
											    arr[3] |   8   |		
  													   |-------|
 												arr[4] |   9   |
  	  	 											   |-------|	

1차원 배열

1차원 배열 선언 / 생성 / 초기화

  • 배열 선언

    • 배열의 데이터타입을 선언하는 것이다.
    • 배열은 참조 타입(Reference Type)으로 관리된다.
      int[] arr; → 이 방식을 사용하는게 좋다.
      int arr[]; → c언어 호환때문에 이것도 지원
  • 배열 생성

    • 배열의 길이를 지정해서 실제 배열을 생성하는 것이다.
    • 배열의 길이를 변수로 처리할 수 있다.
      arr = new int[3];
      int size = 5; arr = new int[size]
  • 배열 선언 및 생성
    int[] arr = new int[3];

  • 배열의 초기화

    • 배열의 선언과 함께 값을 초기화 할 수 있다.
    • 중괄호 { }를 이용해 값을 작성한다.
      int[] arr = new int[] {10, 20, 30, 40, 50};
      int[] arr = {10, 20, 30, 40, 50};

배열의 길이

  • 배열의 길이는 배열이름.length 필드값으로 확인할 수 있다.
  • 한 번 생성된 배열의 길이는 수정 할 수 없다.

배열 요소 (Element)

  • 배열이 관리하는 각각의 변수를 의미한다.
  • 배열이름[인덱스] 형식으로 호출해서 사용한다.
    arr[0]
    arr[1]
    arr[2]
  • 일반 변수와 달리 자동 초기화 진행한다.
    0, 0.0, false, null 등
  • 배열의 참조 타입 (Reference Type)
    int[] arr = {1, 2, 3};

배열의 장점

  • 변수 3개가 있는 상황
    배열로 작성할 경우 코드가 간단해진다.

일반 변수

	int a, b, c;
	System.out.println(a);
	System.out.println(b);
	System.out.println(c);

배열

	int[] arr = new int[3];
	for(int i = 0; i <3; i++) {
		System.out.println(arr[i]);
	}

값을 초기화하지 않았는데 오류가 뜨지 않았다.
WHY? 이미 0으로 값을 가지고 있기 때문이다.

	int[] arr = new int[3];
		
	for(int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);	/* 0
	}   							   0   
                                       0 */

배열의 길이(length)가 3이다.
코드 작성할 때 숫자 그대로 3으로 작성하면, 배열의 길이가 변경될 때마다 수작업으로 변경해줘야 하기 때문에 arr.length으로 작성해주면 좋다.

	int[] arr = new int[3];
	arr[0] = 100;
	arr[1] = 50;
	arr[2] = 80;
		
	for(int i = 0; i < arr.length; i++) {
		System.out.println(arr[i]);	/* 100
	}    							   50
   	                                   80 */

	int total = 0;
	for (int i = 0; i < arr.length; i++) {
		total += arr[i];
	}										
	double average = (double)total / arr.length;	
	// total이 int이기 때문에 double로 캐스팅함

	System.out.println("평균 : " + average + "점"); //평균 : 76.66666666666667점

최대 / 최소 구하기

	int[] arr = {10, 20, 30, 40, 50};
	int max = arr[0];
	int min = arr[0];
		
	for(int i = 1; i < arr.length; i++) {
		if(max < arr[i]) {
			max = arr[i];
		}
		if(min > arr[i]) {
			min = arr[i];
		}
	}		
	System.out.println("최대 : " + max);	  // 최대 : 50
	System.out.println("최소 : " + min);	  // 최소 : 10

배열의 데이터타입

  • int[] : 참조 타입 (Reference Type)
		/*
		
	int[] arr = { 10000, 20000, 30000 };
			
	     |-------|
	 arr | 0x123 |
	     |-------|
	     |  ...  |
	     |-------|
  arr[0] | 10000 | 0x123		// 메모리를 연속된 공간을 사용한다.
	     |-------|				// 인덱스는 상대적으로 떨어진 위치를 말한다.
  arr[1] | 20000 | 
	     |-------|
  arr[2] | 30000 | 
	     |-------|
	*/

배열의 길이 늘리기

  • 배열의 길이는 변경할 수 없다.
  • 늘어난 길이의 새로운 배열을 만들고, 기존 배열의 값을 모두 새로운 배열로 옮기고,
    기존 배열의 참조값을 새로운 배열의 참조값으로 수정한다.
	/*			
	     |-------|		arr = arr2		     |-------|
	 arr | 0x123 |						arr2 | 0x456 |
	     |-------|							 |-------|
	     |  ...  |						     |  ...  |
	     |-------|						     |-------|
  arr[0] | 10000 | 0x123			  		 |       | 0x456
	     |-------|					 		 |       |		
  arr[1] | 20000 | 				   	  		 |       |
	     |-------|						     |       |
  arr[2] | 30000 | 					  		 |       |	 
	     |-------|						     |-------|
	*/

배열 arr의 값을 모두 0x456으로 옮겨주고, arr의 참조값을 0x456으로 수정한다.
그러면 0x123은 메모리 누수가 발생하지만, JAVA는 스스로 해결한다.

길이가 5인 배열을 사용하다가, 길이가 1000인 배열로 바꾸기

import java.util.Arrays;

public class Ex_array {
	public static void main(String[] args) {
    
	int[] arr = {1, 2, 3, 4, 5};
		
	// 늘어난 길이의 새로운 배열을 만들고,
	int[] temp = new int[1000];
		
	// 기존 배열의 값을 모두 새로운 배열로 옮기고,
	System.arraycopy(arr, 0, temp, 0, arr.length);
		
	// 기존 배열의 참조값을 새로운 배열의 참조값으로 수정한다.
	arr = temp;
    
    // 이제 arr 배열의 길이는 1000이다.
	System.out.println(arr.length);		// 1000
    System.out.println(Arrays.toString(arr));	// [1, 2, 3, 4, 5, 0, 0, ... 0, 0]
    }
}    

1번째 친구 - 라이언
2번째 친구 - 프로도
3번째 친구 - 어피치

  • 일반 for문
	String[] friends = {"라이언", "프로도", "어피치"};
		
	for(int i = 0; i < friends.length; i++) {
		System.out.println((i+1) + "번째 친구 - " + friends[i]);
	}
  • 향상 for문 (인덱스 사용X)
	for(String friend : friends) {	
    // friends 배열의 모든 요소를 하나씩 String friend로 옮긴다.
		System.out.println(friend);		/* 라이언
    }    								   프로도
                                           어피치 */

2차원 배열(Array)

  • 행과 열로 구성된 테이블(표) 구조를 가지는 자료 구조
  • 실제로는 2개 이상의 1차원 배열을 동일한 이름으로 관리하는 자료 구조
  • 모든 행의 열 개수가 동일한 정방형 배열과 행마다 열 개수가 다른 비정방형 배열로 구분

2차원 배열의 선언 / 생성 / 초기화

  • 정방형 배열 선언
    int[][] arr; , int arr[][];

  • 정방형 배열 생성

    • 모든 행의 열의 개수가 동일하기 때문에 최초 한 번만 열의 개수를 정한다.
      arr = new int[3][5];
  • 정방형 배열의 초기화

int[][] arr = {
	{1, 2, 3, 4, 5}, 
	{6, 7, 8, 9, 10}, 
    {11, 12, 13, 14, 15}
};
  • 비정방형 배열의 선언
    int[][] arr; , int arr[][];

  • 비정방형 배열의 생성

    • 각 행마다 열의 개수를 각각 지정한다.
	arr = new int[3][];   // 최초 열 개수의 지정이 없음
	arr[0] = new int[5];  // 1행은 5열
	arr[1] = new int[3];  // 2행은 3열
	arr[2] = new int[4];  // 3행은 4열
  • 비정방형 배열의 초기화
int[][] arr = {
	{1, 2, 3, 4, 5}, 
    {6, 7, 8},
	{9, 10, 11, 12} };

2차원 배열의 메모리 구조
int[][] arr = { {1, 2, 3}, {4, 5}}

2차원 배열 요소

  • 인덱스를 2개를 사용
    몇 번째 1차원 배열인가? 해당 배열의 몇 번째 요소인가?
  • 2차원 배열이 관리하는 1차원 배열
    arr[0]
    arr[1]
    arr[2]
  • 각각의 1차원 배열이 관리하는 배열 요소
    arr[0][0] , arr[0][1]
    arr[1][0] , arr[1][1]
    arr[2][0] , arr[2][1]

3행 2열 2차원 배열

	int[][] arr1 = new int[3][2];
		
	for(int i = 0; i < arr1.length; i++) {			// i : 몇 번째 1차원 배열인가?
		for(int j = 0; j < arr1[i].length; j++) {	// j : 1차원 배열의 몇 번째 요소인가?
			System.out.print(arr1[i][j] + " ");
		}
		System.out.println();	/* 0 0
	}							   0 0
								   0 0 */

3행 n열 2차원 배열

	int[][] arr2 = new int[3][];
	arr2[0] = new int[5];	// 1번째 1차원 배열의 길이는 5
	arr2[1] = new int[4];	// 2번째 1차원 배열의 길이는 4
	arr2[2] = new int[8];	// 3번째 1차원 배열의 길이는 8
		
	for(int i = 0; i < arr2.length; i++) {
		for(int j =0; j < arr2[i].length; j++) {
			System.out.print(arr2[i][j] + " ");
		}
		System.out.println();	/* 0 0 0 0 0 
	}							   0 0 0 0 
								   0 0 0 0 0 0 0 0 */

국어 윤리 수학 영어
미술 수학 과학
체육 사회 수학 영어
국어 한자 문학 수학 영어
음악 국어 수학 영어

  • 일반 for문
	for(int i = 0; i < timeTable.length; i++) {
		for(int j = 0; j < timeTable[i].length; j++) {
			System.out.print(timeTable[i][j] + " ");
		}
		System.out.println();
	}
  • 향상 for문
	for(String[] weekName : timeTable) {
		for(String course : weekName) {
			System.out.print(course + " ");
		}
		System.out.println();
	}

0개의 댓글