배열의 길이(사이즈)
배열에 저장할 수 있는 전체 항목 수
코드에서 배열의 길이를 얻는 방법
배열변수.length;
int[] intArray = {10,20,30};
int num = intArray.length;
배열의 길이는 읽기 전용
intArray.length = 10; //잘못된 코드 , 임의적으로 다른 값을 대입할 수 없음
배열의 길이는 for문의 조건식에서 주로 사용 ( 배열의 길이 만큼 반복되게 만드는것)
예제)
package sec06.exam03_array_length;
public class ArrayLengthExample
{
public static void main(String[] args)
{
int[] scores = {83,90,87};
int sum = 0;
for(int i =0; i<scores.length ; i++) //i가 배열의 크기보다 작을때까지 반복
{
sum += scores[i];
}
System.out.println("총합 : " + sum);
double avg = (double)sum/scores.length;
System.out.println("평균 : " + avg);
}
}
커맨드 라인 입력
프로그램 실행을 위해 main() 메소드가 필요하다. 하지만 main() 메소드의 매개값인 String[] args가 왜 필요한 것일까.
1. java 클래스명
"java 클래스명"으로 프로그램을 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고 main() 메소드를 호출할 때 매개값으로 전달한다.
2. java 클래스명 문자열1 문자열2 ...
java 클래스 문자열0 문자열1 문자열2 ... 문자열n-1
문자열이 각각 index번호 0, 1, 2, ... n-1이 된다.
"java 클래스"뒤에 공백으로 구분된 문자열 목록을 주고 실행하면, 문자열 목록으로 구성된 String[] 배열이 생성되고, main() 메소드를 호출할 떄 매개값으로 전환된다.
예제)
package sec06.exam04_main_argument;
public class MainStringArrayExample
{
public static void main(String[] args)
{
System.out.println("배열의 길이 : " + args.length);
//이클립스 실행시 매개값 주는 방법
//1. 코드 실행 버튼 오른쪽 아래 화살표 클릭 (더보기)
//2. Run Configurations 클릭
//3. Arguments 클릭
//4. Program arguments에 값 입력
//5. Run으로 실행시키면 배열의 길이가 달라진것 확인가능
}
}
package sec06.exam04_main_argument;
public class MainStringArrayExample
{
public static void main(String[] args)
{
if(args.length != 2)
{
System.out.println("프로그램의 사용법");
System.out.println("java MainStringArrayExample num1 num2");
System.exit(0); //프로그램 종료
}
String strNum1 = args[0]; //num1과 num2 값에 만약 3과 5를 넣었다고 하더라도 String 배열에 받은 값이기 때문에 문자열임. 따라서 String타입의 strNum1에 저장
String strNum2 = args[1];
int num1 = Integer.parseInt(strNum1); //문자열을 정수로 변환 / 숫자로 변환이 가능한 문자열만 넣어야함. 숫자로 변환이 불가능한거 넣으면 오류발생
int num2 = Integer.parseInt(strNum2);
int result = num1 + num2;
System.out.println(num1 + " + " + num2 +" = " + result);
}
}
다차원 배열
2차원 배열 이상을 다차원 배열이라고 한다.
2차원 배열은 수학의 행렬과 같은 자료 구조이다.
자바는 1차원 배열을 이용해 2차원 배열을 구현한다. -> 계단식 구조의 2차원 배열을 만드는것이 가능하다.
int[][] scores = new int[2][3];
ex) scores[0][0] = 3 이라고 하면 배열 A의 0번째 -> 배열 B의 0번째에 3을 저장하고,
scores[1][2] = 5 라고 하면 배열 A의 1번째 - > 배열 C의 2번째에 5를 저장한다.
값 목록을 이용한 2차원 배열
타입[ ][ ] 변수 = { {값1, 값2, ... }, {값1, 값2, ...}, ...};
int [ ][ ] scores = { {95. 80}. {92. 96} };
int score = scores[0][0]; //95
int score = scores[1][1]; //96
예제)
package sec06.exam04_main_argument;
public class ArrayInArrayExample
{
public static void main(String[] args)
{
int[][] mathScores = new int[2][3];
for(int i =0; i<mathScores.length; i++) //mathScores.length는 2
{
for(int k =0; k<mathScores[i].length; k++) //mathScores[i].length는 3 / i가 0이여도 3, 1이여도 3
{
System.out.println("scoresMath[" + i + "][" + k +"] = " + mathScores[i][k]);
}
}
System.out.println();
int[][] englishScores = new int[2][];
englishScores[0] = new int[2];
englishScores[1] = new int[3];
for(int i =0; i<englishScores.length; i++) //englishcores.length는 2
{
for(int k =0; k<englishScores[i].length; k++) //englishScores[i].length는 / i가 0이면 2, 1이면 3
{
System.out.println("scoresEnglish[" + i + "][" + k +"] = " + englishScores[i][k]);
}
}
System.out.println();
int[][] javaScores = { {95,80}, {92,96,80}};
for(int i =0; i<javaScores.length; i++) //javacores.length는 2
{
for(int k =0; k<javaScores[i].length; k++) //javaScores[i].length는 / i가 0이면 2, 1이면 3
{
System.out.println("scoreJava[" + i + "][" + k +"] = " + javaScores[i][k]);
}
}
}
}
객체를 참조하는 배열
기본타입 (byte, char, short, int, long, float, double, boolean) 배열 : 각 항목에 직접 값을 가지고 있다.
참조타입 (클래스, 인터페이스) 배열 : 각 항목에 객체의 번지를 가지고 있다.
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "C++";
strArray[2] = "C#";
배열 복사
배열은 한 번 생성하면 크기를 변경할 수 없다.
더 많은 저장 공간이 필요하다면 보다 큰 배열을 새로 만들고 이전 배열로부터 항목값들을 복사해야 한다.
배열 복사 방법
1. for문을 이용하는 방법
int[] oldIntArray = {1,2,3};
int[] newIntArray = new int[5];
for(int i =0; i<oldIntArray.length; i++)
{
newIntArray[i] = oldIntArray[i];
}
2. System.arrayCopy() 메소드를 이용하는 방법
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
(원본 배열, 원본 배열에서 복사할 항목의 시작 인덱스, 새 배열, 새로운 배열의 붙여넣을 위치, 복사할 개수)
예제)
package sec06.exam07_array_copy;
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.println(newStrArray[i]);
}
}
}
3. Arrays 클래스 이용 방법
향상된 for문
배열 및 컬렉션의 전체 항목 요소를 순차적으로 처리
인덱스를 이용하지 않고 바로 항목 요소를 반복
for문이 처음 실행될 때 배열에서 가져올 첫 번째 값이 존재하는지를 평가한다. 가져올 값이 존재하면 해당 값을 타입변수에 저장하고 실행문을 실행한다. 블록 내부의 실행문이 모두 실행되면 다시 루프를 돌아 배열에서 가져올 다음 값이 존재하는지 평가한다. 만약 다음 항목이 존재하면 같은 일을 반복하고, 가져올 항목이 없으면 for문이 종료된다. 따라서 for문의 반복 횟수는 배열의 항목 수가 된다.
예제)
package sec06.exam08_advanced_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);
}
}
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] 객체 지향 프로그래밍 (0) | 2021.06.18 |
---|---|
[JAVA] 열거 타입 (0) | 2021.06.17 |
[JAVA] 배열 타입(1) (0) | 2021.06.15 |
[JAVA] String 타입 (0) | 2021.06.11 |
[JAVA] 참조 변수의 ==, != 연산 /null과 NullPointerException (0) | 2021.06.11 |