Java 코드연습

[뉴렉처] 가변 길이 배열 구현하기

양상추상츄 2021. 10. 19. 19:11

https://www.youtube.com/watch?v=07-GGuIveCg&list=PLq8wAnVUcTFWQ4TpRPZRa5nj1VwfyO7st&index=13 

강의 핵심

package Exam_1;

public class ExamList {

	public int current;
	public Exam[] exams;

}
package Exam_1;

public class Exam {
	int kor;
	int eng;
	int math;
}
package Exam_1;

import java.util.Scanner;

public class Exam_1 {

	public static void main(String[] args) {
		ExamList list = new ExamList();
		list.exams = new Exam[3];
		list.current = 0;
		
		int menu;
		boolean keepLoop = true;
		
		while(keepLoop) {
			
			menu = inputMenu();
			
			switch(menu) {
			case 1:
				inputList(list);
				break;
			case 2:
				printList(list);
				break;
			case 3:
				System.out.println("bye~");
				
				keepLoop = false;
				break;
			default:
				System.out.println("잘못된 값을 입력하셨습니다.");
			}
		}
	}

	private static int inputMenu() {
		Scanner scan = new Scanner(System.in);
		int num;
		
		System.out.println("--------------------");
		System.out.println("메인메뉴");
		System.out.println("메뉴를 선택해주세요");
		System.out.println("\t1. 성적입력");
		System.out.println("\t2. 성적출력");
		System.out.println("\t3. 나가기");
		System.out.print("\t>>>");
		
		num = scan.nextInt();
		if(num<1||3<num) {
			System.out.println("1~3의 숫자만 입력해주세요");
		}
		return num;
	}

	private static void inputList(ExamList list) {
		Scanner scan = new Scanner(System.in);
		System.out.println("--------------------");
		System.out.println("성적입력");
		
		int kor, eng, math;
		
		do {
			System.out.print("국어 : ");
			kor = scan.nextInt();
			
			if(kor<0||100<kor) {
				System.out.print("국어성적은 0~100까지 범위만 입력해주세요");
			}
		}while(kor<0||100<kor);
		
		do {
			System.out.print("영어 : ");
			eng = scan.nextInt();
			
			if(eng<0||100<eng) {
				System.out.println("영어성적은 0~100까지 범위만 입력해주세요");
			}
		}while(eng<0||100<eng);
		
		do {
			System.out.print("수학 : ");
			math = scan.nextInt();
			
			if(math<0||100<math) {
				System.out.println("수학성적은 0~100까지 범위만 입력해주세요");
			}
		}while(math<0||100<math);
		
		Exam exam = new Exam();
		exam.kor = kor;
		exam.eng = eng;
		exam.math = math;
		
		Exam[] exams = list.exams;
		int size = list.current;
		
		if(exams.length == size) {
			//1. 크기가 5개정도 더 큰 새로운 배열 생성
			Exam[] temp = new Exam[size+5];
			//2. 값을 이주시키기
			for(int i=0; i<size; i++) {
				temp[i] = exams[i];
			//3. list.exams가 새로만든 temp 배열을 참조하도록함
			//exams = temp 하고는 다름 이거는 틀림
			list.exams = temp;	
			}
		}
		// 이부분이 좀 이해가 안되지만 값이 여기서 들어간듯함
		list.exams[list.current] = exam;
		list.current++;
	}
	
	private static void printList(ExamList list) {
		System.out.println("---------------------");
		System.out.println("성적출력");
		
		int size = list.current;
		Exam[] exams = list.exams;
		
		for(int i=0; i<size; i++) {
			Exam exam = exams[i];
			int kor = exam.kor;
			int eng = exam.eng;
			int math = exam.math;
			
			int total = kor+eng+math;
			float avg = total / 3.0f;
			
			System.out.printf("국어%d : %d\n", i+1, kor);
			System.out.printf("영어%d : %d\n", i+1, eng);
			System.out.printf("수학%d : %d\n", i+1, math);
			
			System.out.printf("총점 : %3d\n", total);
			System.out.printf("평균 : %6.2f\n", avg);
			System.out.println("----------------------");
		}
		
	}

}

list.exams[list.current] = exam;

-> 이부분이 좀 이해가 안되지만 다시 처음부터 강의랑 똑같이 작성하니까 작동이 정상적으로 되었다.