▶오늘의 주제 : 배열
▶ 배열이란?
: 배열은 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조입니다. score 배열의 각 인덱스는 각 항목의 데이터를 읽거나 저장하는데 사용되며 대괄호[]에 기입됩니다. 인덱스는 0부터 시작합니다.
1. 배열은 같은 타입의 데이터만 저장할 수 있습니다.
- int 배열은 int 값만 저장 가능하고, String 배열은 문자열만 저장합니다. 또한 선언과 동시에 저장할 수 있는 타입이 결정됩니다.
2. 한 번 생성된 배열은 길이를 늘리거나 줄일 수 없습니다.
▶배열 선언
: 배열을 사용하기 위해서는 우선 배열 변수를 선언해야 합니다.
1. 타입[] 변수;
2. 타입 변수[];
배열 변수는 참조 변수에 속합니다. 배열도 객체이므로 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 객체를 참조하게 됩니다. 만일 참조할 배열 객체가 없다면 배열 변수는 null 값으로 초기화 될 수 있습니다.
타입[] 변수 = null;
만약 배열 변수가 null 값을 가진 상태에서 변수로 값을 읽거나 저장하게 되면 NullPointer Exception이 발생합니다.
▶배열 생성
: 배열 객체를 생성하려면 값 목록을 이용하거나 new 연산자를 이용하는 방법이 있습니다.
1. 값 목록으로 배열 생성
: 값의 목록이 있다면 다음과 같이 간단하게 배열 객체를 생성할 수 있습니다.
타입[] 변수 = {값0 , 값1, 값2, 값3....}
String[] names = ["신용권", "홍길동", "감자바"};
public class Practice {
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<3; i++){
sum += scores[i];
}
System.out.println("총합: " + sum);
double avg = (double) sum / 3;
System.out.println("평균 : " + avg);
}
}
scores[0] : 83
scores[1] : 90
scores[2} : 87
총합: 260
평균 : 86.66666666666667
▶new 연산자로 배열 생성
값의 목록으로 배열 객체를 생성할 때 주의할 점이 있는데. 배열 변수를 이미 선언한 후에는 다른 실행문에서 중괄호를 사용한 배열 생성이 허용되지 않습니다.
배열 변수를 미리 선언한 후 값 목록들이 나중에 결정되는 상황이라면 다음과 같이 new 연산자를 사용해서 값 목록을 지정해주면 됩니다.
변수 = new 타입[ ] {값0, 값1, 값2, 값3...}";
String[ ] names = null;
names = new String[ ] {"신용권", "홍길동", "감자바"};
int add(int [ ] scores) {...}
int result = add( {95, 85, 90} ); // 컴파일 에러
int result = add ( new int [ ] {95, 85, 90 ) ;
▶new 연산자로 배열 생성
: 값의 목록을 가지고 있지 않지만, 향후 값들을 저장할 배열을 미리 만들고 싶다면 new 연산자로 다음과 같이 배열 객체를 생성할 수 있습니다.
타입 [ ] 변수 = new 타입 [길이];
int[] intArray = new int[5];
String[ ] names = new String[30]
public class Practice {
public static void main(String[] args) {
int[] arr1 = new int[3];
for(int i=0; i<3; i++);
for(int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
}
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
for(int i=0; i<3; i++) {
System.out.println("arr1[" + i + "] : " + arr1[i]);
}
double[] arr2 = new double[3];
for(int i=0; i<3; i++) {
System.out.println("arr2[" + i + "] : " + arr2[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];
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]);
}
}
}
arr1[0] : 0
arr1[1] : 0
arr1[2] : 0
arr1[0] : 10
arr1[1] : 20
arr1[2] : 30
arr2[0] : 0.0
arr2[1] : 0.0
arr2[2] : 0.0
arr2[0] : 0.1
arr2[1] : 0.2
arr2[2] : 0.3
arr3[0]null
arr3[1]null
arr3[2]null
arr3[0] : 1월
arr3[1] : 2월
arr3[2] : 3월
▶배열길이
: 배열의 길이란 배열에 저장할 수 있는 전체 항목의 개수를 말합니다. 코드에서 배열의 길이를 얻으려면 다음과 같이 배열 객체의 length 필드를 읽습니다. 배열의 length 필드를 읽기 위해서는 배열 변수에 도트(,)연산자를 붙이고 length 를 절어주면 됩니다.
배열 변수.length;
int [] intArray = { 10, 20, 30}
int num = intArray.length;
public class Practice {
public static void main(String[] args) {
int[] scores = {83,90,87};
int sum = 0;
for(int i=0; i<scores.length; i++) {
sum += scores[i];
}
System.out.println("총합 : " + sum);
double avg = (double)sum / scores.length;
System.out.println("평균 : " + avg);
}
}
총합 : 260
평균 : 86.66666666666667
▶명령 라인 입력
public static void main(String[] args) {...}
명령 라인에서 위 코드르 java 명령어로 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고 main() 메소드를 호출할 때 매개값으로 전달합니다.
public class Practice {
public static void main(String[] args) {
if(args.length !=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);
}
}
값의 수가 부족합니다.
▶다차원 배열
: 이와 달리 값들이 행과 열로서 구성된 배여을 2차원 이라고 합니다. 2차원 배열은 수학의 행렬을 떠올리면 되는데, 가로 인덱스와 세로 인덱스를 사용합니다. 자바는 2차원 배열 중첩 배열 방식으로 구현합니다.
int [][] scores = new int[2][3];
2 - 행
3- 열
public class Practice {
public static void main(String[] args) {
int[][] mathScores = new int[2][3];
for(int i=0; i<mathScores.length; i++) {
for(int k=0; k<mathScores[i].length; k++) {
System.out.println("mathScores["+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++) {
for (int k = 0; k < englishScores[i].length; k++) {
System.out.println("englishScores[" + i + "][" + k + "]="
+ englishScores[i][k]);
}
}
System.out.println();
int[][] javaScores = { {95,80}, {92, 96, 80}};
for(int i=0; i< javaScores.length; i++) {
for(int k=0; k< javaScores.length; k++) {
System.out.println("javaScores["+i+"]["+k+"]="
+ javaScores[i][k]);
}
}
}
}
mathScores[0][0]=0
mathScores[0][1]=0
mathScores[0][2]=0
mathScores[1][0]=0
mathScores[1][1]=0
mathScores[1][2]=0
englishScores[0][0]=0
englishScores[0][1]=0
englishScores[1][0]=0
englishScores[1][1]=0
englishScores[1][2]=0
javaScores[0][0]=95
javaScores[0][1]=80
javaScores[1][0]=92
javaScores[1][1]=96
95 80 가로 : 열 / 세로: 행
92 96 80
▶객체를 참조하는 배열
: 기본 타입배열은 각 항목에 직접 값을 갖고 있지만, 참조 타입(클래스 , 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있습니다. 예를 들어 String 은 클래스이므로 String[] 배열은 각 항목에 문자열이 아니라, String 객체의 번지를 가지고 있습니다. 즉 String[]배열은 String 객체를 참조하게 됩니다.
public class Practice {
public static void main(String[] args) {
String[] strArray = new String[3];
strArray[0] = "Java";
strArray[1] = "Java";
strArray[2] = new String("Java");
System.out.println(strArray[0] == strArray[1]);
System.out.println(strArray[0] == strArray[2]);
System.out.println(strArray[0].equals(strArray[2]));
}
}
true
false
true
strArray[0]과 strArray[1] 배열 항목을 ==연산하면 결과는 true가 나옵니다. 이유는 두 배열 객체가 동일한 String 객체를 참조하기 때문입니다. 반면에 String 객체를 new 연산자로 생성하면 무조건 새로운 String 객체가 생성되기 때문에 strArray[0]과 strArray[2] 배열 항목을 ==연산하면 결과는 false 가 나옵니다. strArray[0]과 strArray[2]는 서로 다른 객체를 참조하기 때문입니다. 하지만 문자열 비교하는 strArray[0].equals(strArray[2])는 true 값이 리턴합니다.
▶마무리
배열 : 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조입니다.
인덱스 : 배열 항목에 붙인 번호를 말합니다. 0번부터 시작하여 0~(배열길이 -1)까지 볌위를 갖습니다.
배열 선언 : 변수선언과 비슷한데, 대괄호가 추가되어 타입 [ ]변수; 형태로 선언됩니다. int[] scores는 int 배열을 선언합니다. 여기서 scoress는 배열 변수라고 부릅니다.
배열 생성: 배열을 생성하는 방법은 두 가지입니다. 하나는 {값1, 값2, 값3...}처럼 값 목록으로 생성하는 방법이고, 다른 하나는 new 타입길이로 생성하는 방법입니다.
배열 길이 : 배열에 저장될 수 있는 항복의 수를 말합니다. 배열의 length 필드의 저장되어 있기 때문에, 변수.length 로 배열 길이를 읽을 수 있습니다.
다차원 배열 : 배열 항목이 또 다른 배열을 참조 할 대 이것을 다차원 배열이라고 합니다. 다차원 배열의 선언과 생성 방법은 타입 [][] 변수 = new 타입 [길이1][길이2]입니다. 변수.length는 1차원 배열의 길이 1이되고, 변수.length는 해당 항목이 참조하는 2차원 배열의 길이2를 말합니다.
'Java' 카테고리의 다른 글
Java - 문제풀이 (0) | 2022.11.18 |
---|---|
Java - 열거 타입 (0) | 2022.11.12 |
Java - 참조 타입과 참조 변수 (0) | 2022.11.11 |
Java - 반복문: for문, while문, do-while (0) | 2022.11.10 |
Java - 조건문: if문, switch문 (0) | 2022.11.10 |