Notice
Recent Posts
Recent Comments
Link
Everything has an expiration date
121 - Java 인터페이스(Interface) : 인터페이스를 활용하여 인원 수와 학생의 이름, 국 영 수 점수를 입력받고, 점수별로 수 우 미 양 가의 등급을 출력하는 성적 처리 프로그램 본문
[Java]/Program source (java)
121 - Java 인터페이스(Interface) : 인터페이스를 활용하여 인원 수와 학생의 이름, 국 영 수 점수를 입력받고, 점수별로 수 우 미 양 가의 등급을 출력하는 성적 처리 프로그램
Jelly-fish 2023. 9. 14. 17:25/*==============================
■■■ 클래스 고급 ■■■
- 인터페이스(Interface)
================================*/
// ○ 실습 문제
// 성적 처리 프로그램을 구현한다.
// 단, 인터페이스를 활용할 수 있도록 한다.
// 실행 예)
// 인원 수 입력(1~10) : 11
// 인원 수 입력(1~10) : 0
// 인원 수 입력(1~10) : 2
// 1번째 학생의 학번 이름 입력(공백 구분) : 2309123 김다슬
// 국어 영어 수학 점수 입력 (공백 구분) : 90 100 85
// 1번째 학생의 학번 이름 입력(공백 구분) : 2309125 김동민
// 국어 영어 수학 점수 입력 (공백 구분) : 85 70 60
// 총점 평균
// 2309123 김다슬 90 100 85 xxx xx.xx
// 수 수 우
// 2309125 김동민 85 70 60 xxx xx.xx
// 우 미 양
// 계속하려면 아무 키나 누르세요...
// 90 이상 → 수
// 80 이상 90 미만 → 우
// 70 이상 80 미만 → 미
// 60 이상 70 미만 → 양
// 60 미만 (그 외) → 가
import java.util.Scanner;
// 속성만 존재하는 클래스 → 자료형 활용
class Record
{
String hak, name; //-- 학번, 이름
int kor, eng, mat; //-- 국어, 영어, 수학 점수
int tot; //-- 총점
double avg; //-- 평균
}
// 인터페이스
interface Sungjuk
{
public void set(); //-- 인원 세팅
public void input(); //-- 데이터 입력
public void print(); //-- 결과 출력
}
// 문제 해결 과정에서 설계해야 할 클래스 → Sungjuk 인터페이스를 구현하는 클래스
class SungjukImpl implements Sungjuk
{
private int inwon;
private Record[] rec;
// 1. 인원수 입력 메소드 (1~10) do~while (→ set 메소드에 오버라이딩!!)
@Override
public void set()
{
Scanner sc = new Scanner(System.in);
do
{
System.out.print("인원 수 입력(1~10) : ");
inwon = sc.nextInt();
}
while (inwon < 1 || inwon > 10);
// 제대로 입력 받으면 빠져나옴...
// 학생들의 학번, 이름, 성적을 입력해서 요소로 저장할 Record[] 배열의 길이를 인원수로 지정!
rec = new Record[inwon]; // 배열의 길이 = 인원 수!
}//end set()
// 2. for 문을 돌면서 Record 클래스 타입 배열의 각 요소에 인스턴스 생성. (→ input 메소드에 오버라이딩!!)
// 인원수만큼 (inwon) 반복하면서
// ① 학번, 이름 (String) ② 국, 영, 수 점수 (int) 입력하고 Record의 각 방에 저장!
@Override
public void input()
{
Scanner sc = new Scanner(System.in);
System.out.println(); // 개행
for (int i = 0; i < rec.length; i++)
{
rec[i] = new Record(); // 배열의 각 방에 Record 클래스의 인스턴스를 생성.
System.out.printf("%d번째 학생의 학번 이름 입력(공백 구분) : ", (i+1));
rec[i].hak = sc.next(); // i번째 학생의 학점 String 저장.
rec[i].name = sc.next(); // i번째 학생의 이름 String 저장.
System.out.print("국어 영어 수학 점수 입력 (공백 구분) : ");
rec[i].kor = sc.nextInt(); // i번째 학생 국어점수 int 저장
rec[i].eng = sc.nextInt(); // i번째 학생 영어점수 int 저장
rec[i].mat = sc.nextInt(); // i번째 학생 수학점수 int 저장
rec[i].tot = rec[i].kor + rec[i].eng + rec[i].mat; // 입력 받으면서 같이 총점 구하기~!!!
rec[i].avg = rec[i].tot / 3.0;
}
}//end input()
// 3. 내부적으로 등급에 대한 판정을 수행할 메소드 (자식 클래스에서 새로 생성한 메소드!)
// 총점을 기준으로 성적을 결정한다! → int 타입이므로
// ★☆ 매개변수(param)로, 국어 점수 주기 = rec[i].kor, 영어 점수 주기 = rec[i].eng ...
private String panjung(int score)
{
String result;
// key point! ① 0번 학생부터 마지막 번째 학생까지 전부의 수 우 미 양 가 를 알아야 함
// key point! ② 입력 받는 성적 값은 국어, 영어, 수학 점수 총 세 가지임.
// key point! ③ 매개변수가 배열 형태가 아닌 단일 값이므로
// 같은 과정을 3번 반복해야 함 → [ 다른 메소드에서 panjung 메소드를 국, 영, 수 점수 인자로 3번 호출! ]
// 범위에 맞는지, 즉 『조건』을 비교하기 때문에... if문 사용!
// switch 문은 수식을 받고 상수 값이 일치하는지 확인하기 때문에!
if (score >= 90 && score <= 100 ) // 수!
{
result = "수";
}
else if (score >= 80) // 우!
{
result = "우";
}
else if (score >= 70) // 미!
{
result = "미";
}
else if (score >= 60) // 양!
{
result = "양";
}
else
{
result = "가";
}
return result; // 이 리턴 값을 (국어, 영어, 수학점수 등급)
// 학생 인원수 만큼의 길이의 배열 속
// 방 안에 3개를 저장해야 출력할 수 있을 것 같다.
// 즉, 2차원 배열을 생성해야 할 것이다.
// String[] resArr = {{국어등급, 영어등급, 수학등급}, {국어등급, 영어등급, 수학등급}, ...};
// 0번째 학생 1번째 학생
}//end panjung()
// 4. 결과 출력 (→ print 메소드 오버라이딩!!)
// 총점 평균
// 2309123 김다슬 90 100 85 xxx xx.xx
// 수 수 우
// 2309125 김동민 85 70 60 xxx xx.xx
// 우 미 양
@Override
public void print()
{
System.out.println();
// ① 학번, 이름, 국, 영, 수 점수, 총점, 평균 출력!!!!
for (int i = 0; i < rec.length ; i++)
{
System.out.printf("%7s", rec[i].hak); // 학번 출력
System.out.printf("%6s", rec[i].name); // 이름 출력
System.out.printf("%6d", rec[i].kor); // 국어점수 출력
System.out.printf("%6d", rec[i].eng); // 영어점수 출력
System.out.printf("%6d", rec[i].mat); // 수학점수 출력
System.out.printf("%6d", rec[i].tot); // 총점 출력
System.out.printf("%8.2f", rec[i].avg); // 평균 출력
System.out.println();
// ② 국, 영, 수 점수의 등급(수우미양가) 출력!
System.out.print(" ");
System.out.printf("%s", panjung(rec[i].kor));
System.out.printf("%5s", panjung(rec[i].eng));
System.out.printf("%5s", panjung(rec[i].mat));
System.out.println(); // 모두 출력했으면 개행
}
System.out.println();
}
}
// main() 메소드를 포함하는 외부의 다른 클래스
public class Test121
{
public static void main(String[] args)
{
Sungjuk ob = new SungjukImpl();
// 문제 해결 과정에서 작성해야 할 ob 구성 및 객체 생성
ob.set();
ob.input();
ob.print();
}
}
// 실행 결과
/*
인원 수 입력(1~10) : 2
1번째 학생의 학번 이름 입력(공백 구분) : 2309123 김다슬
국어 영어 수학 점수 입력 (공백 구분) : 90 100 85
2번째 학생의 학번 이름 입력(공백 구분) : 2309125 김동민
국어 영어 수학 점수 입력 (공백 구분) : 85 70 60
2309123 김다슬 90 100 85 275 91.67
수 수 우
2309125 김동민 85 70 60 215 71.67
우 미 양
계속하려면 아무 키나 누르십시오 . . .
*/