무룩 공부방

[Java02] 추상 클래스 응용 (2) (Abstract Class) (Eclipse) 본문

IT/Java02_Intermediate

[Java02] 추상 클래스 응용 (2) (Abstract Class) (Eclipse)

moo_look 2023. 10. 7. 20:55

# 성적처리 프로그램을 추상 클래스로 설계하여 코드를 수정하라


<AbsStudent>

package java02_intermediate.Abstract;

public class AbsStudent {
	
	private int num;
	private String name;
	private int kor;
	private int eng;
	private int mat;
	private int tot;
	private double avg;
	private String hak;
	private int rank;
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getMat() {
		return mat;
	}
	public void setMat(int mat) {
		this.mat = mat;
	}
	public int getTot() {
		return tot;
	}
	public void setTot(int tot) {
		this.tot = tot;
	}
	public double getAvg() {
		return avg;
	}
	public void setAvg(double avg) {
		this.avg = avg;
	}
	public String getHak() {
		return hak;
	}
	public void setHak(String hak) {
		this.hak = hak;
	}
	public int getRank() {
		return rank;
	}
	public void setRank(int rank) {
		this.rank = rank;
	}
}

<AbsStudentMain>

package java02_intermediate.Abstract;

import java.util.Scanner;

public class AbsStudentMain {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		AbsStudentMethodImpl sm = new AbsStudentMethodImpl();
		
		boolean chk = true;
		while(chk) {
			
			System.out.println("작업선택");
			System.out.print("[1]입력 [2]출력 [3]검색 [4]삭제 [5]수정 [6]종료 >> ");
			int menu = sc.nextInt();
			
			switch(menu) {
				case 1 : 
					sm.insert();
					break;
				case 2 : 
					sm.srcPrint();
					sm.disPlayPrint();
					break;
				case 3 : 
					System.out.print("검색하고자 하는 번호 입력 >> ");
					int num = sc.nextInt();
					String searchCheck = sm.search(num);
					System.out.println(searchCheck);
					break;
				case 4 : 
					System.out.print("삭제하고자 하는 번호 입력 >> ");
					num = sc.nextInt();
					boolean boolCheck = sm.delete(num);
					if(boolCheck == true) System.out.println("[레코드 삭제완료!]");
					else System.out.println("[삭제하고자 하는 레코드 없음.]");
					break;
				case 5 : 
					System.out.print("수정하고자 하는 번호 입력 >> ");
					num = sc.nextInt();
					int updateCheck = sm.update(num);
					if(updateCheck == 1) {
						System.out.println("수정되었습니다!");
					}
					else {
						System.out.println("[수정하고자 하는 레코드 없음.]");
					}
					break;
				case 6 : 
					chk = false;
					System.out.println("프로그램 종료");
					break;
			}
		}
		sc.close();

	}

}

<AbsStudentMethod>

package java02_intermediate.Abstract;

public abstract class AbsStudentMethod {

	abstract public void srcPrint(); // 타이틀 출력
	abstract public void insert(); // 입력
	abstract public void totAvgHakPro(int lastStu); // 총점
	abstract public void totAvgHakPro(); // 총점
	abstract public void rankPro(); // 등수
	abstract public void disPlayPrint(); // 레코드 출력
	abstract public String search(int num); // 검색
	abstract public boolean delete(int num); // 삭제
	abstract public int update(int num); // 수정
	
}

<AbsStudentMethodImpl extends AbsStudentMethod>

package java02_intermediate.Abstract;

import java.util.ArrayList;
import java.util.Scanner;

public class AbsStudentMethodImpl extends AbsStudentMethod {

	Scanner sc = new Scanner(System.in);
	ArrayList<AbsStudent> list = new ArrayList<AbsStudent>();
	
	@Override
	public void srcPrint() {
		System.out.println("\t\t성적표");
		System.out.println("번호\t이름\t국어\t영어\t수학\t총점\t평균\t학점\t등수");
	}

