배열
변수는 한 개의 데이터만 저장이 가능한데 저장해야할 데이터의 수가 증가하면 그많큼 많은 변수를 필요로 하게됩니다.
예를들면 학생 20명정도의 석적을 저장하고, 평균값을 구한다고 가정해 보았을떄 먼저 학생 30명의 석적을 저장하기 위해서는 변수 30개를 선언해야 합니다. 그리고 평점을 구하기 위해서는 변수들을 모두 더해주어야합니다.
하지만 정말 그렇게 일한다면 코드의 수가 말도 안되게 늘어납니다. 같은 타입의 데이터를 연속된 공간에 나열시키고,각 데이터에 인덱스(index) 를 부여해 놓은 자료구조 입니다.
배열은 생성가 동시에 데이터 타입의 값이 저장되어 다른 타입의 값을 저장하려고 하면 타입 불일치 컴파일 요류거 벌샹됩니다..
문법
타입[] 변수이름 =null
// 바로 값을 넣어주어 배열생성
타입[] 변수 = {"값1"."값2"."값3"};
값 목록으로 배열 생성
배열에 값을 넣고 합과 평균을 내는 예제코드
public class ArrayEcreateByValueListEx {
public static void main(String[] args) {
int[] scores = {83, 90, 87};
System.out.println("scores[0] : " + scores[0]);
System.out.println("scores[1] : " + scores[1]);
System.out.println("scores[2] : " + scores[2]);
int sum =0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
// 배열 값의 합
}
System.out.println("총합 : " + sum);
double avg = (double) sum /3;
System.out.println("평균 : " + avg);
}
}
출력 해보면
값의 목록으로 배열 객체를 생성할 때 주의할 점이 있는데, 배열 변수를이미 선언한 후에 다른 실행 문에서 중괄호를 사용한 배열 생성은 허용하지 않습니다.
타입[] 변수;
변수 = {값0, 값1, 값2, 값3 ,....}; // 컴파일 에러가남
배열 변수를 미리 선언한 후, 값 목록들이 나중에 결정되는 상황이라면 다음과 같이 new 연산자를 사용해서 값 목록을 지정해주면 됩니다.
// 숫자만큼의 크기를 가진 배열생성
타입[] 변수이름 = new 타입[숫자]
// 숫자는 예시임
변수 = new 타입[] {값0, 값1, 값2, 값3, ....};
예를 들어 배열 names 를 다음과 같이 만들수있습니다.
String[] names = null;
names = new String[] {"홍길동","홍길순","홀길자",....};
매소드의 매개값이 배열일 경우에도 마찬가지로 아래와 같이 매개 변수로 int[] 배열이 선언된 add() 메소드가 있을 경우, 값 목록으로 배열을 생성함과 동시에 add() 메소드의 매개값으로 사용하고자 할 때는 반드시 new 연사자를 사용해야합니다.
int add(int[] scores) {...}
int result = add({95, 84, 94}); //컴파일 에러
int result = add(new int[] {95, 84, 94});
public class ArrayEcreateByValueListEx2 {
public static void main(String[] args) {
int[] scores;
// 배열 생성
scores = new int[] {83, 90, 87};
// 배열에 값을 넣어줌
int sum1 = 0;
for(int i=0; i<scores.length; i++) {
sum1 += scores[i];
}
System.out.println("총합 : " + sum1);
// 리턴된 총합을 sum2에 저장
int sum2 = add(new int[] {83, 90, 87});
System.out.println("총합 : " + sum2);
System.out.println();
}
public static int add(int[] scores) {
// 메소드 add 생성 scores의 값을 받아옴
int sum = 0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
}
return sum;
}
}
결과 출력 해보면
new 연산자로 배열을 생성할수 있습니다.
값의 목록을 가지고 있지 않지만, 향후 값들은 저장할 배열을 미리 만들고 싶다면 new 연산자로 다음과 같이 배열 객체를 생성 가능합니다.
타입[] 변수 = new 타입[길이];
길이는 배열이 저장할 수 있는 값의 수를 말합니다.
new 연산자로 배열을 생성할 경우에는 이미 배열 변수가 선언된 후에도 가능합니다.
타입[] 변수 = null;
변수 = new 타입[길이];
예로 길이 5인 int 타입의 배열을 생선한다고 하면 밑에처럼 작성해주면 됩니다.
int[] intArray = new int[5];
배열을 생성하고 나서 새로운 값을 저장하려면 대입 연산자를 사용하면 되는데
변수[인덱스] = 값;
예를 들어서 scores의 0, 1, 2 인덱스에 각각 83, 90, 75를 저장하는 코드를 만든다면
int scores[] = new int[3];
scores[0] = 83;
scores[1] = 90;
scores[2] = 75;
이런식으로 만들어주면 됩니다.
new연산자를 사용해서 배열을 생성하는 예제코드
public class ArraryCreateByNewEx {
public static void main(String[] args) {
int[] arr1 = new int[3];
// arr1이라는 배열생성 공간은 3칸(0,1,2)
for(int i=0; i<3; i++) {
// i는 3으로 해도되고 i<arr1.length으로 해줘도 됨
// .length는 배열의 속성을 사용하면 나중에 코드 변경시 손이 덜갈수있음
System.out.println("arr1[" + i +"] : " + arr1[i]);
}
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
double[] arr2 = new double[3];
// double 타입의 배역 arr2 생성 공간은 3칸
for(int i =0; i<3; i++) {
System.out.println("arr1[" + i +"] : " + arr1[i]);
}
arr2[0] = 0.1;
arr2[1] = 0.2;
arr2[2] = 0.3;
for(int i=0; i<3; i++) {
System.out.println("arr2[" + i + "] : " + arr2[i]);
}
String[] arr3 = new String[3];
// 문자열 타입의 arr3라는 배열 생성 공간은 3칸
for(int i=0; i<3; i++) {
System.out.println("arr3[" + i + "] : " + arr3[i]);
}
arr3[0] = "1월";
arr3[1] = "2월";
arr3[2] = "3월";
for(int i=0; i<3; i++) {
System.out.println("arr3[" + i + "] : " + arr3[i]);
}
}
}
결과 출력
배열 길이
배열의 길이란 배열에 저장할 수 있는 전체 항목 수를 말합니다.코드에서 배열의 길이를 얻으려면 위에서 사용해본거와 같이 같이 배열 객체의 length 필드를 읽으면 됩니다.
배열변수.length;
대략 배열 intArray의 길이를 알아본다고 하고 코드를 작성해보면
int[] intArray = {10, 20, 30};
// 배열선언해주고
int num = intArray.length;
// num에는 3이란 값이 들어가짐
이렇게 됩니다. .length 필드는 읽기 전용 필드라서 값을 바꿀수가없습니다.
// 이건 잘못된 코드임
intArray.length = 10;
배열.length 의 간단한 예제를 만들어보자면
public class ArrayLengthEx {
public static void main(String[] args) {
int[] scores = {100, 90, 80};
int sum = 0;
for(int i=0; i<scores.length; i++) {
// scores.length 에는 3이란 값이 들어가있음
sum +=scores[i];
// i가 0부터 2까지 늘어날테니 위에 변수의 값 3개를
// 잘불러올수있음
// 식을 풀어쓰면 scores[0]+scores[1]+scores[2] 이렇게 되는것임
}
System.out.println("배열i의 합 : " + sum);
double avg = sum/scores.length;
System.out.println("배열의 합의 평균 : " + avg);
}
}
결과를 출력해 보면
재대로 값이 나온걸 알수 있습니다. 참고로 배열은 0부터 시작이라 배역의 길이가 3이면 0, 1, 2입니다.
그러므로 for문을 사용할때 scores.length가 아닌 4같은 수를 지정해서 넣어준다면(n(길이)-1을 해줘야함) 을 사용한다면 인덱스를 초과해서 ArrayIndexOutOfBoundsException이 발생합니다.
커멘드 라인 입력
이제 프로그램 실행을 할려면 main() 메소드가 필요하다는 것을 알고있습니다.
하지만 메소드의 매개값인 String[] args 가 왜 필요한지 궁금했었는데 이제 알수있습니다.
public static void main(String[] args)
"java 클래스" 로 프로그램을 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고 main() 메소드를 호출할 때 매게값으로 전달합니다.
만약에 java 클래스 뒤에 공백으로 구분된 문자열 목록을 주고 실행하면, 문자열 목록으로 구성된 String[] 배열이 생성되고 main() 메소드를 호출할 때 매개값으로 전달됩니다.
main() 메소드는 String[] args 매개 변수를 통해서 커맨드 라인에서 입력된 데이터의 수(배열의 길이) 와
입력된 데이터(배열의 항목 값)를 알 수 있게 됩니다.
public class MainStringArrayArgument {
public static void main(String[] args) {
// TODO Auto-generated method stub
if(args.length != 2) { // - 입력된 데이터 개수가 2개가 아닐경우
System.out.println("프로그램의 사용법");
System.out.println("java MainStringArrayArgument num1 num2");
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이므로 3라인의 if 조건식이 ture가 되어 if문의 블록이 실행하게 된것입니다.
밑에 값도 확인할려면 메뉴에서 Run -> Run Configurations... 를 선택하면 됩니다.
들어가 주고
Arguments 를 선택한후에 밑에 program argument에 값을 써주고 출력해보면
값이 잘나옵니다