티스토리 뷰

BackEnd/JAVA

[Ch.05] 1. 배열

JINSUKUKU 2021. 3. 11. 22:57

📌 배열

같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라고 한다. 여러 데이터를 저장하고 다루어야 한다면 배열로 좀 더 간편하게 사용할 수 있다.

 

👉  배열 (array)

1. 배열의 선언과 생성

int[] score;		//타입[] 배열명;
int score[];		//타입 배열명[];

✔  대괄호를 배열명의 앞에 사용해도 되고, 뒤에 사용해도 된다.

✔  대괄호가 배열명의 일부라기보다, 타입의 일부라고 볼 수 있기 때문에 전자를 추천한다.

int[] scoreA = new int[5];

int[] scoreB;
scoreB = new int[5];

✔  배열의 선언은 단지 생성된 배열을 다루기 위해 참조 변수를 위한 공간을 만드는 것

✔  이렇게 배열을 선언해 저장 공간을 만들었다면, 배열을 생성할 수 있다.

✔  배열을 생성할 때에는 연산자 'new'와 함께 배열의 타입과, 길이를 지정해주어야 한다.

✔  배열의 선언과 생성은 따로따로도 가능하고, 한 번에 함께 할 수 도 있다.

 

2. 배열의 길이와 인덱스

int[] arr = new int[5];

arr[0] = 10;	//배열의 첫번째 요소
arr[1] = 20;	//배열의 두번째 요소

int sum = arr[0]+arr[1];	//sum=30

✔  생성된 배열의 저장공간을 요소라고 하며, 배열 이름[인덱스]의 형태로 각 요소에 접근할 수 있다.

✔  배열의 인덱스는 1이 아닌 0부터 시작한다.

✔  배열의 요소는 상수나 변수처럼 수식에서도 사용할 수 있다.

✔  배열의 유효한 범위를 벗어나는 경우 컴파일 시 문제가 없었어도 실행 시에 에러가 발생하니 주의하자.

int[] arr = new int[5];
int len = arr.length;

✔  배열의 길이는 배열 생성 시, 대괄호 안에 적어둔 배열 요소의 개수를 말한다.

✔  배열명.length 을 사용해 배열의 길이를 얻을 수 있다. 

✔  배열의 길이는 한번 생성하면 변경할 수 없기 때문에, 배열명.length 는 상수라고 볼 수 있다. 그러므로 값을 변경할 수 없다.

int[] arr = new int[0];

✔  길이가 0인 배열도 생성할 수 있다. 지금은 아니고 나중에 유용하게 사용할 수 있으니 기억해두자.

 

3. 배열의 초기화

int[] arr = new int[5];

arr[0] = 10;	//배열의 첫번째 요소
arr[1] = 20;	//배열의 두번째 요소
arr[2] = 30;	//배열의 세번째 요소
arr[3] = 40;	//배열의 네번째 요소
arr[4] = 50;	//배열의 다섯번째 요소

✔  배열은 생성과 동시에 자신의 자료형에 해당하는 기본값으로 초기화된다. (int는 0)

✔  기본값이 아닌 원하는 값으로 초기화하려면 위와 같이 각 요소마다 값을 초기화해주어야 한다.

int[] arr = new int[5];

for(int i=0; i<arr.length; i++){
  arr[i] = 10 * (i+1); // 10 20 30 40 50
}

✔  배열의 길이가 길어서 요소마다 값을 지정하기 힘들 때에는 for문을 사용하자.

✔  배열의 길이만큼 반복을 해야 하므로, 배열명.length를 조건식에 사용한다.

✔  다만, 배열의 요소에 저장할 값들에 일정한 규칙이 있어야 초기화 시 for문을 사용할 수 있다.

int[] arr = new int[5];

//배열 초기화
for(int i=0; i<arr.length; i++){
  arr[i] = 10 * (i+1);
}

//배열의 요소 출력하기
for(int i=0; i<arr.length; i++){
  System.out.print(arr[i]+" ");
}
// 1 2 3 4 5 6 7 8 9 10

✔  배열의 모든 요소를 출력하고자 할 때에도 for문을 사용한다.

int[] arr = new int[5];

//배열 초기화
for(int i=0; i<arr.length; i++){
  arr[i] = 10 * (i+1);
}

//배열에 할당된 메모리의 주소를 출력
System.out.print(arr);

✔  만약 배열명을 출력하면, 배열에 할당된 저장공간의 주소를 출력한다.

//배열 선언
int[] arr;

//배열 생성
arr = new int[5];

//배열 초기화
for(int i=0; i<arr.length; i++){arr[i] = i+1;}

//배열 선언 + 생성 + 초기화 → 생성 생략 가능
int[] arr = { 1, 2, 3, 4, 5};

✔  배열의 선언, 생성, 초기화를 위처럼 따로 할 수 있지만 한 번에 하는 것도 가능하다.

✔  중괄호를 사용한 초기화는 선언과 함께하는 경우에만 사용 가능하니 주의하자.

 

4. 배열의 복사

✔  배열은 길이를 변경할 수 없기 때문에, 더 많은 저장공간이 필요하면 더 큰 배열을 생성하고 배열 요소를 복사해 다시 저장한다.

✔  배열을 복사할 수 있는 방법은 두 가지가 있다. 

int[] arrA = new int[5] { 1, 2, 3, 4, 5 };
int[] arrB = new int[10];	//기존 배열의 2배

