1. 배열(Array) 타입
▷ 배열
▶ 연속된 공간에 값을 나열시키고, 각 값에 인덱스를 부여해 놓은 자료구조입니다.
▶ 인덱스는 대괄호 []와 함께 사용하여 각 항목의 값을 읽거나 저장하는데 사용합니다.
▷ 배열 변수 선언
▶ 두 가지 형태로 작성. 첫 번때가 관례적인 표기합니다.
▶ 배열은 힙 영역에 생성되고 배열 변수는 힙 영역의 배열 주소를 저장합니다.
▶ 참조할 배열이 없다면 배열 변수도 null로 초기화할 수 있습니다.
▷ 값 목록으로 배열 생성
▶ 배열에 저장될 값의 목록이 있다면, 다음과 같이 간단하게 배열을 생성할 수 있습니다.
▶ 배열 변수를 선언한 시점과 값 목록이 대입되는 시점이 다르다면 new 타입[]을 중괄호 앞에 붙여줍니다.
▶ 타입은 배열 변수를 선언할 때 사용한 타입과 동일하게 지정합니다.
◎ array 사용 예제
public class ArrayExample { public static void main(String[] args) { String[] season = {"Spring", "Summer", "Fall", "Winter"}; System.out.println("season[0]: " + season[0]); System.out.println("season[1]: " + season[1]); System.out.println("season[2]: " + season[2]); System.out.println("season[3]: " + season[3]); season[1] = "여름"; System.out.println("season[1]: " + season[1]); System.out.println(); 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 / 3; System.out.println("평균 : " + avg); } } // 출력 : // season[0]: Spring // season[1]: Summer // season[2]: Fall // season[3]: Winter // season[1]: 여름 // // 총합 : 270 // 평균 : 86.66666666666667
public class ArrayExample2 { public static void main(String[] args) { int[] scores; // 변수 선언시 null로 지정해도 됩니다. scores = new int[] { 83, 90, 87 }; int sum1 = 0; for(int i=0; i<3; i++) { sum1 += scores[i]; } System.out.println("총합 : " + sum1); //배열을 매개값으로 주고, 메소드를 호출할 수 있습니다. printItem(new int[] {83, 90, 97}); } public static void printItem( int[] scores ) { for(int i=0; i<3; i++) { System.out.println("scores[" + i + "]: " + scores[i]); } } } // 출력 : // 총합 : 260 // scores[0]: 83 // scores[1]: 90 // scores[2]: 97
▷ new 연산자로 배열 생성
▶ new 연산자로 값의 목록은 없지만 향후 값들을 저장할 목적으로 배열을 미리 생성합니다.
└ 즉, 배열에 있는 방의 개수를 지정합니다.
▶ new 연산자로 배열을 처음 생성하면 배열 항목은 기본값으로 초기화됩니다.
NO | 데이터 타입 | 초기값 | |
1 | 기본 타입 | byte[ ] | 0 |
2 | char[ ] | '\u0000' | |
3 | short[ ] | 0 | |
4 | int[ ] | 0 | |
5 | long[ ] | 0L | |
6 | float[ ] | 0.0F | |
7 | double[ ] | 0.0 | |
8 | boolean[ ] | false | |
9 | 참조 타입 | 클래스[ ] | null |
10 | 인터페이스[ ] | null |
◎ 초기값 예제
public class ArrayExample3 { public static void main(String[] args) { int[] arr1 = new int[3]; for(int i=0; i<3; i++) { System.out.print("arr1["+i+"] : " + arr1[i] + ", "); } System.out.println(); arr1[0] = 10; arr1[1] = 20; arr1[2] = 30; for(int i=0; i<3; i++) { System.out.print("arr1["+i+"] : " + arr1[i] + ", "); } System.out.println("\n"); double[] arr2 = new double[3]; for(int i=0; i<3; i++) { System.out.print("arr2["+i+"] : " + arr2[i] + ", "); } System.out.println(); arr2[0] = 0.1; arr2[1] = 0.2; arr2[2] = 0.3; for(int i=0; i<3; i++) { System.out.print("arr2["+i+"] : " + arr2[i] + ", "); } System.out.println("\n"); String[] arr3 = new String[3]; for(int i=0; i<3; i++) { System.out.print("arr3["+i+"] : " + arr3[i] + ", "); } System.out.println(); arr3[0] = "1월"; arr3[1] = "2월"; arr3[2] = "3월"; for(int i=0; i<3; i++) { System.out.print("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 필드는 읽기만 가능하므로 값을 변경할 수는 없습니다.
▶ 배열 길이는 for문을 사용해서 전체 배열 항목을 반복할 때 많이 사용합니다.
2. 다차원 배열
▷ 배열 항목에는 또 다른 배열이 대입된 배열입니다.
▷ 값 목록으로 다차원 배열 생성시 배열 변수 선언시 타입 뒤에 대괄호 []를 차원의 수만큼 붙이고, 값 목록도 마찬가지로 차원의 수만큼 중괄호를 중첩합니다.
public class MultiArrayExample4 { public static void main(String[] args) { int[][] scores = { // 2차원 배열 scores [2]행[3]열 = 6 데이터를 입력 {80, 90, 96}, {76, 88} }; System.out.println("1차원 배열 길이(반의 수): " + scores.length); System.out.println("2차원 배열 길이(첫 번째 반의 학생 수): " + scores[0].length); System.out.println("2차원 배열 길이(두 번째 반의 학생 수): " + scores[1].length); // 첫 번째 반의 세 번째 학생의 점수 읽기 System.out.println("scores[0][2]: " + scores[0][2]); // 두 번째 반의 두 번째 학생의 점수 읽기 System.out.println("scores[1][1]: " + scores[1][1]); // 첫 번째 반의 평균 점수 구하기 int class1Sum = 0; for(int i=0; i<scores[0].length; i++) { class1Sum += scores[0][i]; } double class1Avg = (double) class1Sum / scores[0].length; System.out.println("첫 번째 반의 점수 합계: " + class1Sum); System.out.println("첫 번째 반의 평균 점수: " + class1Avg); // 두 번째 반의 평균 점수 구하기 int class2Sum = 0; for(int i=0; i<scores[1].length; i++) { class2Sum += scores[1][i]; } double class2Avg = (double) class2Sum / scores[1].length; System.out.println("두 번째 반의 점수 합계: " + class2Sum); System.out.println("두 번째 반의 평균 점수: " + class2Avg); // 전체 학생의 평균 점수 구하기 int totalStudent = 0; int totalSum = 0; for(int i=0; i<scores.length; i++) { totalStudent += scores[i].length; for(int k=0; k < scores[i].length; k++) { totalSum += scores[i][k]; } } double totalAvg = (double) totalSum/totalStudent; System.out.println("전체 학생의 평균 점수: " + totalAvg); } } // 출력 : // 1차원 배열 길이(반의 수): 2 // 2차원 배열 길이(첫 번째 반의 학생 수): 3 // 2차원 배열 길이(두 번째 반의 학생 수): 2 // scores[0][2]: 96 // scores[1][1]: 88 // 첫 번째 반의 점수 합계: 266 // 첫 번째 반의 평균 점수: 88.66666666666667 // 두 번째 반의 점수 합계: 164 // 두 번째 반의 평균 점수: 82.0 // 전체 학생의 평균 점수: 86.0
▷ new 연산자로 다차원 배열을 생성하려면 배열 변수 선언 시 타입 뒤에 대괄호 [ ]를 차원의 수만큼 붙이고, new 타입 뒤에도 차원의 수만큼 대괄호 [ ]를 작성합니다.
public class MultiArrayExample5 { 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(); mathScores[0][0] = 80; mathScores[0][1] = 83; mathScores[0][2] = 85; mathScores[1][0] = 86; mathScores[1][1] = 90; mathScores[1][2] = 92; int totalStudent = 0; int totalMathSum = 0; for(int i=0; i<mathScores.length; i++) { totalStudent += mathScores[i].length; for(int k=0; k<mathScores[i].length; k++) { totalMathSum += mathScores[i][k]; } } double totalMathAvg = (double) totalMathSum / totalStudent; System.out.println("전체 학생의 수학 전체 점수: " + totalMathSum); System.out.println("전체 학생의 수학 평균 점수: " + totalMathAvg); System.out.println(); } }
3. 객체를 참조하는 배열
▷ 기본 타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 값을 직접 저장합니다.
▷ 참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 저장합니다.
public class ArrayEx01 { public static void main(String[] args) { String[] languages = new String[3]; languages[0] = "Java"; languages[1] = "Java"; languages[2] = new String("Java"); System.out.println(languages[0] == languages[1]); System.out.println(languages[0] == languages[2]); System.out.println(languages[0].equals(languages[2])); } } // 출력 : // true : 같은 객체를 참조 // false : 다른 객체를 참조 // true : 문자열이 동일
4. 배열 복사
▷ 배열은 한 번 생성하면 길이를 변경할 수 없습니다.
더 많은 저장 공간이 필요하다면 더 큰 길이의 배열을 새로 만들고 이전 배열로부터 항목들을 복사해야 합니다.
public class ArrayEx03 { public static void main(String[] args) { String[] oldArr = { "java", "array", "copy" }; String[] newArr = new String[5]; String[] newArr1 = new String[5]; String[] newArr2 = new String[5]; System.arraycopy(oldArr, 0, newArr, 0, oldArr.length); System.arraycopy(oldArr, 1, newArr1, 1, oldArr.length-1); System.arraycopy(oldArr, 0, newArr2, 2, oldArr.length-1); for(int i=0; i<newArr.length; i++) { System.out.print(newArr[i] + " "); } System.out.println(); for(int i=0; i<newArr.length; i++) { System.out.print(newArr1[i] + " "); } System.out.println(); for(int i=0; i<newArr.length; i++) { System.out.print(newArr2[i] + " "); } System.out.println(); for(String a: newArr) { System.out.print(a + " "); } } } // 출력 : // java array copy null null // null array copy null null // null null java array null // java array copy null null
5. 배열 항목 반복을 위한 for문
▷ 카운터 변수와 증감식을 사용하지 않고, 항목의 개수만큼 반복한 후 자동으로 for문을 빠져나갑니다.
▷ for문이 실행되면 배열에서 가져올 항목이 있을 경우 변수에 항목을 저장하고 실행문을 실행합니다.
▷ 다시 반복해서 배열에서 가져올 다음 항목이 존재하면 변수 → 실행문 → 배열로 진행합니다.
▷ 가져올 다음 항목이 없으면 for문을 종료합니다.
public class ArrayEx04 { public static void main(String[] args) { int[] scores = { 95, 71, 84, 93, 87 }; int sum = 0; // for(int i=0; i<scores.length; i++) { // sum += scores[i]; // } for(int score : scores) { sum += score; } System.out.println("점수 총합 = " + sum); double avg = (double)sum / scores.length; System.out.println("점수 평균 = " + avg); } }
6. main() 메소드의 String[] args 매개변수의 용도(필요성)
▷ 자바 프로그램을 실행하기 위해 main() 메소드를 작성하면서 문자열 배열 형태인 String[] args 매개변수가 필요합니다.
▷ 프로그램 실행 시 입력 값이 부족하면 길이가 0인 String 배열 참조합니다.
public class MainStringEx { 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); } } // 출력 : // 프로그램 입력 값이 부족
여기서 Run Configurations로 들어가 지정한 class 이름을 찾습니다.
그 후 Arguments에 Program arguments에 값을 넣으면 출력 값이 바뀌게 됩니다. (10 + 20 = 30)
7. 열거(Enum) 타입
▷ 요일, 계절처럼 한정된 값을 갖는 타입입니다.
▷ 먼저 열거 타입 이름으로 소스 파일(.java)을 생성하고 한정된 값을 코드로 정의합니다.
▷ 열거 타입 이름은 첫 문자를 대문자로 하고 캐멀 스타일로 지어주는 것이 관례입니다.
public enum Week { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
import java.util.Calendar; public class WeekExample { public static void main(String[] args) { Week today = null; Calendar cal = Calendar.getInstance(); int week = cal.get(Calendar.DAY_OF_WEEK); switch(week) { case 1: today = Week.SUNDAY; break; case 2: today = Week.MONDAY; break; case 3: today = Week.TUESDAY; break; case 4: today = Week.WEDNESDAY; break; case 5: today = Week.THURSDAY; break; case 6: today = Week.FRIDAY; break; case 7: today = Week.SATURDAY; break; } if(today == Week.SUNDAY) { System.out.println("일요일에는 축구를 합니다."); } else { System.out.println("열심히 자바를 공부합니다."); } } } // 출력 : // 열심히 자바를 공부합니다.
이렇게 배열에 대해 다시 공부해보았습니다.
한 번 더 하니까 좀 더 익숙해지는 것 같아요!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 클래스를 이용한 문제 풀이 (0) | 2023.01.10 |
---|---|
[java] 이것이 자바다 ch05 확인 문제(array) (0) | 2023.01.10 |
[java] 배열을 이용한 추가 연습문제3(array) (1) | 2023.01.10 |
[java] 배열을 이용한 추가 연습문제2(array) (0) | 2023.01.09 |
[java] 배열을 이용한 추가 연습문제1(array) (4) | 2023.01.09 |