package javajungsuk5;

public class Ch05_1a3 {

	public static void main(String[] args) {
		// 5-1 ~ 5-3 배열의 생성과 선언, 배열의 인덱스
		
		// 배열 선언 : 배열을 다루기 위한 참조변수의 선언
		// 타입[] 변수이름; >> 배열 선언(참조변수)
		// 변수이름 new 타입[길이]; >> 배열을 생성(실제 저장공간을 생성)
		
		int[] score; // 1. 배열의 선언 (참조변수)

		score = new int[5]; // 2. 배열의 생성 / int 저장공간 인덱스 0~4까지 5개 생성
		// int[] score = new int[5]; / 배열의 선언과 생성을 동시에 할 수 있다.

		score[3] = 100; // 4번째의 저장공간에 100을 저장한 것
		
		System.out.println("score[0] = "+ score[0]);
		System.out.println("score[1] = " + score[1]);
		System.out.println("score[2] = " + score[2]);
		System.out.println("score[3] = " + score[3]);
		System.out.println("score[4] = " + score[4]);
		
		int ang = score[3];
		System.out.println("ang = " + ang);
	}

}

package javajungsuk5;

import java.util.Arrays;

public class Ch05_4a5 {

	public static void main(String[] args) {
		// 5-4 ~ 5-5 배열의 길이, 배열의 초기화
		
		// 배열의 길이 : 배열이름.length
		// 배열은 한 번 생성하면 길이를 바꿀 수 없다. / 1. 왜? , 2. 부족할 땐 어떻게?
		// 1. 메모리를 저장했고 공간이 더 필요한데 그 다음 공간들이 비어있다는 보장이 없다.
		// 2. 더 큰 배열을 생성하여 기존에 저장했던 것을 복사하고 저장한다.
		
		int[] arr = new int[10]; // 길이가 5인 배열
		System.out.println(arr.length); // index 범위 : 0~9 / 10개
		
		for(int i = 0; i < arr.length; i++) {
			System.out.println("arr["+ i + "] = " +arr[i]); // 요소를 출력
		}
		
		// 배열의 초기화 : 각 요소에 값을 정하기 전은 자동 초기화 값인 0으로 되어있다.
		int[] num = new int[3];
//		System.out.println(num[0]);
//		System.out.println(num[1]);
		
		// 10씩 증가하는 값
		for(int j = 0; j < num.length; j++) {
			num[j] = j * 10 + 10;
		} // for의 끝
		
		System.out.println(num[0]);
		System.out.println(num[1]);
		System.out.println(num[2]);
		
		int[] score = {33, 44, 55}; // int[] score = new int[]{33, 44, 55};와 같다. new int[]는 생략이 가능하다.
		System.out.println(Arrays.toString(score));
		System.out.println("1%의 확률로 선언과 초기화를 나눠야할 때, 에러가 발생하지 않도록 나눠서 해야한다.");
	}

}

package javajungsuk5;

import java.util.Arrays; // 엥? 자동으로 추가가 됐었네... Arrays를 사용하려면 import가 필요하다.

public class Ch05_6a7 {

	public static void main(String[] args) {
		// 5-6 ~ 5-7 배열의 출력
		
		int[] num = {10, 20, 30, 40, 50}; // 길이가 5인 int배열
		char[] charr = {'A', 'B', 'C', 'D'}; // 길이가 4인 char배열
		
		System.out.println(num); // [I@2a139a55 >> [ 은 배열을 의미, I는 int, @는 위치(주소)를 의미한다.
		System.out.println(charr); // ABCD가 출력된다.
		System.out.println("배열의 이름을 출력하는 것으로는 num의 값들을 출력할 수 없다."); // 예외 : char >> 저장된 문자를 출력가능
		
		for(int i = 0; i < num.length; i++) {
			System.out.println(num[i]); // num의 값을 순서대로 하나씩 출력
		} // for의 끝
		
		// 더 편한 방법 : Arrays.toString()
		System.out.println(Arrays.toString(num)); // 배열의 모든 요소를 한번에 출력
	}

}

package javajungsuk5;

public class Ch05_8a9 {

