package Reference_type05;

import java.util.Arrays;

public class ReferenceType01 {

    public static void main(String[] args) {
        // 2023-07-24 참조타입, 배열

        // 참조타입 : 스택에 올라간 참조변수가 힙 영역에 올라간 객체를 가리킨다.(참조)
        String name = "devnabi";
        String name2 = "devnabi";
        System.out.println(name == name2);

        // 기본타입 : 스택에 바로 값이 저장되고 힙 영역에는 올라가지 않는다.
        char c = 'A';
        char c2 = 'A';
        System.out.println(c == c2);

        // 배열 : 여러개의 데이터를 저장하기 위해 만들어진 자료구조다.
        // 배열을 매개변수로 줄 수 있다.
        String strNull = null; // null을 허용할 수 있는 이유 : 힙 영역에 들어갈 수 있는 참조타입이기때문이다.

        // 30명의 점수
        // 1. 배열길이 선언
        int[] scores = new int[30];

        // 2. 반복문 만들기 : 배열에 랜덤값을 각각 넣는 반복문
        for(int i = 0; i < scores.length; i++){
            // i = 0, 1, 2....29
            scores[i] = (int) (Math.random() * 100 + 1);
        }

        // 3. 학생들의 점수 조회
        for(int i = 0; i < scores.length; i++){
            System.out.println("점수 = " + scores[i]);
        }

        // 4. 학생들의 평균 구하기
        double sum = 0.0;
        for(int i = 0; i < scores.length; i++){
            sum += scores[i];
        }
        double avg = sum / scores.length;
        System.out.println("학생들의 평균 = " + avg);

        // 5. 학생들 중 몇번째 학생이 1등인지, 1등 학생의 점수는 몇인지 구하기
        int max = 0;
        for(int i = 1; i < scores.length; i++){
            if(scores[max] < scores[i]){
                max = i; // 점수들을 순회하면서 max값보다 크다면 max에 대입하라는 것이다.
            }
        }
        System.out.println("1등 학생은 " + (max + 1) +" 번째 학생입니다.");
        System.out.println("1등인 학생의 점수 : " + scores[max]);

        // 5번 반복문을 그냥 함수써서 1등이 몇점인지만 알았다...ㅠ
        // for(int i = 0; i < scores.length; i++){
        //    Arrays.sort(scores);
        // }
        // System.out.println("1등인 학생의 점수 : " + scores[29]);
    } // main의 끝
}

package Reference_type05;

import java.util.Scanner;

public class ReferenceType02 {

    public static void main(String[] args) {
        // 2023-07-24 다차원 배열

        // 다차원 배열 : 배열이 2개 이상있는 배열
        int[][] mathScores = new int[2][3]; // 6번

        Scanner sc = new Scanner(System.in);

        // mathScores 다차원 배열을 전체 조회하는 반복문
        for(int i = 0; i < mathScores.length; i++){
            for(int j = 0; j < mathScores[0].length; j++){
                System.out.println((3*i + j+1) + "번째 학생의 수학 점수 : " + mathScores[i][j]);
                mathScores[i][j] = sc.nextInt(); // 사용자에게 입력을 받기
            }
        }

        // 메모리적인 차이 이해하기
        String[] strArr = new String[3];
        strArr[0] = "Java";
        strArr[1] = "Java";
        strArr[2] = new String("Java");

        // 배열 복사
        int[] oldIntArr = {1, 2, 3};
        int[] newIntArr = new int[5];

        // old를 new에 복사
        for(int i = 0; i < oldIntArr.length; i++){
            newIntArr[i] = oldIntArr[i];
            System.out.println("복사된 배열 : " + newIntArr[i]);
        }

        // 기존 for문
        int[] scores2 = {100, 50, 70, 80, 90};

        for(int i = 0; i < scores2.length; i++){
            System.out.println("기존 for문 : " + scores2[i]);
        }

        // 향상된 for문 : ( 변수 만들기 : 배열이름 ) / 루프 카운터 변수와 중감식은 사용하지 않는다.
        for(int scoresArr : scores2){
            System.out.println("향상된 for문 : " + scoresArr);
        }
    } // main의 끝
}

package Reference_type05;

public class EnumExecute {

    public static void main(String[] args) {
        // 2023-07-24 Enum 사용

        // 선언
        Season season1;
        Season season2;

        // 출력
        System.out.println(Season.SPRING);

    }
}

package Reference_type05;

public enum Season {
    // 2023-07-24 Enum : 열거타입 만들기

    SPRING,
    SUMMER,
    FALL,
    WINTER
}