큐범
Just do debug
큐범
전체 방문자
오늘
어제
  • 전체보기 (128)
    • 회고 (4)
    • JAVA (16)
      • JAVA 기초 (18)
      • JAVA Algorithm, Datastruct (13)
    • Spring (11)
    • Micro Service Architecture (3)
    • JPA (6)
    • gRPC (4)
    • Network (8)
    • Process (7)
    • Cloud (4)
    • Python (10)
    • Web(vue) (2)
    • UMC (1)
    • DB (9)
    • CS (1)
    • Clean Code (1)
    • TDD (9)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
큐범

Just do debug

JAVA/JAVA 기초

[JAVA 기초] 배열 (선언, 생성, 길이, 초기화, 활용)

2021. 7. 26. 11:17

배열(Array)

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

배열의 생성과 선언

배열선언

선언방법 선언 예
타입[] 변수이름; int[] score; String[] name;
타입 변수이름[]; int score[]; String scroe[];

배열생성

변수이름 = new 타입 [길이];

ex) scroe = new int [5]; - int타입의 값 5개를 지정할 수 있는 배열을 생성

int [] scroe = new int [5]; - 선언과 생성을 동시에도 가능

(대부분 이렇게 사용)

배열의 길이와 인덱스

생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 하며, '배열이름[인덱스]'의 형식으로 배열의 요소에 접근한다.

인덱스(index)는 배열의 요소마다 붙여진 일련번호

로 각 요소를 구별하는데 사용된다. - 인덱스(index)의 범위는 0부터 '배열길이 '-1'까지

package Array;

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[3] = 80;
		score[4] = 90;
		
		int tmp = score[k+2] + score[4];
		
		for(int i=0; i < 5; i++) {
			System.out.printf("score[%d] : %d%n",i, score[i]);
		}
		
		System.out.printf("tmp : %d%n", tmp);
		System.out.printf("score[%d]: %d%n", 7, score[7]);
	}
}
//결과
score[0] : 50
score[1] : 60
score[2] : 70
score[3] : 80
score[4] : 90
tmp : 170
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 7 out of bounds for length 5
	at Array.ArrayEx1.main(ArrayEx1.java:21)

아래의 오류는 index의 범위는 0~4이지만, 호출하려는 인덱스가 7이기에 인덱스 값을 벗어났다는 오류이다.

배열의 길이

int[] arr = new int[5]; → 길이가 5인 int 배열

배열이름.length

배열의 길이를 구해야하는 경우가 종종 있다. 자바에서는 JVM이 모든 배열의 길이를 별도로 관리하기에 추출이 가능하다.

int[] arr = new int[5];
int tmp = arr.length   //tmp = 5

배열의 길이 변경하기

  1. 더 큰 배열을 새로 생성한다.
  1. 기존 배열의 내용을 새로운 배열에 복사한다.

배열의 초기화

int[] score = new int[] {50, 60, 70, 80, 90};
int[] score = {50, 60, 70, 80, 90};

⇒ 배열의 선언과 생성을 따로 하는 경우 new 타입[]은 생략이 불가하다.

배열의 출력

배열을 초기화할 때 for문을 사용하듯이, 배열에 저장된 값을 for문으로 하면된다.

int[] iArr = {100, 90, 80, 70 60};
for(int i=0; i<iArr.length; i++){
	System.out.println(iArr[i]);
}
package Array;

import java.util.Arrays;

public class ArrayEx2 {

	public static void main(String[] args) {
		int[] iArr1 = new int[10];
		int[] iArr2 = new int[10];
//		int[] iArr3 = new int[] {100, 95, 80, 70, 60};
		int[] iArr3 = {100, 95, 80, 70, 60};
		char[] chArr = {'a', 'b', 'c', 'd'};
		
		for(int i =0; i<iArr1.length; i++) {
			iArr1[i] = i+1;
		}
		
		for(int i=0; i<iArr2.length; i++) {
			iArr2[i] = (int)(Math.random()*10) + 1;
		}
		
		for(int i=0; i < iArr1.length; i++) {
			System.out.print(iArr1[i]+", ");
		}
		System.out.println();
		System.out.println(Arrays.toString(iArr2));
		System.out.println(Arrays.toString(iArr3));
		System.out.println(Arrays.toString(chArr));
		System.out.println(iArr3);
		System.out.println(chArr);
		
	}

}
//결과
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 
[8, 10, 8, 7, 7, 8, 6, 3, 5, 9]
[100, 95, 80, 70, 60]
[a, b, c, d]
[I@2d363fb3
abcd

배열의 복사

배열은 한번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장공간이 피룡하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 내용을 복사해야한다고 했다.

for문을 이용해서 배열을 복사하는 방법은 다음과 같다.

package Array;

public class ArrayEx3 {

	public static void main(String[] args) {
		int[] arr = new int[5];
		
		for(int i=0; i< arr.length; i++) {
			arr[i] = i+1;
		}
		
		System.out.println("[변경전]");
		System.out.println("arr.length : "+ arr.length);
		for(int i=0; i<arr.length; i++)
			System.out.println("arr["+i+"] : "+arr[i]);
		
		int[] tmp = new int[arr.length*2];
		
		for(int i=0; i < arr.length; i++)
			tmp[i] = arr[i];
		
		arr =tmp;
		
		System.out.println("변경후");
		System.out.println(arr.length);
		for(int i=0; i<arr.length; i++)
			System.out.println("arr["+i+"] : "+arr[i]);
 		
	}

}
//결과
[변경전]
arr.length : 5
arr[0] : 1
arr[1] : 2
arr[2] : 3
arr[3] : 4
arr[4] : 5
변경후
10
arr[0] : 1
arr[1] : 2
arr[2] : 3
arr[3] : 4
arr[4] : 5
arr[5] : 0
arr[6] : 0
arr[7] : 0
arr[8] : 0
arr[9] : 0

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

배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.

package Array;

public class ArrayEx4 {

	public static void main(String[] args) {
		char[] abc = {'A','B','C','D'};
		char[] num = {'0','1','2','3','4','5','6','7','8','9'};
		System.out.println(abc);
		System.out.println(num);
		
		//배열 abc와 num을 붙여서 하나의 배열(result)로 만든다.
		char[] result = new char[abc.length+num.length];
		System.arraycopy(num, 0, result, 0, abc.length);
		System.arraycopy(num, 0, result, abc.length, num.length);
		System.out.println(result);
		
		//배열 abc를 배열 num의 첫 번째 위치부터 배열 abc의 길이만큼 복사
		System.arraycopy(abc, 0, num, 0, abc.length);
		System.out.println(num);
		
		//num의 인덱스6위치에 3개를 복사
		System.arraycopy(abc, 0, num, 6, 3);
		System.out.println(num);
	}

}
//결과
ABCD
0123456789
01230123456789
ABCD456789
ABCD45ABC9

배열의 활용

총합과 평균

package Array;

public class ArrayEx5 {

	public static void main(String[] args) {
		int sum=0;
		float average = 0f;
		
		int[] score = {100, 88, 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);
	}

}
//결과
총점 : 478
평균 : 95.6

최대값과 최소값

package Array;

public class ArrayEx6 {
	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];
			}
		}
		System.out.println("최대값 : "+max);
		System.out.println("최소값 : "+min);
	}
}
//결과
최대값 : 100
최소값 : 33

