[Java] Ch05_1. 배열(Array)

토끼는 개발개발·2022년 1월 10일
0

Java

목록 보기
12/29
post-thumbnail

📌 Chapter05. 배열


✏️ 1. 배열(array)


1.1 배열(array)이란?

"배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것"

int score1, score2, score3, score4, score5; // 학생 5명의 점수를 저장하기 위한 변수 선언
int [] score = new int[5] // 5개의 int 값을 저장할 수 있는 배열을 생성한다.


1.2 배열의 선언과 생성


▶ 배열의 선언

1. 타입[] 변수이름;

int[] score;
String[] name;

2. 타입 변수이름[];

int score[];
String name[];

▶ 배열의 생성

타입[] 변수이름;    // 배열을 선언(배열을 다루기 위한 참조변수 score선언)
변수이름 = new 타입[길이];    // 배열을 생성(실제 저장공간을 생성)

int[] score = new int[5]; // 선언과 생성을 동시에

1. int[] score;

int형 배열 참조변수 score를 선언한다. 데이터를 저장할 수 있는 공간은 아직 마련되지 않았다.

score
  □


2. score = new int[5];

연산자 'new'에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다.

score      score[0]     score[1]      score[2]     score[3]     score[4]
  □            □            □            □            □            □


그리고 각 배열 요소는 자동적으로int의 기본값인 0으로 초기화 된다.

score      score[0]     score[1]      score[2]     score[3]     score[4]
  □            □            □            □            □            □
                 0              0             0             0              0


끝으로 대입 연산자 '='에 의해 배열의 주소가 int형 배열 참조변수 score에 저장된다.



1.3 배열의 길이와 인덱스

"인덱스(index)의 범위는 0부터 '배열길이-1'까지"

int[] score = new int[5]; // 길이가 5인 int배열.
// 인덱스는 0부터 4까지 score[0], score[1], score[2], score[3], score[4]

✨ 예제 1

public class ArrayEx1 {

	public static void main(String[] args) {
		int[] score = new int[5];
		int k = 1;
		
		score[0] = 50;
		score[1] = 60;
		score[k+1] = 70; // score[2] = 70
		score[3] = 80;
		score[4] = 90;
		
		for (int i=0; i<5; i++) {
			
			System.out.println(score[i]);
		}

	}

}

▶ 배열의 길이

  • 배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수다.
  • 배열의 길이는 양의 정수이어야 하며 0도 생성이 가능하다.

▶ 배열이름.length

  • 자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.
    아래의 코드에서 배열 arr의 길이가 5이므로 arr.length 값 역시 5가 된다.
int[] arr = new int[5]; // 길이가 5인 int 배열
int tmp = arr.length; // arr.length값은 5이고, tmp에 5가 저장된다.

✨ 예제 2

int[] score = new int[5]; // 배열의 길이 5

for (int i=0; i<6; i++) {
	System.out.println(socre[i]); 
} // 에러발생. 유효 인덱스 범위 초과!
// 이 경우 for문의 조건식에서 배열의 길이를 직접 적어주는 것보다 '배열이름.length'를 사용하는 것이 좋다.
int[] score = new int[5]; // 배열의 길이 5

for (int i=0; i<score.length; i++) {
	System.out.println(socre[i]); 
} 



1.4 배열의 초기화

"배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화되므로 배열을 사용하기 전에 따로 초기화를 해주지 않아도 되지만, 원하는 값을 저장하려면 아래와 같이 각 요소마다 값을 지정해 줘야한다."

int[] score = new int[]{50, 60, 70, 80, 90); // 배열의 생성과 초기화를 동시에
// 괄호{} 안의 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 괄호[] 안의 길이는 안적어도 된다.



1.5 배열의 복사


▶ for문을 이용한 배열의 복사

int[] arr = new int[5];
...
int[] tmp = new int[arr.length*2] // 기존 배열보다 길이가 2배인 배열 생성

for(int i=0; i<arr.length; i++)
	tmp[i] = arr[i]; // arr[i]의 값을 tmp[i]에 저장
    
