Java Standard - 배열(Array)
...
Java Standard - 배열(Array)
배열
배열이란?
_배열을 사용하기 전과 후의 모습을 메모리에서 봤을때 _
- 배열
- 같은 타입의 여러 변수를 하나의 묶음으로 다로는 것
- 주의사항
- 다루는 데이터가 같은 타입 이어야 한다.
배열의 선언과 생성
1
2
타입[] 변수이름; //배열을 선언, 배열을 다루기 위한 참조변수 선언
변수이름 = new 타입[길이]; //배열을 생성, 실제 저장공간을 생성
- 선언: 참조변수를 위한 공간을 만드는 것
- 원하는 타입의 변수를 선언한 뒤 대활호
[]
를 붙이면 된다.(타입 뒤나 변수 뒤에 붙이면된다) - 생성: 값을 저장할 수 있는 공간을 만드는 것
new
연산자 와 함께 배열의 타입과 길이를 정해야한다.
생성과정
1
2
1. int[] age; //배열을 선언, 배열을 다루기 위한 참조변수 선언
2. age = new int[5]; //배열을 생성, 실제 저장공간을 생성
키워드
new
에 의해서 데이터를 저장할 수 있는 공간 생성
배열의 요소는 자동적으로 해당 자료형의 기본 값으로 초기화
배열의 길이와 인덱스
- 배열의 요소
- 배열의 각 저장공간,
배열이름[인덱스]
로 접근 - 인덱스
- 배열의 요소마다 붙여진 일련번호
- 0부터 시작
0~’배열의 길이-1’
, 범위를 벗어난 인덱스로 요소 접근시 에러 - 0부터 시작
- 길이
- 배열의 요소 개수, 저장공간 개수를 의미, 양의 정수여야함, 길이가 0이어도 된다.
배열이름.length
로 접근 가능하다.- JVM이 모든 배열의 길이를 별도로 관리한다.
- 이미 생성된 배열의 길이는 변하지 않기 때문에, 배열의 길이는 상수다.
- 길이 변경하는 방법은 더 큰 새로운 배열을 새로 생성한 후기존 배열의 내용을 새로운 배열에 복사해야하기 때문에 작업 비용이 많이 든다.
배열의 초기화
1
2
3
4
5
6
7
8
9
10
int count = {1,2,3}; //OK
int[] age;
age = new int[]{10,20,30}; //OK
age = {10,20,30}; //에러
// 메서드 정의시에도 같다.
int add(int[] arr){}
int result = add(new int[] {4,5,6}); //OK
int result = add(int[] {4,5,6}); //에러
- 배열의 초기화
- 생성과 동시에 타입에 맞는 기본값으로 초기화 된다.
- 원하는 값으로 초기화 하는 방법
- 각 요소마다 원하는 값으로 초기화 한다.
- 괄호
{}
안에 쉼표로 구분해서 원하는 값을 나열해 한번에 초기화한다. 값의 개수에 의해 배열의 길이가 자동으로 결정되기 때문에 배열의 길이를 정하는 대괄호[]
안의 값은 안적어도 된다.new 타입[]
의 내용도 생략 할 수 있지만, 배열의 선언과 생성을 따로하는 경우에는 생략할 수 없다. - 괄호
- 배열의 출력
- 반복문을 이용한 각 요소 출력
Arrays.toString(배열이름)
메서드를 이용한 전체 출력- 참조변수 출력시 배열의 주소가 아닌
타입@주소
의 형식으로 출력된다.
배열의 복사
- for문을 이용한 복사
1
2
3
4
5
6
7
8
9
int[] arr = new int[5];
...
int[]temp = new int[arr.length*2];//기존 객체보다 길이가 2배인 배열 생성
for(i=0;i<arr.length;i++)
temp[i] = arr[i]; //temp배열에 값 복사
arr = temp; //참조변수 arr이 새로운 배열을 가리키게 함
// 결국 arr과 temp는 이름만 다를뿐 동일한 배열이다.
- System.arraycopy()를 이용한 복사
- arraycopy()는 지정된 범위의 값들을 통째로 복사한다.
- 각 요소들이 연속적으로 저장되어 있다는 배열의 특성때문에 이렇게 처리하는 것이 가능한 것이다.
⇒ 배열의 복사는 for문 보다 System.arraycopy()
를 사용하는 것이 효율적이다.
배열의 활용
다양한 예제를 통한 활용 방법
- 총합과 평균
1
2
3
4
5
6
7
8
9
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;
- 최대값과 최소값
1
2
3
4
5
6
7
8
9
10
11
12
13
int[] score = {79, 88, 91, 33, 100, 55, 95};
int max = score[0];
int min = score[0];
for(int i = 0; i<score.length; i++){
if(score[i] > max)
max = score[i];
else if(score[i] < min)
min = score[i];
}
average = sum / (float)score.length;
- 섞기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int[] numbers = new int[10];
for(int i = 0; i<numbers.length; i++){
numbers[i] = i;
}
for(int i = 0; i<numbers.length; i++){
int randomNumber = (int)(Math.random() * 10);
//랜덤한 n번째 값과 i번째 값을 바꿔서 랜덤하게 만듬
int temp = numbers[i];
numbers[i] = numbers[n];
numbers[n] = temp;
}
- 정렬하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int[] numbers = new int[10];
for(int i = 0; i<numbers.length; i++){
numbers[i] = (int)(Math.random() * 10);
}
for(int i = 0; i<numbers.length-1; i++){
boolean changed = false;// 자리 바꿈이 있는지 체크
//배열의 길이에서 1이작은 numbers.length-1만큼 비교해야하는데
//매 반복마다 비교 횟수가 1씩 줄어서 빼는 것
for(int j=0; j< numbers.length-1-i;j++){
if(numbers[j]>numbers[j+1]){//옆의 값이 작으면 서로 변경
int temp = numbers[j];
numbers[j] = numbers[j+1];
numbers[j+1] = temp;
changed = true;
}
}
if(!changed) break; //자리 바꿈이 없으면 벗어난다.
}
- 빈도수 구하기
1
2
3
4
5
6
7
8
9
10
int[] numbers = new int[10];
int[] counter = new int[10];
for(int i = 0; i<numbers.length; i++){
numbers[i] = (int)(Math.random() * 10);
}
for(int i = 0; i<numbers.length; i++){
counter[numbers[i]]++;
}
String 배열
String 배열
- 선언과 생성
- 선언과 생성방법은 int배열과 String배열과 다르지 않다.
1
String[] name = new String[3];
char배열과 String 클래스
- 문자열 = 문자를 연이어 늘어놓은것 = char배열
- char배열이 아닌 String으로 문자열을 처리하는 이유: String클래스가 char배열에 여러 가지 기능을 추가하여 확장한 것이기 때문이다.
- char배열과 관련된 기능을 함께 묶어서 클래스로 정의(객체지향에서는 데이터와 그에 연관된 기능을 하나의 클래스에 묶어서 다룰수 있게한다.) ⇒ String 클래스는 char배열에 기능(메서드)를 추가한 것이다.
char배열과 String 클래스의 변환
1
2
3
char[] chArr = {'a', 'b', 'c'};
String str = new String(chArr);//char배열 ->
char[] newChArr = str.toCharArray();//String -> char배열
커맨드 라인을 통해 입력받기
프로그램을 실행할 때 클래스 이름 뒤에 공백분자로 구분하여 여러 개의 문자열을 프로그램에 전달할 수 있다.
1
c:\jdk1.8\work\ch5>java MainTest abc 123
이때 abc와 123은 main함수 매개변수의 0번째와 1번째에 저장되게 된다.
만약 매개변수를 입력하지 않으면, args를 사용하는 모든 코드에서 문장이 발생할 텐데 JVM이 입력된 매개변수가 없을때는 null 대신 크기가 0인 배열을 생성해 전달하도록 되어있어서 오류가 나지 않고, 이에 대한 코드를 추가로 작성하지 않아도 된다.
다차원 배열
지금까지 우리가 배운 배열은 1차원인데, 2차원 이상의(=다차원) 배열도 선언해서 사용할 수 있다. 차원의 제한은 없지만, 주로 1,2차원 배열이 사용되고, 2차원까지만 잘 이해하면 3차원도 어렵지 않을 것이다.
2차원 배열의 선언과 인덱스
1
int[][] score = new int[4][3]; //4행 3열의 2차원 배열 생성
- 선언
- 선언하는 방법은 1차원과 같은데 대괄호가 1개가 아닌 2개이다.
[][]
- 4행 3열, 총 12개의 저장공간이 생성
- 인덱스
- 행과 열로 구성되어 있기 때문에 인덱스도 행index, 열index가 존재
- 행index: 0~(행의 길이 -1), 열index: 0~(열의 길이 -1)
- 접근 방법: 배열이름[행index][열index]
- 행index: 0~(행의 길이 -1), 열index: 0~(열의 길이 -1)
2차원 배열의 초기화
- 초기화
- 괄호
{}
를 써서 생성과 초기화를 동시에 할 수 있다. 한번 더 써서 행별로 구분해줘야한다.- 2차원 배열의 구성: 배열의 배열
1
2
3
4
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
score.length = 5 , score[0].length = 3
가변 배열
- 가변 배열
- 2차원 이상의 배열은 배열의 배열 형태로 저장하기 때문에 보다 자유로운 형태의 배열 구성이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int[][] score = new int[5][];
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];
int[][] score = {
{0, 0, 0, 0},
{0, 0, 0},
{0, 0},
{0, 0},
{0, 0, 0},
}
This post is licensed under CC BY 4.0 by the author.