본문 바로가기
프로그래밍언어/Java

05-2. 배열

by 스꼬맹이브로 2021. 1. 19.
728x90
반응형
SMALL

<배열이란?>

같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스(index)를 부여해놓은 자료구조

배열의 각 인덱스는 각 항목의 데이터를 읽거나 저장하는 데 사용되며 배열 이름 옆에 대괄호[ ]에 기입(0부터 시작)

 

배열의 특징

  1. 배열은 같은 타입의 데이터만 저장 가능
    → int배열은 int값만 저장 가능하고, String 배열은 문자열만 저장
    → 또한  선언과 동시에 저장할 수 있는 타입이 결정됨
    → 만약 다른 타입의 값을 저장하려고 하면 타입 불일치(Type mismatch) 컴파일 에러 발생
  2. 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없음

<배열 선언>

배열을 사용하려면 선언 먼저!

대괄호 [ ]는 배열 변수를 선언하는 기호로 사용된다.

배열 변수는 참조 변수에 속하기 때문에 객체로 취급하므로 힙 영역에 생성되며 배열 변수는 힙 영역의 배열 객체를 참조한다.

만약 참조할 배열 객체가 없다면 배열 변수는 null값으로 초기화할 수 있다.

그러나 null값일 때에 값을 읽거나 저장하게 되면 NullPointerException이 발생한다.

<배열 생성>

배열 객체 생성 방법

  1. 값 목록 이용
  2. new 연산자 사용

먼저 1번부터 살펴 보자.

중괄호 { }는 주어진 값들을 항목으로 가지는 배열 객체를 힙에 생성하고, 배열 객체의 번지를 리턴

주의할 점은 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성을 허용하지 않음

public class ArrayCreateByValueListExample1 {
	public static void main(String[] args) {
		int[] scores = { 83, 90, 87 };
		
		System.out.println("scores[0] : " + scores[0]);
		System.out.println("scores[1] : " + scores[1]);
		System.out.println("scores[2] : " + scores[2]);
		
		int sum = 0;
		for(int i=0; i<3; i++) {
			sum += scores[i];
		}
		System.out.println("총합 : " + sum);		
		double avg = (double) sum / 3;
		System.out.println("평균 : " + avg);
	}
}

결과 :

배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면 new 연산자 사용

public class ArrayCreateByValueListExample2 {
	public static void main(String[] args) {
		int[] scores;
		scores = new int[] { 83, 90, 87 };
		int sum1 = 0;
		for(int i=0; i<3; i++) {
			sum1 += scores[i];
		}
		System.out.println("총합 : " + sum1);	
		
		int sum2 = add( new int[] { 83, 90, 87 } );
		System.out.println("총합 : " + sum2);	
		System.out.println();
	}
	
	public static int add(int[] scores) {
		int sum = 0;
		for(int i=0; i<3; i++) {
			sum += scores[i];
		}
		return sum;
	}
}

결과 :

 

2번 new연산자로 배열 생성하는 법을 보자.

new연산자로 배열을 처음 생성할 경우 배열은 자동적으로 기본값으로 초기화된다. 

 

*참고 : 타입별 배열의 초기값

배열 생성 후 특정 인덱스 위치에 새로운 값을 저장하려면 대입 연산자를 사용

public class ArrayCreateByNewExample {
	public static void main(String[] args) {
		int[] arr1 = new int[3];
		for(int i=0; i<3; i++) {
			System.out.println("arr1[" + i + "] : " + arr1[i]);
		}
		arr1[0] = 10;
		arr1[1] = 20;
		arr1[2] = 30;
		for(int i=0; i<3; i++) {
			System.out.println("arr1[" + i + "] : " + arr1[i]);
		}
		
		double[] arr2 = new double[3];
		for(int i=0; i<3; i++) {
			System.out.println("arr2[" + i + "] : " + arr2[i]);
		}
		arr2[0] = 0.1;
		arr2[1] = 0.2;
		arr2[2] = 0.3;
		for(int i=0; i<3; i++) {
			System.out.println("arr2[" + i + "] : " + arr2[i]);
		}
		
		String[] arr3 = new String[3];
		for(int i=0; i<3; i++) {
			System.out.println("arr3[" + i + "] : " + arr3[i]);
		}
		arr3[0] = "1월";
		arr3[1] = "2월";
		arr3[2] = "3월";
		for(int i=0; i<3; i++) {
			System.out.println("arr3[" + i + "] : " + arr3[i]);
		}
	}
}

결과 :

<배열 길이>

배열의 길이란 배열에 저장할 수 있는 전체 항목의 개수를 뜻함.

배열의 길이를 알기 위해서는 배열 변수에 도트(.) 연산자를 붙이고 length를 적어주면 됨.

public class ArrayLengthExample {
	public static void main(String[] args) {
		int[] scores = { 83, 90, 87 };
		
		int sum = 0;
		for(int i=0; i<scores.length; i++) {
			sum += scores[i];
		}
		System.out.println("총합 : " + sum);
		
		double avg = (double) sum / scores.length;
		System.out.println("평균 : " + avg);
	}
}

결과 :

여기서 배열의 인덱스를 초과하면 ArrayIndexOutOfBoundsException 발생

<다차원 배열>

값들이 행과 열로 구성된 배열을 2차원이라고 한다.(수학의 행렬 개념과 같음)

코드 :  타입 [ ][ ] 변수 = new 타입[2][3];

배열의 생성 원리는 수학 행렬과 근본적으로 다르지만 사용 방식은 행렬과 동일

package chap05;

public class ArrayInArrayExample {
	public static void main(String[] args) {	
		
		int[][] mathScores = new int[2][3];
		for(int i=0; i<mathScores.length; i++) {
			for(int k=0; k<mathScores[i].length; k++) {
				System.out.println("mathScores["+i+"]["+k+"]="+mathScores[i][k]);
			}
		}
		System.out.println();
		
		int[][] englishScores = new int[2][];
		englishScores[0] = new int[2];
		englishScores[1] = new int[3];
		for(int i=0; i<englishScores.length; i++) {
			for(int k=0; k<englishScores[i].length; k++) {
				System.out.println("englishScores["+i+"]["+k+"]=" + englishScores[i][k]);
			}
		}
		System.out.println();		
		
		int[][] javaScores = { {95, 80}, {92, 96, 80} };
		for(int i=0; i<javaScores.length; i++) {
			for(int k=0; k<javaScores[i].length; k++) {
				System.out.println("javaScores["+i+"]["+k+"]="
						+javaScores[i][k]);
			}
		}
	} 
}

결과 :

<배열 복사>

배열은 한 번 생성하면 크기를 변경할 수 없기 때문에 더 많은 저장 공간이 필요하다면 더 큰 배열을 새로 만든 후 이전 배열로부터 항목 값을 복사해야 함.

배열 간 항목 값 복사 방법

  1. for문 사용
  2. System.arraycopy() 메소드 사용

for문 예제

public class ArrayReferenceObjectExample {
	public static void main(String[] args) {		
		String[] strArray = new String[3];
		strArray[0] = "Java";
		strArray[1] = "Java";
		strArray[2] = new String("Java");

		System.out.println( strArray[0] == strArray[1]);
		System.out.println( strArray[0] == strArray[2] );    
		System.out.println( strArray[0].equals(strArray[2]) );
	} 
}

 

결과 :

복사되지 않은 항목은 각 타입별 초기값이 유지된다.

 

다음으로 System.arraycopy()호출 방법은 다음과 같다.

src : 원본 배열

srcPos : 원본 배열에서 복사할 항목의 시작 인덱스

dest : 새 배열

destPos : 새 배열에서 붙여넣을 시작 인덱스

length : 복사할 개수

 

System.arraycopy()메소드 사용 예제

public class ArrayCopyByForExample {
	public static void main(String[] args) {
		int[] oldIntArray = { 1, 2, 3 };
		int[] newIntArray = new int[5];
		
		for(int i=0; i<oldIntArray.length; i++) {
			newIntArray[i] = oldIntArray[i];
		}
		
		for(int i=0; i<newIntArray.length; i++) {
			System.out.print(newIntArray[i] + ", ");
		}
	}
}

결과 :

복사되지 않은 항목은 각 타입별 초기값이 유지된다.

 

참조 타입 배열이 복사되면 복사되는 값이 객체의 번지이므로 새 배열의 항목은 이전 배열의 항목이 참조하는 객체와 동일하다.

 

<향상된 for문>

자바는 배열이나 컬렉션을 좀 더 쉽게 처리하기 위해 향상된 for문을 제공함.

향상된 for문은 반복 실행을 하기 위해 카운터 변수와 증감식을 사용하지 않으며 배열에서 꺼낸 항목을 저장할 변수 선언과 콜론(:), 배열을 나란히 작성

배열 및 컬렉션 항목의 개수만큼 반복한 후 자동으로 for문을 빠져나감.

  1. for문이 처음 실행될 때 배열(①)에서 가져올 철 번째 값이 존재하는지 평가
  2. 가져올 값이 존재하면 해당 값을 변수(②)에 저장
  3. 실행문(③) 실행
  4. 블록 내부의 실행문(③)이 모두 실행되면 다시 루프를 돌아 배열(①)에서 가져올 다음 값이 존재하는지 평가
  5. 만약 다음 항목이 존재하면 ① 순서로 루프를 다시 진행하고, 가져올 다음 항목이 없으면 for문 종료

즉, for문의 반복 횟수는 배열의 항목 수가 된다.

public class AdvancedForExample {
	public static void main(String[] args) {
		int[] scores = { 95, 71, 84, 93, 87 };
		
		int sum = 0;
		for (int score : scores) {
			sum = sum + score;
		}
		System.out.println("점수 총합 = " + sum);
		
		double avg = (double) sum / scores.length;
		System.out.println("점수 평균 = " + avg);

	} 
}

결과 :

 

728x90
반응형
LIST

'프로그래밍언어 > Java' 카테고리의 다른 글

06-1. 객체 지향 프로그래밍  (1) 2021.01.25
05-3. 열거 타입  (0) 2021.01.24
05-1. 참조 타입과 참조 변수  (0) 2021.01.18
04-2. for문, while문, do-while문  (0) 2021.01.12
04-1. if문, switch문  (0) 2021.01.11