배열의 크기를 미리 정해놓게 되면 더 넣어야할때 문제가 발생 할 수 있다.
결혼식 예시장 하객의 수를 정확하게 미리 알 수 없는것 처럼
"배열은 고정된 크기를 같는 애인데 늘리려면 더 큰 배열을 만들어서 옮기고 원래거는 소거시켜야 하는구나"
아래는 위의 과정을 실현하기 위해 준비하는 과정이다.
정수형은 값변수여서 참조할 수가 없다
->함수 단위에서 공유해야 할 데이터라면 큰 단위의 구조체로 묶어서 공유
일단 하긴했는데 뭔가 누더기가 된 느낌 ..
package Exam;
public class Exam {
int kor;
int eng;
int math;
}
package Exam;
public class ExamList {
//공유할 배열과 정수변수 입력
Exam[] exams;
int current;
}
package Exam;
import java.util.Scanner;
public class ExamProgram {
static Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
ExamList list = new ExamList();
list.exams = new Exam[3];
// ExamList의 exam 배열에 3칸의 배열을 만듬 Exam 클래스하고는 상관없음
list.current = 0;
//메뉴
int menu = 0; // 1.INPUT 2.PRINT 3.EXIT
final int MENU_INPUT = 1; // 상수
final int MENU_PRINT = 2; // 상수
final int MENU_EXIT = 3; // 상수
boolean loop = true;
//메뉴
while(loop){
System.out.println("\t1.성적입력");
System.out.println("\t2.성적출력");
System.out.println("\t3.종료");
System.out.print("\t>>>");
menu = scan.nextInt();
switch(menu) {
case MENU_INPUT://1
input(list); // list을 매개변수로 받음
case MENU_PRINT://2
print(list);// list배열을 매개변수로 받음
case MENU_EXIT://3
//EXIT
System.out.println("good bye~");
break;
default:
System.out.println("입력오류 : 1에서 3까지만 입력 할 수 있습니다.");
}
break;
}
}
private static void print(ExamList list) { // ExamList를 가져온다고 표시해야함
// int size = list.current; // 입력이 끝나면 current 개수 생성됨
for(int i=0; i<3; i++) {
int total;
float avg;
//list.exams에 있는 값 불러오기
Exam[] exams = list.exams;
Exam exam = exams[i];
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
total = kor + eng + math;
avg = total / 3.0f;
System.out.println("------------------------------------");
System.out.println("@@@@@@@@@@@@@성적출력@@@@@@@@@@@@@@@@");
System.out.printf("\t국어%d: %3d\n",i+1 ,kor);// \t 탭, %3d 3칸 정렬, \n 한칸내리기
System.out.printf("\t영어%d: %3d\n",i+1 ,eng);
System.out.printf("\t수학%d: %3d\n",i+1 ,math);
System.out.printf("\t총점: %3d\n", total); // 3칸 정렬
System.out.printf("\t평균: %6.2f\n", avg); // 소수점 2자리 까지 나오고 6칸 정렬
System.out.println("------------------------------------");
}
}
private static void input(ExamList list) {
// ExamList를 가져온다고 표시해야함, 현재배열 사이즈
for(int i=0; i<3; i++) {
System.out.println("------------------------------------");
System.out.println("@@@@@@@@@@@@@성적입력@@@@@@@@@@@@@@@@");
Exam exam = new Exam();// ExamList하고 다름,Exam 클래스 각각의 점수만 담음
int kor = exam.kor;
int eng = exam.eng;
int math = exam.math;
do{
System.out.printf("국어%d : ",i+1);
kor=scan.nextInt();//점수입력
if(kor<0||100<kor) {
System.out.println("성적범위를 벗어났습니다.");
}
}while(kor<0||100<kor); // 점수 범위를 벗어날 경우 false, 위의 내용 다시 반복
exam.kor = kor;
do{
System.out.printf("영어%d : ",i+1);
eng=scan.nextInt();//점수입력
if(eng<0||100<eng) {
System.out.println("성적범위를 벗어났습니다.");
}
}while(eng<0||100<eng); // 점수 범위를 벗어날 경우 false, 위의 내용 다시 반복
exam.eng = eng;
do{
System.out.printf("수학%d : ",i+1);
math=scan.nextInt();//점수입력
if(math<0||100<math) {
System.out.println("성적범위를 벗어났습니다.");
}
}while(math<0||100<math); // 점수 범위를 벗어날 경우 false, 위의 내용 다시 반복
exam.math = math;
// int size = list.current;
list.exams[i] = exam; // 입력이 끝나면 각점수가 list.exams로 들어감
// //size++;
//
// //공간이 부족할 경우
// Exam[] exams = list.exams;
//
// if(exams.length == size) { // exams전체 크기와 current와 같다면 입력이 가득참
// // 1. 크기가 5개정도 더 큰 배열 생성
// Exam[] temp = new Exam[size+5];
// // 2. 값을 이주시키기
// for(int j=0; j<size; j++) {
// temp[j] = exams[j];
// list.exams = temp;
// }
// }
}
}
}
몇몇 주석된 부분은 그 다음강의인 가변길이 배열 구현에 실패한 흔적들임 ;;
'Java 코드연습' 카테고리의 다른 글
[뉴렉처] 함수 오버로딩(overloading) (0) | 2021.10.19 |
---|---|
[뉴렉처] 가변 길이 배열 구현하기 (0) | 2021.10.19 |
[뉴렉처] 구조체 배열 이용하기 (0) | 2021.10.18 |
[뉴렉처] 구조체를 이용한 코드 작성하기 (0) | 2021.10.18 |
[뉴렉처] 함수의 매개변수 (0) | 2021.10.18 |