	@Override
	public void insert() {
		// 입력받아서 가변배열에 객체를 저장
		System.out.print("번호 이름 국어 영어 수학 입력 >> ");
		int num = sc.nextInt();
		String name = sc.next();
		int kor = sc.nextInt();
		int eng = sc.nextInt();
		int mat = sc.nextInt();
		
		AbsStudent stu = new AbsStudent();
		
		stu.setNum(num);
		stu.setName(name);
		stu.setKor(kor);
		stu.setEng(eng);
		stu.setMat(mat);
		
		list.add(stu);
		
		int lastStu = list.lastIndexOf(stu);
		
		totAvgHakPro(lastStu);
		
		rankPro();
		
	}
	
	@Override
	public void totAvgHakPro() { // 오버로딩 가능
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void totAvgHakPro(int lastStu) {
		
		int tot = list.get(lastStu).getKor() + list.get(lastStu).getEng() + list.get(lastStu).getMat();
		double avg = tot / 3.;
		
		list.get(lastStu).setTot(tot);
		list.get(lastStu).setAvg(avg);
		
		if(list.get(lastStu).getAvg() >= 90) list.get(lastStu).setHak("A");
		else if(list.get(lastStu).getAvg() >= 80) list.get(lastStu).setHak("B");
		else if(list.get(lastStu).getAvg() >= 70) list.get(lastStu).setHak("C");
		else if(list.get(lastStu).getAvg() >= 60) list.get(lastStu).setHak("D");
		else list.get(lastStu).setHak("재시험");
		
	}
	
	// 등수구하기
	@Override
	public void rankPro() {
		
		for(int i = 0; i < list.size(); i++) {
			list.get(i).setRank(1);
			int count = 1;
			for(int j = 0; j < list.size(); j++) {
				if(list.get(i).getTot() < list.get(j).getTot()) {
					list.get(i).setRank(++count); // 증가후 저장
				}
			}
		}
	}

	@Override
	public void disPlayPrint() {
		
		for(int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i).getNum()+"\t");
			System.out.print(list.get(i).getName()+"\t");
			System.out.print(list.get(i).getKor()+"\t");
			System.out.print(list.get(i).getEng()+"\t");
			System.out.print(list.get(i).getMat()+"\t");
			System.out.print(list.get(i).getTot()+"\t");
			System.out.print(list.get(i).getAvg()+"\t");
			System.out.print(list.get(i).getHak()+"\t");
			System.out.print(list.get(i).getRank()+"\n");
		}
	}

	@Override
	public String search(int numBun) {
		for(int i = 0; i < list.size(); i++) {
			if(numBun == list.get(i).getNum()) {
				
				srcPrint();
				int num = list.get(i).getNum();
				String name = list.get(i).getName();
				int kor = list.get(i).getKor();
				int eng = list.get(i).getEng();
				int mat = list.get(i).getMat();
				int tot = list.get(i).getTot();
				double avg = list.get(i).getAvg();
				String hak = list.get(i).getHak();
				int rank = list.get(i).getRank();
				
				System.out.println(num+"\t"+name+"\t"+kor+"\t"+eng+"\t"+mat+"\t"+tot+"\t"+avg+"\t"+hak+"\t"+rank);
				
				return "[검색완료!]";
			}
			
		}
		return "[일치하는 번호가 없습니다.]";

	}

	@Override
	public boolean delete(int numBun) {
		for(int i = 0; i < list.size(); i++) {
			if(numBun == list.get(i).getNum()) {
				list.remove(i); //remove() 삭제하는 메서드
				// 삭제를 하면 뒤에 있는 객체들이 앞으로 자동으로 옮겨짐
				rankPro();
				return true;
			}
		}
		return false;

	}

	@Override
	public int update(int numBun) {
		for(int i = 0; i < list.size(); i++) {
			if(numBun == list.get(i).getNum()) {
				
				System.out.print("수정할 "+numBun+"번 이름 국어 영어 수학 입력 >> ");
				String name = sc.next();
				int kor = sc.nextInt();
				int eng = sc.nextInt();
				int mat = sc.nextInt();
				
				list.get(i).setName(name);
				list.get(i).setKor(kor);
				list.get(i).setEng(eng);
				list.get(i).setMat(mat);
				
				totAvgHakPro(i);
				rankPro();
				
				return 1;
			}
		}
		return 2;

	}

}