섞기(shuffle)

package Array;

public class ArrayEx7 {

	public static void main(String[] args) {
		int[] numArr = new int[10];
		for(int i= 0; i<numArr.length; i++) {
			numArr[i] = i;
			System.out.print(numArr[i]);
		}
		System.out.println();
		
		for(int i=0; i<100; i++) {
			int n = (int)(Math.random() * 10);
			int tmp = numArr[0];
			numArr[0] = numArr[n];
			numArr[n] = tmp;
		}
		
		for(int i =0; i<numArr.length; i++){
			System.out.print(numArr[i]);
		}
	}

}

//결과
0123456789
9427580316

임의의 값으로 배열 채우기

package Array;

public class ArrayEx8 {
	public static void main(String[] args) {
		int[] ball = new int[45];
		
		for(int i=0; i<ball.length; i++)
			ball[i]=i+1;
		
		int temp = 0;
		int j = 0;
		
		for(int i=0; i<6; i++) {
			j = (int)(Math.random() *45);
			temp = ball[i];
			ball[i] = ball[j];
			ball[j] = temp;
		}
		
		for(int i = 0; i<6; i++) {
			System.out.printf("ball[%d]=%d%n", i, ball[i]);
		}
	}
}

//결과
ball[0]=37
ball[1]=20
ball[2]=28
ball[3]=1
ball[4]=7
ball[5]=36

임의의 값으로 배열 채우기-2

package Array;

import java.util.Arrays;

public class ArrayEx9 {

	public static void main(String[] args) {
		int[] code = {-4, -1, 3, 6, 11};
		int[] arr = new int[10];
		
		for(int i=0; i<arr.length; i++) {
			int tmp = (int)(Math.random()*code.length);
			arr[i] = code[tmp];
		}
		System.out.println(Arrays.toString(arr));		
	}

}
//결과
[6, 6, 6, 3, -1, 6, 3, 3, 6, 6]

정렬하기(sort)

package Array;

public class ArrayEx10 {

	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));
		
		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 temp = numArr[j];
					numArr[j] = numArr[j+1];
					numArr[j+1] = temp;
					changed = true;
				}
			}
			if(!changed) break; //자리 바꿈이 없으면 반복문을 빠져나간다.
			
			for(int  k = 0; k<numArr.length; k++)
				System.out.print(numArr[k]);
			System.out.println();
			
		}
	}

}

//결과
0740894089
0407840899
0047408899
0044078899
0040478899
0004478899

빈도수 구하기

package Array;

public class ArrayEx11 {

	public static void main(String[] args) {
		int[] numArr = new int[10];
		int[] counter = new int[10];
		
		for(int i=0; i<numArr.length; i++) {
			numArr[i] = (int)(Math.random()*10);
			System.out.print(numArr[i]);
		}
		System.out.println();
		
		for(int i=0; i<numArr.length; i++) {
			counter[numArr[i]]++;
		}
		
		for(int i=0; i<numArr.length; i++) {
			System.out.println(i+"의 개수 : "+counter[i]);
		}
	}

}
//결과
9542579250
0의 개수 : 1
1의 개수 : 0
2의 개수 : 2
3의 개수 : 0
4의 개수 : 1
5의 개수 : 3
6의 개수 : 0
7의 개수 : 1
8의 개수 : 0
9의 개수 : 2

 

출처 : JAVA의 정석 - (남궁성지음)

 

    'JAVA/JAVA 기초' 카테고리의 다른 글
    • [JAVA 기초] 다차원 배열
    • [JAVA 기초] String 배열화
    • [JAVA 기초] 반복문(while)
    • [JAVA 기초] 반복문(for문)
    큐범
    큐범

    티스토리툴바