arr = tmp; // 참조변수 arr이 새로운 배열을 가리키게 한다.
  • 여러 상황을 위해 배열의 길이를 넉넉하게 2배로 하는것이 좋다.
  • 참조변수 arr과 tmp는 같은 배열을 가리키게 된다. 즉, 배열 arr과 배열 tmp는 이름만 다를 뿐 동일한 배열이다. 그렇기에 전에 arr이 가리키던 배열은 더이상 사용할 수 없게 된다.
    (배열은 참조변수를 통해서만 접근할 수 있기 때문에, 자신을 가리키는 참조변수가 없는 배열은 사용할 수 없다. 이렇게 쓸모없게 된 배열은 JVM의 가비지 컬렉터에 의해서 자동적으로 메모리에서 제거된다.)

▶ System.arraycopy()를 이용한 배열의 복사

System.arraycopy(num, 0, newNum, 0, num.length);
// num[0]에서 newNum[0]으로 num.length개의 데이터를 복사
  • 배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.
  • for문은 배열의 요소 하나하나에 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다.



1.6 배열의 활용


▶ 총합과 평균

public class ArrayEx2 {

	public static void main(String[] args) {
		int sum = 0;
		float average = 0f;
		
		int[] score = {100, 80, 100, 100, 90};
		
		for (int i=0; i<score.length; i++) {
			sum += score[i];
		}
		average = sum / (float)score.length;
		
		System.out.println("총점: "+sum);
		System.out.println("평균: "+average);

	}

}

▶ 최댓값과 최솟값

public class ArrayEx3 {

	public static void main(String[] args) {
		int[] score = {79, 88, 91, 33, 100, 55, 95};
		
		int max = score[0]; // 배열의 첫 번째 값으로 최댓값을 초기화 한다.
		int min = score[0];	// 배열의 첫 번째 값으로 최솟값을 초기화 한다.
		
		for (int i=1; i<score.length; i++) {
			if (score[i]> max) {
				max = score[i];
			} else if(score[i]<min) {
				min = score[i];
			}
		} // end of for
		
		System.out.println("최댓값: "+max);
		System.out.println("최솟값: "+min);
	}

}

▶ 임의의 값으로 배열 채우기

for (i=0; i<arr.length; i++) {
	arr[i] = (int)(Math.random()*5); // 0~4범위의 임의의 값을 저장
}

▶ 정렬하기(sort)

public class ArrayEx4 {

	public static void main(String[] args) {
		int[] numArr = new int[10];
		
		for (int i=0; i<numArr.length; i++) {
			System.out.print(numArr[i] = (int)(Math.random() * 10 )); //0~9범위의 임의의 값을 저장
		}
		System.out.println();
		
		for (int i=0; i<numArr.length-1; i++){
			boolean changed = false;  // 자리바꿈이 발생했는지를 체크한다.
			
			for (int j=0; j<numArr.length-1-i; j++) {
				if(numArr[j]>numArr[j+1]) { //옆의 값이 작으면 서로 바꾼다.
					int tmp = numArr[j];
					numArr[j] = numArr[j+1];
					numArr[j+1] = tmp;
					changed = true; // 자리바꿈이 발생했으니 changed를 true로.
					
				}
			}
			
			if (!changed) break; // 자리바꿈이 없으면 반복문을 벗어난다.
			
			for (int k=0; k<numArr.length; k++)
				System.out.print(numArr[k]); // 정렬된 결과를 출력
			System.out.println();
		}

	}

}


참고서적
자바의 정석(저자: 남궁성)


오늘의 한 줄

자바 배열 정말 어렵다. 파이썬에서는 굉장히 간단했는데 자바 문법은 신경써줘야 할 것도 많고, 복잡하다.
자바에도 파이썬에 내장함수인 sort()가 있을까? 설마 매번 저렇게 바꾸진 않겠지,,
파이썬과 자바의 큰차이를 느낀 단원.
코딩테스트 준비에서 배열 활용을 능숙하게 하는것은 자바 역시 필수일텐데.. 열심히 연습해야겠다.

다음은 String배열에 대해 공부하겠다.

profile
하이 이것은 나의 깨지고 부서지는 샏 스토리입니다

0개의 댓글