My footsteps
code 실습 / 1️⃣9️⃣ 본문
728x90
<성적관리와 로또 인스턴스 메서드화>
✏️ Exam 프로그램을 오늘 수업 내용을 바탕으로 기존 static 메서드를 instance 메서드로 수정해보세요!
package ex08.oop.capsule.method;
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: // 성적 입력
list.inputExamList(); // list를 매개변수로 하면 ExamList에 속한 exams 객체 배열과 index 값을 저장할 수 있다.
// exams = inputExams(exams, index) 확장한 exams의 길이를 새로 참조하게 하기 위해서 exams에 확장된 exams를 참조시켜준다.
// index = exams.length;
break;
case 2: // 성적 출력
list.printExamList();
break;
case 3: // 성적 저장
list.saveExamList();
break;
case 4: // 성적 로드
list.loadExamList();
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;
}
}
package ex08.oop.capsule.method;
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으로 막아둠
public static void initExamList(ExamList list) {
list.exams = new Exam[1];
list.index = 0;
}
public void inputExamList() {
System.out.println("┌──────────────┐");
System.out.println("┃ 성적입력 ┃");
System.out.println("└──────────────┘");
while (true) {
Exam exam = new Exam(); // 배열의 객체 생성
if(index == exams.length) { // 공간이 충분한지, 또는 여유공간이 있는지 묻는 조건문
Exam[] temp = new Exam[exams.length+1]; // 새로운 객체 배열 생성
for(int i=0; i<exams.length; i++) // 기존의 객체 배열을 새로운 객체 배열로 옮겨주고
temp[i] = exams[i];
exams = temp; // 기존 객체 배열이 새로운 객체 배열을 가리킬 수 있게 해준다.
}
// Exam.inputExam(exam);
exam.input();
exams[index] = exam;
index++;
System.out.println("그만하시겠습니까? 1. 예 2. 아니오");
Scanner sc = new Scanner(System.in);
int subMenu = sc.nextInt();
if(subMenu == 1)
break;
}
}
public void printExamList() {
for (int i = 0; i < index; i++) {
Exam exam = exams[i];
int kor = exam.getKor();//kor의속성은 쓰지 말고 대신할 함수를 만들어준다라는 뜻. 간접적으로 사용할수있게
int eng = exam.getEng();
int math = exam.getMath();
//Exam클래스에 kor,eng,math 함수생성
int total = exam.getTotal();//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("----------------");
}
}
public void saveExamList() throws IOException {
String fileName = "res/exam3.data";
FileOutputStream fos = new FileOutputStream(fileName);
PrintStream fout = new PrintStream(fos);
for(int i=0; i<index; i++) {
Exam exam = exams[i];
int kor = exam.getKor();
int eng = exam.getEng();
int math = exam.getMath();
int total = exam.getTotal();
fout.printf("%d %d %d", kor, eng, math);
if(i < index-1)
fout.println("");
}
fout.close();
fos.close();
System.out.println("성적을 저장했습니다.");
}
public void loadExamList() throws IOException{
String fileName = "res/exam3.data";
FileInputStream fis = new FileInputStream(fileName);
Scanner fscan = new Scanner(fis);
for(int i=0; i<index; i++) {
Exam exam = new Exam();
int kor, eng, math;
int total=0;
String scoreLine = fscan.nextLine();
String[] ScoreTokens = scoreLine.split(" ");
kor = Integer.parseInt(ScoreTokens[0]);
eng = Integer.parseInt(ScoreTokens[1]);
math = Integer.parseInt(ScoreTokens[2]);
exam.getKor();
exam.getEng();
exam.getMath();
exam.getTotal();
exams[i] = exam;
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("----------------");
}
fscan.close();
fis.close();
}
}
package ex08.oop.capsule.method;
import java.util.Scanner;
public class Exam {
int kor;
int eng;
int math;
int total;
//main에서 값을 가져올때 쓴다
// public static int getKor(Exam exam) {
// return exam.kor;
// }
public int getKor() {
return kor;
}
// public static int getEng(Exam exam) {
// return exam.eng;
// }
public int getEng() {
return eng;
}
// public static int getMath(Exam exam) {
// return exam.math;
// }//static 무조건 써야함
public int getMath() {
return math;
}
public int getTotal() {
total=kor+eng+math;
return total;
}
//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에서 하는건 좋지 않다)
// public static void inputExam(Exam exam) {
//
// Scanner sc = new Scanner(System.in);
//
// System.out.print("국어 성적을 입력하세요 : ");
// exam.kor = sc.nextInt();
// System.out.print("영어 성적을 입력하세요 : ");
// exam.eng = sc.nextInt();
// System.out.print("수학 성적을 입력하세요 : ");
// exam.math = sc.nextInt();
// //캡슐화 한곳에서 입력받을수 있게 됨
//
// }
public void input() {//매개인자가 없음
Scanner sc = new Scanner(System.in);
System.out.print("국어 성적을 입력하세요 : ");
this.kor = sc.nextInt();
System.out.print("영어 성적을 입력하세요 : ");
this.eng = sc.nextInt();
System.out.print("수학 성적을 입력하세요 : ");
this.math = sc.nextInt();
}
}
✏️ 하나의 코드로 작성되어있는 Lotto 프로그램을 오늘까지 배운 내용을 토대로 조원들과 함께 객체지향으로 구현해보세요! 조원 아무에게나 물어도 누구나 코드에 대해 설명할 수 있어야합니다.
(Java)Day04 - 배열을 이용한 다양한 응용
과제로 내주신 로또 번호 과제를 수정 1. 로또번호 문제 //로또번호는 6개 //번호는 45개, 단 중복이 없어야함(중복제거를 구현안함) 설명 듣고 다시 수정 내가 구현한 것은 , 46크기의 int 배열을 만
kkm8257.tistory.com
package gp5;
import java.util.Scanner;
public class Program {
public static void main(String[] args) {
//5조 로또 시뮬레이션 코드 메인!!!!!!!!!!
LottoSimulator lottoSimulator = new LottoSimulator();
lottoSimulator.initLotto(); //초기화 함수 호출
END:
while(lottoSimulator.getLottoCount() < 6){ //로또값이 6개이하면 while문 작동
lottoSimulator.lottoPrint(); //로또 출력
Scanner sc = new Scanner(System.in);
int menu = sc.nextInt();
switch (menu){
case 1: // 번호뽑기
if(lottoSimulator.getLottoCount()<6){ //만약,로또번호가 5개가 다 채워지지 않으면
lottoSimulator.pickNumber(); //계속 번호를 뽑고
break;
}
else{ //그게 아니라면
System.out.printf("이미 값을 다 뽑았습니다.");
break END; //종료
}
case 2: //마지막 번호 다시 뽑기
lottoSimulator.lastNumber();
break;
case 3:
System.out.println("종료합니다.");
break END;
default:
System.out.println("1,2만 입력해 주세요");
}
}
lottoSimulator.sortLotto();
//정렬해서 최종 출력
}
}
package gp5;
import java.util.Random;
public class LottoSimulator {
Lotto[] lottos;
private int lottoCount;
private int[] dupliacteCheck;
public void initLotto() { //초기화
lottos = new Lotto[6];
lottoCount = 0;//index
dupliacteCheck = new int[45]; //중복제거를 위해 1부터 45까지 넣을수있는 배열 생성
for (int i = 0; i < 45; i++) {
dupliacteCheck[i] = i + 1; //포문을 돌려 값을 넣는다
}
}
public int getLottoCount(){ //로또값
return this.lottoCount;
}
public void lottoPrint() { //현재로또출력문
System.out.printf("현재 로또 번호 :");
for (int i = 0; i < lottoCount; i++) {
if (i < lottoCount)
System.out.printf("[%d]", lottos[i].getNum());
// else
// System.out.printf("[ ]");
}
System.out.println();
System.out.println("1. 번호를 뽑기 2.마지막 번호를 다시 뽑기 3.종료");
System.out.printf("> ");
}
public void pickNumber() { //case1:번호 뽑기 겸 중복검사
Random rand = new Random();
while (true) {
int randomIndex = rand.nextInt(45) + 1;
if (dupliacteCheck[randomIndex-1] == 0) // 이미 뽑힌 값이라면
//로또랜덤번호는 1부터 시작하니까 0이 절대 될수 없음. 그래서 뽑힌 값을 0과 비교한다.
//그리고,randomIndex-1인 이유는 로또랜덤숫자는 1~45까지인데 index는 0~44까지다. 그래서 로또랜덤마지막숫자45와 index끝을 비교하고 싶으면 -1을 해줘야함
continue;
else { //다음 진행.....을 위한 else
lottos[lottoCount] = new Lotto();
lottos[lottoCount].setNum(randomIndex); //lottos인덱스에 setNum을 깔아주는데, 그 setNum의 대입값이 randomIndex다
dupliacteCheck[randomIndex-1] = 0;
//ex) randomIndex로 42이라는 숫자를 뽑았다. 그래서 lottos의0번째 값이 42인데 인덱스는 41이니까 42-1. 고로,42는 이미 뽑힌 값이기 때문에 0을 대입해준다.
//dupliacteCheck[0]이 되면서 뽑힌값으로 인식이 된다.
lottoCount++; //그러면서 다음 인덱스로 넘어감
break;
}
}
//lottos의 크기가 6이기 때문에 객체6개를 생성해주면 종료됨
}
public void lastNumber(){ //case2:마지막 번호 다시뽑기
if(lottoCount == 0){
System.out.printf("아무런 로또번호가 뽑히지 않았습니다. 번호를 뽑아주세요.\n ");
}
else{
lottoCount -=1; //lottoCount = lottoCount-1 다시 뒷자리로 가서
int lastNum = lottos[lottoCount].getNum();
dupliacteCheck[lastNum-1] = lastNum; //중복제거 해제(lastNum에 담긴 값을 중복제거 배열,해당 인덱스에 돌려줘야하는데 인덱스는 -1이니까)
//값이 인덱스보다 항상 1이 크니까 ..lastNum-1이건,위에서 했던 과정이랑 같음
pickNumber();
}
}
public void sortLotto(){ //로또정렬
for (int i = 0; i < lottoCount-1; i++) {
for (int j = 0; j < lottoCount-1; j++) {
if(lottos[j].getNum() > lottos[j+1].getNum()) {
int temp;
//빈그릇 준비
temp = lottos[j].getNum();
//lottos[j]에 있는 num을 가져와서 temp빈그릇에 담아줌
lottos[j].setNum(lottos[j+1].getNum());
//(lottos[j]는 비었음)lottos[j+1]에 있는 num을 가져와서 비어있는 lottos[j]에 담아줌
lottos[j+1].setNum(temp);
//temp(lottos[j]에서 가져온값)를 lottos[j+1]에 담아준다
}
}
}
System.out.println("정렬된 로또");
//정렬된 로또 최종출력
for (int i = 0; i < lottoCount; i++) {
System.out.printf("[%d] ", lottos[i].getNum());
}
}
}
package gp5;
public class Lotto {
private int num;//Lotto클래스의 속성,멤버변수
private int lottoCount; //index
//set=설정(저장)호출할때마다 대입한다 get=가져오다
public int getNum() {
return num; //객체의 num을 가져온다
}
public void setNum(int num) {
this.num = num; //호출한곳의 객체인 로또에 세팅
//class Lotto num과 매개변수 num을 구분짓기 위해
}
public int getLottoCount() {
return lottoCount; //객체의 lottoCount를 가져온다
}
public void setLottoCount(int lottoCount) {
this.lottoCount = lottoCount; //호출한곳의 객체인 lottoCount에 세팅
}
}
728x90
'국비수업 > CODE' 카테고리의 다른 글
code 실습 / 2️⃣1️⃣ (0) | 2023.03.16 |
---|---|
code 실습 / 2️⃣0️⃣ (0) | 2023.03.15 |
code 실습 / 1️⃣8️⃣ (0) | 2023.03.13 |
code 실습 / 1️⃣7️⃣ (0) | 2023.03.10 |
code 실습 / 1️⃣6️⃣ (0) | 2023.03.09 |