My footsteps
성적관리 캡슐화 본문
728x90



<main>
package ex08.oop.capsule;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
public class G2Program {
// static Exam[] exams = new Exam[1];
public static void main(String[] args) throws IOException {
ExamList list = new ExamList();
ExamList.initExamList(list);
//init=초기화
END: while (true) {
int menu = inputMenu();
switch (menu) {
case 1: // 성적 입력
ExamList.inputExamList(list); // list를 매개변수로 하면 ExamList에 속한 exams 객체 배열과 index 값을 저장할 수 있다.
// exams = inputExams(exams, index) 확장한 exams의 길이를 새로 참조하게 하기 위해서 exams에 확장된 exams를 참조시켜준다.
// index = exams.length;
break;
case 2: // 성적 출력
ExamList.printExamList(list);
break;
case 3: // 성적 저장
ExamList.saveExamList(list);
break;
case 4: // 성적 로드
ExamList.loadExamList(list);
break;
case 5:
System.out.print("성적관리 프로그램을 종료합니다.\n안녕~");
break END;
}
}
}
static int inputMenu() {
System.out.println("┌────────────────────────┐");
System.out.println("│ 성적관리 │");
System.out.println("└────────────────────────┘");
Scanner sc = new Scanner(System.in);
System.out.println("번호를 입력해 주세요");
System.out.println("1. 성적 입력");
System.out.println("2. 성적 출력");
System.out.println("3. 성적 저장");
System.out.println("4. 성적 로드");
System.out.println("5. 종료");
System.out.print("번호를 입력해주세요 >");
int menu = sc.nextInt();
return menu;
}
}
<Exam class>
package ex08.oop.capsule;
public class Exam {
int kor;
int eng;
int math;
//main에서 값을 가져올때 쓴다
public static int getKor(Exam exam) {
return exam.kor;
}
public static int getEng(Exam exam) {
return exam.eng;
}
public static int getMath(Exam exam) {
return exam.math;
}//static 무조건 써야함
//main에서 값을 담아줄때 쓴다
public static void setKor(Exam exam, int nextInt) {
exam.kor=nextInt;
}
public static void setEng(Exam exam, int nextInt) {
exam.eng=nextInt;
}
public static void setMath(Exam exam, int nextInt) {
exam.math=nextInt;
}
public static int total(Exam exam) {
return exam.kor+exam.eng+exam.math;
}//총점 함수 생성(연산을 main에서 하는건 좋지 않다)
}
<ExamList class>
package ex08.oop.capsule;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;
public class ExamList {
Exam[] exams;
private int index;
//메인에서 쓸수없게 private으로 막아둠
static void initExamList(ExamList list) {
list.exams = new Exam[1];
list.index = 0;
}
static void inputExamList(ExamList list) {
System.out.println("┌──────────────┐");
System.out.println("┃ 성적입력 ┃");
System.out.println("└──────────────┘");
while (true) {
Exam exam = new Exam(); // 배열의 객체 생성
if(list.index == list.exams.length) { // 공간이 충분한지, 또는 여유공간이 있는지 묻는 조건문
Exam[] temp = new Exam[list.exams.length+1]; // 새로운 객체 배열 생성
for(int i=0; i<list.exams.length; i++) // 기존의 객체 배열을 새로운 객체 배열로 옮겨주고
temp[i] = list.exams[i];
list.exams = temp; // 기존 객체 배열이 새로운 객체 배열을 가리킬 수 있게 해준다.
}
Scanner sc = new Scanner(System.in);
System.out.print("국어 성적을 입력하세요 : ");
Exam.setKor(exam, sc.nextInt());
System.out.print("영어 성적을 입력하세요 : ");
Exam.setEng(exam, sc.nextInt());
System.out.print("수학 성적을 입력하세요 : ");
Exam.setMath(exam, sc.nextInt());
list.exams[list.index] = exam;
list.index++;
System.out.println("그만하시겠습니까? 1. 예 2. 아니오");
int subMenu = sc.nextInt();
if(subMenu == 1)
break;
}
}
static void printExamList(ExamList list) {
for (int i = 0; i < list.index; i++) {
Exam exam = list.exams[i];
int kor = Exam.getKor(exam);//kor의속성은 쓰지 말고 대신할 함수를 만들어준다라는 뜻. 간접적으로 사용할수있게
int eng = Exam.getEng(exam);
int math = Exam.getMath(exam);
//Exam클래스에 kor,eng,math 함수생성
int total = Exam.total(exam);//kor+eng+math;
System.out.printf("국어 %d: %3d 점 \n", i + 1, kor);
System.out.printf("영어 %d: %3d 점 \n", i + 1, eng);
System.out.printf("수학 %d: %3d 점 \n", i + 1, math);
System.out.printf("총점 %d: %3d 점 \n", i + 1, total);
System.out.println("----------------");
}
}
static void saveExamList(ExamList list) throws IOException {
String fileName = "res/exam3.data";
FileOutputStream fos = new FileOutputStream(fileName);
PrintStream fout = new PrintStream(fos);
for(int i=0; i<list.index; i++) {
Exam exam = list.exams[i];
int kor = Exam.getKor(exam);
int eng = Exam.getEng(exam);
int math = Exam.getMath(exam);
fout.printf("%d %d %d", kor, eng, math);
if(i < list.index-1)
fout.println("");
}
fout.close();
fos.close();
System.out.println("성적을 저장했습니다.");
}
static void loadExamList(ExamList list) throws IOException {
String fileName = "res/exam3.data";
FileInputStream fis = new FileInputStream(fileName);
Scanner fscan = new Scanner(fis);
for(int i=0; i<list.index; i++) {
Exam exam = new Exam();
int kor, eng, math;
String scoreLine = fscan.nextLine();
String[] ScoreTokens = scoreLine.split(" ");
kor = Integer.parseInt(ScoreTokens[0]);
eng = Integer.parseInt(ScoreTokens[1]);
math = Integer.parseInt(ScoreTokens[2]);
//exam.kor = kor;
//exam.kor = kor; > Exam클래스의 setKor함수로
Exam.setKor(exam,kor);
// exam.eng = eng;
Exam.setEng(exam,eng);
// exam.math = math;
Exam.setMath(exam,math);
list.exams[i] = exam;
}
printExamList(list);
}
}
728x90
'국비수업 > 수업정리' 카테고리의 다른 글
객체지향 / 초기화 / 생성자 / 상속 (0) | 2023.03.15 |
---|---|
객체지향 / 인스턴스 객체 생성과 호출과 스택 (0) | 2023.03.14 |
성적관리 함수화 (객체 안에 배열과 인덱스 넣기) (0) | 2023.03.11 |
개체 간의 메세지 교환을 뽑아내보기 (0) | 2023.03.10 |
객체지향 (0) | 2023.03.10 |