	public static void main(String[] args) {
		// 5-8 ~ 5-9 배열의 활용(1): 총합과 평균, (2): 최댓값과 최솟값
		
		int[] score = {100, 90, 88, 100, 100};
		
		int sum = 0; // 총점을 저장하기 위한 변수
		
		for(int i = 0; i < score.length; i++) {
			sum += score[i];
		} // for의 끝
		
		// 1. 평균값 구하기
		System.out.println(sum); // 총점을 출력
		System.out.println(sum / score.length); // int / int = 정수가 나오기 때문에 틀린 출력
		System.out.println(sum / (float) score.length); // 형변환을 해주어 평균값을 제대로 출력
		
		// 2. 예제 참고
	}

}

package javajungsuk5_10;

import java.util.Arrays;

public class Ch05_10a11 {

	public static void main(String[] args) {
		// 5-10 ~ 5-11 배열의 활용(3): 섞기, (4): 로또번호 만들기
		
		int[] num = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
		System.out.println(Arrays.toString(num));
		
		// 배열의 길이만큼 반복
		for(int i = 0; i < num.length; i++) {
			int n = (int)(Math.random() *10); // num처럼 0 ~ 9
			int tmp = num[0]; // 0을 i로 바꾸면 반복하며 인덱스의 자리 순서대로 임의의 값과 서로 값을 바꾼다. / 처음에는 0과 임의의 숫자
			num[0] = num[n];
			num[n] = tmp;
		}// for의 끝
		System.out.println(Arrays.toString(num));
	} // main의 끝

}

package javajungsuk5_10;

import java.util.Arrays;

public class Ch05_12a13 {

	public static void main(String[] args) {
		// 5-12 ~ 5-13 String배열
		
		// String은 기본형이 아닌 참조형이기 때문에 기본값이 0이 아니라 null로 저장이 된다.
		
		String[] name = new String[3];// 3개의 문자열을 저장할 수 있는 배열을 생성
		String[] ang = {"Ang!", "앙!"}; // 한번에 값을 저장
		
		// 문자열을 직접 저장
		name[0] = "Lee";
		name[1] = "Ju";
		name[2] = "hee";

		System.out.println(Arrays.toString(name));
		System.out.println(Arrays.toString(ang));
		
		String[] fruit = {"orange", "Pomegranate", "cherry"};
		
		for(int i = 0; i < 5; i++) {
			int tmp = (int)(Math.random() * 3); // 0 ~ 2
			System.out.println(fruit[tmp]); // 랜덤으로 출력
		} // for의 끝
	} // main의 끝

}

package javajungsuk5_10;

public class Ch05_14a15 {

	public static void main(String[] args) {
		// 5-14 ~ 5-15 String클래스
		
		// String 클래스 = char[] + 메서드(기능) / 서로 관련이 있어서 결합한 것
		// 내용을 변경할 수 없다.
		
		String str = "ABCDE"; // "ABCDE" = char[]
		char ch = str.charAt(2);
		System.out.println(ch ); // 문자 'C'를 출력
		
		String str2 = str.substring(1, 4); // from ~ to 범위 반환하는 매서드 / to는 포함하지 않는다.
		String str3 = str.substring(1); // to를 쓰지 않으면 문자열의 길이 끝까지 출력한다. (1, str.length())와 같다.
		System.out.println(str2);
		System.out.println(str3);
	}

}

package javajungsuk5_10;

public class Ch05_16a17 {

	public static void main(String[] args) {
		// 5-16 ~ 5-17 커맨드 라인 입력받기
		
		// 커맨드 라인으로 입력한 값이 문자열 배열에 담겨서 전달된다.
		// 커맨드 라인에서 값을 주면 프로그램 내에서 쓸수있다.
		// 아 어려웡... 이게 뭐지
		
		System.out.println("매개변수의 개수 : " + args.length);
		for(int i = 0; i < args.length; i++) {
			System.out.println("args[" + i + "] = \"" + args[i] + "\"");
		} // for의 끝
	} // main의 끝

}

package javajungsuk5_10;

public class Ch05_18a20 {