//기존 배열 요소의 값으로 
//새로운 배열 요소를 초기화 해야하기 때문에
//기존 배열의 길이만큼 for문을 돌려야한다.

for(int i=0; i<arrA.length; i++){
	arrB[i] = arrA[i];
}

//참조변수 arrA가 arrB를 가리키게 한다
arrA = arrB;

✔  첫 번째 방법은 더 큰 배열을 만든 다음, for문을 사용해서 배열 요소를 하나하나 복사해 초기화하는 방법이다.

✔  메모리 공간 낭비를 방지하기 위해, 기존에 사용하던 배열의 2배 길이로 배열을 생성하는 것을 추천한다.

✔  그리고 기존의 배열명은 참조 변수이므로, 새롭게 만든 배열을 가리키도록 참조 변수를 초기화해주어야 한다.

✔  이렇게 하면, arrA를 사용해서 arrB의 요소에 접근할 수 있다.

int[] arrA = new int[5] { 1, 2, 3, 4, 5 };
int[] arrB = new int[10];

System.arraycopy(arrA, 0, arrB, 0, arrA.length);

✔  System.arraycopy() 함수를 사용하여 배열을 통째로 복사할 수 있다.

✔  요소를 하나하나 옮기는 첫 번째 방법보다 간단하고 빠르다.

✔  복사하려는 배열에 여유 공간이 부족하면 에러가 발생한다.

 

5. 배열의 활용

✔  배열의 활용은 다양하게 가능하다. 아래의 예제들을 풀어나가면서 확인해보자.

✔  교재의 예제와 다르게 키워드를 보고 새롭게 만들어봤다.

//총 합과 평균
public class Main {	
	public static void main(String args[]) {
		int[] score = {87,64,52,90,100};
		int sum=0;
		float avg;
		
		for(int i : score) {
			sum+=i;
		}
		avg = (float)sum/score.length;
		System.out.printf("합계 : %10d 점\n평균 : %10.2f 점\n",sum, avg);		
	}
}


//최대값과 최소값
public class Main {	
	public static void main(String args[]) {
		int[] score = {87,64,52,90,100};
		int min = score[0];
		int max = 0;
		
		for(int i : score) {
			if(min>i) min=i;
			else if(max<i) max=i;
		}
		System.out.printf("최저점 : %5d 점\n최고점 : %5d 점\n",min, max);		
	}
}


//섞기(shuffle)
public class Main {	
	public static void main(String args[]) {
		
		int[] arr = {10,20,30,40,50,60,70,80,90,100};
		
		//기존 순서대로 출력
		System.out.print("섞기 전 : ");
		for(int i:arr) {
			System.out.print(i+" ");
		}System.out.println();
		
		//섞기(shuffle)
		for(int i=0; i<arr.length; i++) {
			//Math.random()은 0부터 1까지 랜덤하게 실수 값을 반환
			//10을 곱하고 int로 형변환을 해주면, 0~9를 랜덤으로 반환한다.
			int n = (int)(Math.random()*10);
			
			//랜덤으로 정해진 index의 요소 값을 i번째 요소와 맞바꾸어보자.
			int temp = arr[i];
			arr[i] = arr[n];
			arr[n] = temp;
		}
		
		//멋대로 바뀐 순서대로 출력 (실행할 때 마다 순서가 바뀐다)
		System.out.print("섞은 후 : ");
		for(int i:arr) {
			System.out.print(i+" ");
		}System.out.println();
	}
}


//임의의 값으로 배열 채우기
public class Main {	
	public static void main(String args[]) {
		int[] arr = new int[10];
		
		for(int i=0; i<arr.length; i++) {
			arr[i] = (int)(Math.random()*100);	//0~99 임의값으로 초기화			
			System.out.printf("%d ", arr[i]);	//출력	
		}
	}
}


//임의값으로 채우고 정렬하기(sort)
public class Main {	
	public static void main(String args[]) {
		int[] arr = new int[10];
		
		System.out.print("정렬 전 : ");
		for(int i=0; i<arr.length; i++) {
			arr[i] = (int)(Math.random()*100);	//0~99 랜덤으로 초기화			
			System.out.printf("%2d ", arr[i]);	//출력	
		}
		
		int temp;
		for(int i=0; i<arr.length; i++) {
			int min = arr[i];
			int idx = i;
			for(int j=i; j<arr.length; j++) {
				if(min>arr[j]) {
					min = arr[j];
					idx = j;
				}
			}
			temp = arr[i];
			arr[i] = min;
			arr[idx] = temp;
		}
		
		System.out.print("\n정렬 후 : ");
		for(int i:arr){	
			System.out.printf("%2d ", i);	//출력	
		}
	}
}

 

6. 배열의 초기화 기본 값

자료형 기본값
boolean false
char '\u0000'
byte, short, int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 변수 null

 

 

 

 

 

 

[참고] 자바의 정석

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

싱글톤 패턴(SingleTone Pattern)  (0) 2021.10.25
[Ch.05] 2. String 배열, 다차원 배열  (0) 2021.03.14
[Ch.04] 조건문과 반복문  (0) 2021.03.05
[Ch.03] 5. 기타 연산자  (0) 2021.02.28
[Ch.03] 4. 비교 연산자/논리 연산자  (0) 2021.02.28
댓글
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday