My footsteps

code 실습 / 1️⃣9️⃣ 본문

국비수업/CODE

code 실습 / 1️⃣9️⃣

밀김 2023. 3. 14. 14:55
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 프로그램을 오늘까지 배운 내용을 토대로  조원들과 함께 객체지향으로 구현해보세요!  조원 아무에게나 물어도 누구나 코드에 대해 설명할 수 있어야합니다.

https://kkm8257.tistory.com/8

 

(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