package array_statement;
public class Ex1 {
public static void main(String[] args) {
/*
* 배열(Array)
*
* < 배열 선언 기본 문법 >
* 데이터타입[] 변수명;
* 데이터타입 변수명[];
* => 배열 선언만 했을 경우 데이터 저장 불가!(메모리에 실제 배열 공간이 생성되기 전이므로)
* => 배열이 생성된 주소값을 저장하는 변수 선언(힙 영역 주소값을 저장하는 변수)
*
* < 배열 생성 기본 문법 >
* 변수명 = new 데이터타입[배열크기];
* => 메모리(Heap)에 실제 데이터 저장이 가능하도록 공간을 할당 받음
* => 생성된 Heap 공간의 메모리 주소값을 해당 변수에 저장
* (앞으로 해당 변수에 저장된 주소값을 참조하여 배열에 접근)
*
* < 배열 선언 및 생성을 동시에 수행하는 문법 >
* 데이터타입[] 변수명 = new 데이터타입[배열크기];
*
* < 배열 접근 기본 문법 >
* 변수명[인덱스]
* => 해당 변수에 저장된 주소값(배열)에 접근하여 지정한 인덱스 위치의 데이터에 접근
*
* < 배열 초기화(저장) 기본 문법 >
* 변수명[인덱스] = 데이터;
*
* < 배열 선언, 생성, 초기화를 동시에 수행하는 문법 >
* 데이터타입[] 변수명 = {데이터1, 데이터2, .... 데이터n };
* => 배열 크기를 지정하지 않아도 데이터 갯수만큼의 배열이 자동으로 생성됨
* (단, 배열 내의 데이터가 모두 준비된 경우에만 가능한 문법)
*
* < 배열 크기 조회 >
* 배열명.length 속성 사용하여 크기 전달받을 수 있음
* => 출력문에 배열명.length 전달 또는 변수에 배열명.length 저장
*
*/
// 학생 5명의 점수를 저장하는 변수 사용 시
int score1 = 80, score2 = 60, score3 = 70, score4 = 100, score5 = 10;
// 합계를 구하려면
int sum = 0;
sum += score1;
sum += score2;
// ... 생략 ...
sum += score5;
// => 대량의 데이터를 일반 변수로 관리하기엔 부적합하다!
// 따라서, 배열을 통해 여러개의 데이터를 하나의 묶음으로 관리!
//int형 정수 3개를 저장하기 위한 배열 변수 arr을 선언
// 배열 선언 : 데이터타입[] 변수명;
int[] arr; // int형 정수 저장을 위한 배열 공간의 이름을 arr로 선언
// arr = 5; // 오류 발생!
// => 주의! 아직 정수를 저정할 수 있는 메모리 공간 생성 전이므로 배열에 데이터 저장은 불가능!
// 배열 생성 : 변수명 = new 데이터타입[배열크기];
arr = new int[3];
// => 실제 데이터 저장이 가능한 메모리 공간 3개가 연속적으로 생성됨
// => 이 때, 배열이 생성되면 자동으로 배열 내부 공간의 데이터가 기본값으로 초기화 됨!
System.out.println("배열 arr에 저장된 값 : " + arr);
// => 실제 배열 데이터가 아닌 배열이 위치한 주소값을 출력
// 배열의 각 인덱스에 접근하여 저장된 데이터 출력
System.out.println("배열 arr의 0번 인덱스 : " + arr[0]);
System.out.println("배열 arr의 1번 인덱스 : " + arr[1]);
System.out.println("배열 arr의 2번 인덱스 : " + arr[2]);
// => 각 타입의 기본값으로 자동 초기화가 이루어짐!
// System.out.println("배열 arr의 3번 인덱스 : " + arr[3]); // 오류 발생!
// => 0 ~ 2번까지의 인덱스만 존재하므로, 존재하지 않는 인덱스를 접근하려 할 경우
// ArrayIndexOutOfBoundsException 예외 발생!
// => Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
// at array_statement.Ex1.main(Ex1.java:66)
// => 3이라는 인덱스가 잘못됐다는 메세지이며, 66번 라인이 원인.
// 주의사항!
int[] a1, b1; // a1과 b1 모두 배열 타입 변수로 선언되지만
int a2, b2[]; // a2는 기본형 변수, b2만 배열 타입 변수로 선언됨
a1 = new int[3];
b1 = new int[3];
// a2 = new int[3]; // 오류 발생! int 타입 변수에 배열 타입 형변환 불가!
b2 = new int[3];
// 배열 arr의 0번 인덱스에 정수 10을 저장
arr[0] = 10;
// 1번 인덱스에 20, 2번 인덱스에 30 저장한 후 출력
arr[1] = 20;
arr[2] = 30;
System.out.println("배열 arr의 0번 인덱스 : " + arr[0]);
System.out.println("배열 arr의 1번 인덱스 : " + arr[1]);
System.out.println("배열 arr의 2번 인덱스 : " + arr[2]);
arr[2] = 100;
System.out.println("배열 arr의 2번 인덱스 : " + arr[2]);
System.out.println("===========================================");
// 배열 선언, 생성, 초기화를 한꺼번에 수행
// => 리터럴을 사용하여 배열을 직접 생성하는 문법 사용
// 데이터타입[] 변수명 = {값1, 값2, 값3, .... 값n};
// => n개 만큼의 배열이 자동으로 생성되며 0 ~ n -1 까지 인덱스 부여
// int형 배열(nums) 5개 생성하면서 1, 2, 3, 4, 5로 초기화
int[] nums = {1, 2, 3, 4, 5}; // 0 ~ 4번 인덱스까지 자동 부여됨
System.out.println("배열 nums의 0번 인덱스 : " + nums[0]);
System.out.println("배열 nums의 1번 인덱스 : " + nums[1]);
System.out.println("배열 nums의 2번 인덱스 : " + nums[2]);
System.out.println("배열 nums의 3번 인덱스 : " + nums[3]);
System.out.println("배열 nums의 4번 인덱스 : " + nums[4]);
// 이미 생성된 배열을 버리고 새로 생성된 배열을 변수에 할당하는 경우
// nums = {10, 20, 30, 40, 50}; // 문법에 맞지 않음!
nums = new int[] {10, 20, 30, 40, 50, 60};
// => 주의! int[] 내부에 배열크기를 지정하지 않도록 한다!
System.out.println("배열 nums의 0번 인덱스 : " + nums[0]);
System.out.println("배열 nums의 1번 인덱스 : " + nums[1]);
System.out.println("배열 nums의 2번 인덱스 : " + nums[2]);
System.out.println("배열 nums의 3번 인덱스 : " + nums[3]);
System.out.println("배열 nums의 4번 인덱스 : " + nums[4]);
// 학생 3명의 이름을 배열로 갖는 names 배열 생성
// => "홍길동", "이순신", "강감찬"으로 초기화
// String[] names = new String[3];
String[] names = {"홍길동", "이순신", "강감찬"};
System.out.println("배열 names의 0번 인덱스 : " + names[0]);
System.out.println("배열 names의 1번 인덱스 : " + names[1]);
System.out.println("배열 names의 2번 인덱스 : " + names[2]);
System.out.println("=====================================");
// 인덱스 번호를 변수로 활용하여 배열 내의 모든 데이터에 접근
int index = 0;
System.out.println("배열 names의 0번 인덱스 : " + names[index]);
index++;
System.out.println("배열 names의 1번 인덱스 : " + names[index]);
index++;
System.out.println("배열 names의 2번 인덱스 : " + names[index]);
// 반복문을 사용하여 배열 내의 모든 데이터에 접근
// names 배열의 모든 이름 출력
for (int i = 0; i < 3; i++) {
// System.out.println(names[i]);
System.out.println("배열 names의 " + i + "번 인덱스 : " + names[i]);
}
for (int i = 0; i < 6; i++) {
System.out.println("배열 nums의 " + i + "번 인덱스 : " + nums[i]);
}
System.out.println("======================================");
// 각 배열의 크기 : 배열명.length 속성 사용
System.out.println("배열 names의 크기(길이) : " + names.length);
System.out.println("배열 nums의 크기(길이) : " + nums.length);
// 반복문을 사용하여 배열 내의 모든 데이터에 접근
// => 단, 조건식에 배열 크기를 직접 지정하지 않고
// 배열명.length 속성을 사용하여 동적으로 변경될 수 있도록 지정
// 1) names 배열의 모든 이름 출력
for (int i = 0; i < names.length; i++) {
System.out.println("배열 names의 " + i + "번 인덱스 : " + names[i]);
}
// 2) nums 배열의 모든 정수 출력
for (int i = 0; i < nums.length; i++) {
System.out.println("배열 nums의 " + i + "번 인덱스 : " + nums[i]);
}
}
}