	public static void main(String[] args) {
		// 5-18 ~ 5-20 2차원 배열
		
		// 2차원 배열 : 테이블 형태의 데이터를 저장하기 위한 배열
		// 1차원 배열이 여러개면 2차원 배열 / 2차원 배열이 여러개면 3차원 배열
		
		int[][] num = new int[4][3]; // 4행 3열의 2차원 배열을 생성한다. / int * 4 * 3 >> int * 12의 공간이 생긴다.
		
		int[][] baba = {
				{1, 2, 3},
				{4, 5, 6},
				{7, 8, 9}
		}; // 2차원 배열의 생성과 초기화
		
		System.out.println(num[0][0]);
		System.out.println(baba[0][1]);
	}

}

package javajungsuk5_10;

public class Ch05_21a23 {

	public static void main(String[] args) {
		// 5-21 ~ 5-23 2차원 배열(예제)
		
		// for문 많이 쓰이기 때문에 외워야 한다.
		// 개인별 총점과 평균 구하는 Ex5_9, Ex5_10예제 참고하기 
		
		int[][] num = {
				{100, 100, 100},
				{20, 20 , 20},
				{30, 30, 30},
				{40, 40, 40}
		};
		
		int sum = 0;
		
		for(int i = 0; i < num.length; i++) {
			for(int j = 0; j < num[i].length; j++) {
				System.out.printf("num[%d][%d]=%d%n", i, j, num[i][j]);
				
				sum += num[i][j];
			}
		} // for의 끝
		System.out.println("sum=" + sum);
	} // main의 끝

}

package javajungsuk5_10;

import java.util.Arrays;

public class Ch05_24 {

	public static void main(String[] args) {
		// 5-24 Arrays로 배열 다루기
		
		// 배열의 비교와 출력 - equals(), toString()
		// 배열의 복사 - copyOf(), copyOfRange()
		// 배열의 정렬 - sort() / 오름차순
		// Math클래스 - round() : 반올림 / random() : 랜덤 
		// deepToString() : 다차원(2차원 이상)일 때 사용한다. / 배열에 깊이 들어가서 출력 
		
		System.out.println("배열이 같은지 비교할 때 '=='을 쓰지 않고 equals()를 써야한다. "); // true, false를 반환
		System.out.println("2차원 이상의 배열이면 deepEquals()를 써야한다. "); // deepToString()을 생각
		
		int[] arr = {0, 1, 2, 3, 4};
		
		int[] arr2 = Arrays.copyOf(arr, 2); // 2까지만 복사 >> [0, 1]
		int[] arr3 = Arrays.copyOfRange(arr, 2 ,4); // from ~ to / 3부터 4까지라는 뜻이고 to는 포함하지 않고 출력 >> [3]
		int[] arrall = Arrays.copyOf(arr, arr.length); // arr의 전체 복사 >> [0, 1, 2, 3, 4]
		
		System.out.println(Arrays.toString(arr2));
		System.out.println(Arrays.toString(arr3));
		System.out.println(Arrays.toString(arrall));
		System.out.println(Arrays.copyOf(arr, arr.length)); // 배열의 출력은 Arrays.toString()을 써야 한다. [I@2a139a55
		
		
		// 2차원 이상(다차원) 배열의 비교
		String[][] eq = {
				{"ang"},
				{"ANG"}
		};
		String[][] eq2 = {
				{"ang"},
				{"ANG"}
		};
		System.out.println(eq==eq2); // 참조변수 값 비교 / false
		System.out.println(Arrays.equals(eq, eq2)); //  1차원 배열일 때 사용 / false
		System.out.println(Arrays.deepEquals(eq, eq2)); // 2차원 이상(다차원) 배열의 알맞은 비교 방법 / true
		
		// 2차원 이상(다차원)의 배열일 때의 출력
		int[][] num = {
				{11, 22},
				{33, 44}
		};
		System.out.println(Arrays.deepToString(num));
		
		// 정렬하기
		int[] sor = {6, 3, 5, 2}; // [2, 3, 5, 6]
		Arrays.sort(sor);
		int[] sor2 = sor;
		System.out.println(Arrays.toString(sor2));
	} 

}