1 배열
1.1 배열이란?
같은 타입의 변수를 여러 개를 선언해야 할 경우
배열이 없다면 아래와 같이 선언해야 할 것이다.
int ageOne= 27;
int ageTwo= 12;
int ageThree= 82;
int ageFour= 70;
int ageFive= 54;
int ageSix= 6;
int ageSeven= 1;
int ageEight= 30;
int ageNine= 34;
int ageTen= 42;
그러나 배열을 사용하면 다음과 같이 간단하게 할 수 있다.
int age[] = new int[10];
1.2 배열의 선언
원하는 타입의 변수를 선언하고 변수 또는 타입에 배열 을 의미하는 대괄호([])를 붙이면 된다.
대괄호는 타입 뒤에 붙여도 되고 변수 이름 뒤에 붙여도 되 지만,
가능하면 대괄호를 타입의 뒤에 붙이는 습관이 좋다.
선언방법
타입[] 변수이름;
예: int[] score;, String[] name;
타입변수이름[];
예: int score[];, String name[];
1.3 배열의 생성
배열을선언만한다고해서바로사용할수있는것이 아니다.
반드시 배열을 생성해 줘야 비로소 데이터를 저장할 수 있는 공간이 만들어지는 것이다.
배열의 선언
int[] score;
배열의 생성
score = new int[5];
이 두문장은 다음과 같이 한문장으로 줄여 쓸 수 있다.
int[] score = new int[5];
1.3 배열의 생성
배열의 선언과 생성단계를 다음과 같이 정리하자.
1.
int[] score;
int형 배열 참조변수 score를 선언한다.
그러나, 데이터 저장을 위한 공간은 아직 마련되지 않았다.
2.
score = new int[5];
연산자 new에 의해서 메모리의 빈 공간에 5개의 int형 데이터를 저장할 수 있는 공간이 마련된다.
그리고 각 배열 요소는 자동적으로 int의 기본 값인 0으로 초기화 된다.
마지막으로 할당 연산자에 의해 배열의 주소가 int형 배열 참조변수인 score 에 할당된다.
score
score[0]
score[1]
score[2]
score[3]
score[4]
0X100
score
0
0
0
0
0
0X100
score
?
0X100
0
0
0
0
0
1.3 배열의 생성
이번엔 참조형 변수의 배열에 대해 알아본다.
1.
String[] name;
String형 배열 참조변수 name을 선언한다.
그러나, 역시 데이터 저장을 위한 공간은 아직 마련되지 않았다.
2.
name = new String[5];
연산자 new에 의해서 메모리의 빈 공간에 5개의 String형 데이터를 저 장할 수 있는 공간이 마련된다.
그리고 각 배열 요소는 자동적으로 String객체의의 기본 값인 null으로 초기화 된다.
마지막으로 할당 연산자에 의해 배열의 주소가 int형 배열 참조변수인 score 에 할당된다.
name
score[0]
score[1]
score[2]
score[3]
score[4]
0X100
name
null
null
null
null
null
0X100
name
?
0X100
null
null
null
null
null
1.4 배열의 초기화
배열은 생성과 동시에 자동적으로 자신의 데이터 타 입에 해당하는 기본값으로 초기화 된다.
따라서 사용하기 전에 초기화를 안 해줘도 되지만 원하는 값으로의 초기화를 위해서는 다음과 같이 해 야 한다.
int[] score = new int[5];
score[0] = 0;
score[1] = 1;
score[2] = 2;
score[3] = 3;
score[4] = 4;
이를 그림으로 표현하면 다음과 같다.
score
0
1
2
3
4
1.4 배열의 초기화
기본형 변수의 배열이 아닌 참조형 변수의 배열의 초기화
다음과 같다.
String[] name = new String[5];
name[0] = new String(“A”);
name[1] = new String(“B”);
name[2] = new String(“C”);
name[3] = new String(“D”);
name[4] = new String(“E”);
name
name[0]
name[1]
name[2]
name[3]
name[4]
“A”
0X200
“B”
0X300
“C”
0X400
“D”
0X500
“E”
0X600
1.4 배열의 초기화
위의 방법처럼 배열의 각 요소를 하나씩 초기화 하는 것은 좀 불편하다.
그래서 보다 간편한 방법들을 제공한다.
이때 배열의 크기는 따로 지정하지 않으며 주어진 값의 개 수에 따라 자동적으로 크기가 결정된다.
int[] score = {100,90,80,70,60};
int[] score = new int[] {100,90,80,70,60};
String[] name = {new String(“A”), new String(“B”),
new String(“C”), new String(“D”), new String(“E”)};
String[] name
= new String[]{new String(“A”), new String(“B”),
new String(“C”), new String(“D”), new String(“E”)};
String[] name = {“A”, “B”, “C”, “D”, “E”};
1.5 배열의 활용
배열의 값을 읽거나 저장할 때에는 배열의 참조변수 와 인덱스를 이용한다.
배열의 인덱스는 0부터 시작한다.
즉, 크기가 5인 배열의 인덱스는 0~4까지이다.
score[3] = 100; // 배열 score의 4번째 요소에 100을 저장
int value = score[3]; // 배열 score의 4번째 요소에 지정된 값 을 읽어서 100에 저장한다.
배열의 크기는 length라는 변수에 저장이 된다.
1.5 배열의 활용
class ArrayEx1{
public static void main(String[] args){
in
t sum =0; // 총점을저장하기위한변수
float average = 0f;// 평균을저장하기위한변수
int[] score = {100, 88, 100, 100, 90};
for (int i=0; i < score.length; i++ ) {
sum += score[i];
}
/
/ 계산결과를 float로얻기위함.
average = sum / (float)score.length;
System.out.println("총점: " + sum);
System.out.println("평균: " + average);
}
}
1.5 배열의 활용
결과
총점 : 478
평균 : 95.6
설명
for문을 이용해서 배열에 저장된 값을 모두 더한 결과를 배열의 개수로 나누어서 평균을 구하는 예제이다.
평균을 구하기 위해 전체의 합을 배열의 크기인 score.length로나눈것에주목할것!
1.5 배열의 활용
예제 : 로또번호를 출력하는 예제
class ArrayEx4 {
public static void main(String[] args){
// 45개의정수값을저장하기위한배열생성.
int[] ball = new int[45];
// 배열의각요소에1~45의값을저장한다.
for(inti=0; i < ball.length; i++)
ball[i] = i+1; // ball[0]에1이저장된다.
int temp = 0; // 두값을바꾸는데사용할임시변수
int j = 0; // 임의의값을얻어서저장할변수
// 배열에저장된값이잘섞이도록충분히큰반복횟수를지정한다.
// 배열의첫번째요소와임의의요소에저장된값을서로바꿔서값을섞는다.
for(inti=0; i < 100; i++) {
j = (int)(Math.random() * 45); // 배열범위(0~44)의임의의값을얻는다.
temp = ball[0];
ball[0] = ball[j];
ball[j] = temp;
}
// 배열ball의앞에서부터6개의요소를출력한다.
for(inti=0; i < 6; i++)
System.out.print(ball[i]+" ");
}
}
1.6 다차원 배열
1차원 배열 뿐만이 아니라 2차원 이상의 배열도 허 용한다.
그러나 특별한 경우를 제외하고는 2차원 이상의 배 열은 잘 사용하지 않는다.
선언방법
타입[][] 변수이름;
int[][] score;
타입 변수이름[][];
int score[][];
타입[] 변수이름[];
int[] score[];
1.6 다차원 배열
2차원 배열은 주로 테이블 형태의 데이터를 담는데 사용되며 만일 5행 3열의 데이터를 담기 위한 배열 을 생성하려면 다음과 같다
int[][] score = new int[5][3];
이 문장이 수행되면 score[0][0]부터 score[4][2]의 15(3X5)개가 생성된다
국어
영어
수학
1
100
100
100
2
20
20
20
3
30
30
30
4
40
40
40
5
50
50
50
1.6 다차원 배열
만일 위와 같은 테이블 형태의 데이터를 배열에 저 장하기 위해서는 다음과 같이 한다.
score[0][0] = 100;
score[0][1] = 100;
score[0][2] = 100;
…
score[4][2] = 50;
1.6 다차원 배열
1차원 배열에서와 같이 중괄호를 이용해서 2차원 배열의 생성과 초기화를 동시에 할 수도 있다.
int[][] score = {{100, 100, 100},
{20, 20, 20},
{30, 30, 30},
{40, 40, 40},
{50, 50, 50}};
1.6 다차원 배열
5행 3열의 2차원 배열을 생성하고 초기화한 결과를 그림으로 나타내면 다음과 같다.
0X000
0X200
score[0][0]
score[0][1]
score[0][2]
score
score[0]
100
100
100
0X300
score[1][0]
score[1][1]
score[1][2]
score[1]
20
20
20
0X400
score[2][0]
score[2][1]
score[2][2]
score[2]
30
30
30
0X500
score[3][0]
score[3][1]
score[3][2]
score[3]
40
40
40
0X600
score[4][0]
score[4][1]
score[4][2]
score[4]
50
50
50
1.6 다차원 배열
배열의 크기
score.length의 값은? 5이다.
score이 참조하는 배열의 크기.
score[0].length의 값은? 3이다.
2차원 배열은 배열의 배열이다!
1.6 다차원 배열
class ArrayEx10{
public static void main(String[] args){
int[][] score = {{ 100, 100, 100}, { 20, 20, 20}
, { 30, 30, 30}, { 40, 40, 40}, { 50, 50, 50}};
int koreanTotal= 0;
int englishTotal= 0;
int mathTotal= 0;
System.out.println("번호국어영어수학총점평균");
for(inti=0;i < score.length;i++) {
int sum=0;
koreanTotal+= score[i][0];
englishTotal+= score[i][1];
mathTotal+= score[i][2];
System.out.print(" " + (i + 1) + " ");
for(intj=0;j < score[i].length;j++) {
sum+=score[i][j];
System.out.print(score[i][j]+" ");
}
System.out.println(sum+ " " + sum/(float)score[i].length);
}
System.out.println("총점:" + koreanTotal+ " " +englishTotal+ " " + mathTotal);
}
}
1.6 다차원 배열
실행결과
번호 국어 영어 수학 총점 평균
1 100 100 100 300 100.0
2 20 20 20 60 20.0
3 30 30 30 90 30.0
4 40 40 40 120 40.0
5 50 50 50 150 50.0
총점:240 240 240
설명
5명의 학생의 세과목 점수를 더해서 각 학생의 총점과 평균을 계산하고 과목별 총점을 계산하는 예제이다
1.7 가변배열
자바에서의 이차원이상의 배열은 배열의 배열로 처리함.
이 사실을 이용하여 더 자유로운 형태의 배열 구사도 가 능하다.
5X3의 2차원 배열을 생성하는 코드는 다음과 같았다.
int[][] score = new int[5][3];
그러나 다음과 같이도 표현이 가능하다.
int[][] score = new int[5][]; // 두번째배열의크기지정안함.
score[0] = new int[3];
score[1] = new int[3];
score[2] = new int[3];
score[3] = new int[3];
score[4] = new int[3];
1.7 가변배열
위와 같이 직사각형 형태의 배열뿐만이 아니라 다음 과 같이 2차원 배열을 생성하면 각 열마다 다른 크 기의 배열의 생성이 가능하다.
int[][] score = new int[5][];//두번째배열의크기지정안 함.
score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[3];
score[4] = new int[3];
1.7 가변배열
이를 그림으로 표현하면 다음과 같다.
배열의 크기
score.length의 값은? 여전히 5이지만 전과는 달리 score[0].length의 값은 4이고 score[1].length의 값은 3으로 서 로다르다.
0X000
0X200
score[0][0]
score[0][1]
score[0][2]
score[0][3]
score
score[0]
0
0
0
0
0X300
score[1][0]
score[1][1]
score[1][2]
score[1]
0
0
0
0X400
score[2][0]
score[2][1]
score[2]
0
0
0X500
score[3][0]
score[3][1]
score[3]
0
0
0X600
score[4][0]
score[4][1]
score[4][2]
score[4]
0
0
0
1.7 가변배열
가변배열 역시 중괄호를 이용해서 다음과 같이 생성과 초 기화를 동시에 하는 것이 가능하다.
int[][] score = {{100, 100, 100, 100},
{20, 20, 20},
{30, 30},
{40, 40},
{50, 50, 50}};
1.8 배열의 복사
배열은 한번 생성하면 그 크기를 변경할 수 없다.
배열의 가장 큰 단점이며 그래서 Collection류의 클래스를 다량으로 제공하는 이유이기도 하다.
만일 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로 부터 내용을 복사 해야 한다.
다음과 같이 사용한다.
System.arrayCopy(arr1, 0, arr2, 0, arr1.length);
배열 arr1의 내용을 arr2로 배열 arr1의 첫번째 요소로 부터 시 작하여 arr1의 데이터를 arr2의 첫번째 요소에 복사
이때 만일 복사하려는 배열의 위치가 적절하지 못하여 복사하려는 내용보다 여유공간이 적으면 ArrayOutOfBoundsException이 발 생한다.
1.8 배열의 복사
이를 도식화 하면 아래와 같다.
여기서
System.arrayCopy(arr1, 0, arr2, 0, arr1.length);를 수행하면,
이렇게 된다.
arr1
0
1
2
3
4
arr2
‘A’
‘B’
‘C’
‘D’
‘E’
arr1
0
1
2
3
4
arr2
‘A’
‘B’
1
2
‘E’
1.8 배열의 복사
class ArrayEx12{
public static void main(String[] args){
char[] abc= { 'A', 'B', 'C', 'D'};
char[] number = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
System.out.println(newString(abc));
System.out.println(newString(number));
// 배열abc와number를붙여서하나의배열(result)로만든다.
char[] result = new char[abc.length+number.length];
System.arraycopy(abc, 0, result, 0, abc.length);
System.arraycopy(number, 0, result, abc.length, number.length);
System.out.println(newString(result));
/
/ 배열abc을배열number의첫번째위치부터배열abc의크기만큼복사
System.arraycopy(abc, 0, number, 0, abc.length);
System.out.println(newString(number));
// number의인덱스6 위치에3개를복사
System.arraycopy(abc, 0, number, 6, 3);
System.out.println(newString(number));
}
}
실행결과
ABCD
0123456789
ABCD0123456789
ABCD456789
ABCD45ABC9
1.9 command line을 통해 배열 입력받기
만일 실행 할 프로그램의 main 메서드가 담긴 클 래스의 이름이 MainTest라고 가정을 할때,
다음과 같이 실행이 가능하다.
java MainTest ABC 123
커맨드라인을 통해 입력된 두 문자열은 String 배 열에 담겨서 MainTest 클래사의 main 메서드의 매개변수(agrs)에 전달된다.
즉, args[0]에는 ABC가
args[1]에는 123이 저장된다.
1.배열
command line을통해배열입력받기
예제
class ArrayEx13{
public static void main(String[] args){
System.out.println("매개변수의개수:"+args.length);
for(inti=0;i< args.length;i++) {
System.out.println("args[" + i + "] = \""+ args[i] + "\"");
}
}
}
실행
java ArrayEx13 abc 123 “Hello World”
결과
매개변수의 개수 3
args[0] = “abc”
args[1] = “123”
args[2] = “Hello World”
입력할 값이 공백이 있는 경우 ““로 감싸 주어야 한다!