: 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조
: 인덱스는 0부터 시작함
- 특징
1. 같은 타입의 데이터만 저장할 수 있음
2. 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없음
- 배열선언
[형식1] 타입[] 변수;
[형식2] 타입 변수[];
- 배열생성
[값 목록으로 배열생성] 타입[] 변수 = {값0, 값1, 값2, 값3, ...}
ex) Stirng[] names = {"abc0","abc1","abc2"};
* 값의 목록으로 배열 객체를 생성할 때 주의할 점 *
: 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않음
: 배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면 new연산자를 사용해서 값 목록을 지정해야함
변수 = new 타입[] { 값0, 값1, 값2, 값3};
ex)
String[] names = null;
names = new String[] {"abc0","abc1","abc2"}
int result = add({95,85,90}); //컴파일에러
int result = add(new int[] {95,85,90});
👩💻 값 목록으로 배열 생성
public class ArrayCreateByValueListExample2 {
public static void main(String[] args) {
int[] scores;
scores = new int[] {83, 90, 87};
int sum1 = 0;
for(int i=0; i<3; i++) {
sum1 += scores[i];
}
System.out.println("총합: "+sum1);
int sum2 = add(new int[] {83, 90, 87});
System.out.println("총합: "+sum2);
System.out.println();
}
public static int add(int[] scores) {
int sum = 0;
for(int i=0; i<3; i++) {
sum+=scores[i];
}
return sum;
}
}
💻출력
총합: 260
총합: 260
[new연산자로 배열 생성]
1) 값의 목록을 가지고 있지 않을 경우, 배열 생성
타입[] 변수 = new 타입[길이];
2) 배열 변수가 선언된 경우, 배열 생성
타입[] 변수 = null;
변수 = new 타입[길이];
ex) int[] intArray = new int[5]; // 길이가 5인 배열, 기본값 0으로 초기화
String[] names = enw String[30]; // 길이가 30인 배열, 기본값 null값으로 초기화
- 특정 인덱스 위치에 새로운 값을 저장시, 대입 연산자 사용
변수[인덱스] = 값;
ex)
int[] scores = new int[3];
scores[0] = 83;
scores[1] = 90;
scores[2] = 75;
- 배열길이
: 배열에 저장할 수 있는 전체 항목의 개수
[표현법] 배열변수.length;
: 인덱스를 초과해서 사용하면 ArrayIndexOutOfBoundsException이 발생
public static void main(String[] args){...}
: 명령 라인(명령 프롬프트)에서 위 코드를 java 명령어로 실행하면
JVM은 길이가 0인 String배열을 먼저 생성하고 main()메소드를 호출할 때 매개값으로 전달함
String[] args = {};
<<main()메소드 호출 시 전달>>
args → args
public static void main(String[] args ){...}
- main()메소드는 String[] args매개 변수를 통해서
명령 라인에서 입력된 데이터의 수(배열의 길이)와 입력된 데이터(배열의 항목 값)를 알 수 있음
<public class MainStringArrayArgument {
public static void main(String[] args) {
if(args.length != 2) { //입력된 데이터 개수가 2개가 아닐 경우
System.out.println("값의 수가 부족합니다.");
System.exit(0); // 프로그램 강제 종료
}
String strNum1 = args[0]; //첫 번째 데이터 얻기
String strNum2 = args[1]; //두 번째 데이터 얻기
int num1 = Integer.parseInt(strNum1);
int num2 = Integer.parseInt(strNum2);
int result = num1+num2;
System.out.println(num1+"+"+num2+"="+result);
}
}
💻출력
- 실행할 때 매개값을 주지 않으면 길이 0인 String 배열이 매개값으로 전달되기 때문에
args.length는 0이므로
값의 수가 부족합니다. 이라는 출력문이 나옴
💻매개값을 주었을 때
매개값 설정 방법
1.Run → Run Configurations
2.Main탭 → Project와 Main Class확인
3. Arguments탭 클릭 → Program arguments 입력란에 10을 입력한 후 빈 칸을 띄우고 다시 20을 입력
4. Apply 클릭
이렇게 실행하면 args는 {"10","20"} 배열을 참조하게 됨
10+20=30
- 1차원 배열이 서로 연결된 구조로 다차원 배열을 구현하기 때문에 계단식 구조를 가질 수 있음
int[][] scores = new int[2][];
scores[0] = new int[2]; //0 1
scores[1] = new int[3]; //0 1 2
→ 이런 배열의 주의할 점
: 배열의 정확한 길이를 알고 인덱스를 사용해야 함
socres[0][2]는 ArrayIndexOutOfBoundsException 발생시킴(이유는 마지막 인덱스가 1이기 때문)
- 그룹화된 값 목록을 가지고 있다면 중괄호안에 다시 중괄호를 사용해서 값 목록을 나열함
타입[][] 변수 = {{값1, 값2, ...}, {값1, 값2, ...}, ...};
ex) int[][] scores = {{95,80}, {92,96}};
int score = scores[0][0]; // 95
int score = scores[1][1]; // 96
- 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있음
예를들어, String은 클래스이므로 String[] 배열은 각 항목에 문자열이 아니라,
String 객체의 번지를 가지고 있음. 즉 String[] 배열은 String 객체를 참조함
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";
- String[] 배열 항목 간에 문자열을 비교하기 위해서는 equals()메소드를 사용해야함
==연산자는 객체의 번지를 비교함
👨💻 객체를 잠조하는 배열
public class ArrayReferenceObjectExample {
public static void main(String[] args) {
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");
// 두 배열 객체가 동일한 String 객체를 참조
System.out.println(strArray[0] == strArray[1]);
// new연산자로 생성하면 새로운 String객체가 생성되기 때문에 서로 다른 객체를 참조
System.out.println(strArray[0] == strArray[2]);
// 문자열 비교
System.out.println(strArray[0].equals(strArray[2]));
}
}
💻출력
true
false
true
: 배열은 한 번 생성하면 크기를 변경할 수 없기 때문에
더 많은 저장 공간이 필요하면 더 큰 배열을 새로 만들고 이전 배열로부터 항목 값들을 복사해야함
복사방법
1. for문 사용하기
2. System.arraycopy()메소드 사용
- System.arraycopy()
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
src - 원본 배열
srcPos - 원본 배열에서 복사할 항목의 시작 인덱스
dest - 새 배열
destPost - 새 배열에서 붙여넣을 시작 인덱스
length - 복사 할 개수
👨💻 System.arraycopy()로 배열 복사
public class ArrayCopyExample {
public static void main(String[] args) {
String[] oldStrArray = {"java", "array", "copy"};
String[] newStrArray = new String[5];
System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
for(int i=0; i<newStrArray.length; i++) {
System.out.print(newStrArray[i] + ",");
}
}
}
💻출력
java,array,copy,null,null,
: 배열 및 컬렉션 항목의 개수만큼 반복하고, 자동적으로 for문을 빠져나감
for(타입 변수: 배열){ 실행문; }
1. 배열에서 가져올 첫 번째 값이 존재하는지 평가
2. 가져올 값이 존재하면 해당 값을 변수에 저장
3. 실행문을 실행
4. 블록 내부의 실행문이 모두 실행되면 다시 루프를 돌아 배열에서 가져올 다음 값이 존재하는지 평가
5. 다음 항목이 존재하면 루프를 다시 진행, 가져올 다음 항목이 없으면 for문이 종료됨
👨💻 향상된 for문
public class AdvancedForExample {
public static void main(String[] args) {
int[] scores = {95, 71, 84, 93, 87};
int sum = 0;
for(int score : scores) {
sum += score;
}
System.out.println("점수 총합=" + sum);
double avg = (double) sum / scores.length;
System.out.println("점수 평균=" + avg);
}
}
💻출력
점수 총합=430
점수 평균=86.0