728x90
수업내용 정리 (Java)
1. class 예제_학생 점수
- Student
- 필드 ㄱ
더보기
- 필드
private String sno; //학번
private String name;
private int kor;
private int eng;
private int mat;
private int total;
private double avg;
private char grade; //A,B,C ...
static int num = 100;
- static 필드는 정적필드로, 해당 클래스의 객체들이 공유한다.
- 생성자 ㄱ
더보기
- 생성자
// 생성자 1
public Student(){
sno = "S" + num++;
}
// 생성자 2
public Student(String name, int kor, int eng, int mat){
this();
this.name = name;
this.kor = kor;
this.eng = eng;
this.mat = mat;
total = kor+eng+mat;
avg = total/(double)3;
if(avg >= 90) {
grade = 'A';
}else if(avg >= 80) {
grade = 'B';
}else if(avg >= 70) {
grade = 'C';
}else if(avg >= 60) {
grade = 'D';
}else {
grade = 'F';
}
}
- 생성자를 두 개 만들어두고, 두 개 모두 코드를 짜봤다. (StudentMain에서 후술)
- 생성자 1은 객체를 생성할때 매개변수를 아무것도 받지 않고, 객체의 sno(학번)에 num++을 대입한다.
- 생성자 2는 객체를 생성할때 매개변수로 이름, 국어점수, 영어점수, 수학점수를 입력받는다. 객체의 sno(학번)에 num++을 대입하고, 입력받은 매개변수들을 각각의 필드에 대입한다. total, avg, grade는 입력받은 매개변수를 이용하여 계산한 값을 대입한다.
- 메서드 ㄱ
더보기
- 메서드
// 프라이빗 필드의 각각 set/get 메서드
public void setName(String name){
this.name = name;
}
public String getSno(){
return name;
}
- 예시를 위해 sno만 set/get 메서드를 작성해놓았다.
- 화면을 우클릭 후 뜨는 창에서 Source>Generate Getters and Setters를 누르면 새로 창이 뜨는데 여기서 set/get 메서드를 만들 것들만 클릭하고 Generate를 눌러주면 자동으로 선택한 필드들의 set/get 메서드를 생성해준다.
public void setTAG(){
total = kor+eng+mat;
avg = total/(double)3;
if(avg >= 90) {
grade = 'A';
}else if(avg >= 80) {
grade = 'B';
}else if(avg >= 70) {
grade = 'C';
}else if(avg >= 60) {
grade = 'D';
}else {
grade = 'F';
}
}
- 호출하면 생성자 1을 사용하여 학생을 등록했거나, 학생 정보를 수정했을때 수정된 값에 따라 total, avg, grade를 다시 계산한 값을 대입해준다.
public void print(){
System.out.printf("%s\t%s\t%d\t%d\t%d\t%d\t%.2f\t%c\n",
sno,name,kor,eng,mat,total,avg,grade);
}
- 호출하여 출력할때, 학번, 이름, 국어점수, 영어점수, 수학점수, 총점, 평균(소수점 2자리까지), 학점 순으로 출력된다.
- StudentMain (이번엔 if문이 아닌 switch문으로 만들었다.)
- 변수/객체/임포트 ㄱ
더보기
- 임포트
import java.util.ArrayList;
import java.util.Scanner;
import day11.Util;
- day11.Util은 숫자 체크 메서드를 사용하기 위해 임포트해왔다.
- 변수/객체
Scanner sc = new Scanner(System.in);
ArrayList<Student> list = new ArrayList<Student>();
boolean run = true;
Util util = new Util();
- day11.Util은 숫자 체크 메서드를 사용하기 위해 임포트해왔다.
- 메뉴 ㄱ
더보기
- 메뉴
System.out.println("=================반==================");
System.out.println("1.학생등록 2.리스트 3.검색 4.수정 5.삭제 0.종료");
int menu = util.numberCheck("메뉴 선택> ", sc);
System.out.println();
System.out.println("====================================");
- 메뉴 선택에 day11.Util의 숫자체크 메서드를 사용하여 문자를 입력해도 콘솔창에 오류가 뜨지 않게 했다.
- 밑의 두 줄은 의미없는 꾸밈
- 메뉴 1 ㄱ
더보기
- 기본 틀
case 1:
System.out.println(" ====> 학생 등록");
// 생성자 사용
break;
- 생성자 1을 사용하여 등록
//생성자 1
Student s = new Student();
System.out.print("학생 이름> ");
s.setName(sc.next());
System.out.print("국어 점수> ");
s.setKor(sc.nextInt());
System.out.print("영어 점수> ");
s.setEng(sc.nextInt());
System.out.print("수학 점수> ");
s.setMat(sc.nextInt());
s.setTAG();
list.add(s);
System.out.println(" > "+s.getName()+" 학생 등록 완료!");
- 객체를 하나 생성해서 그 객체에 바로 set 메서드를 이용해 이름, 국어점수, 영어점수, 수학점수를 직접 입력받는다.
- setTAG 메서드를 이용해 total, avg, grade 값을 세팅한다.
- 전부 입력되면 ArrayList로 만들어둔 <Student> list에 설정된 객체를 추가한다.
//setTAG 메서드를 쓰지 않았을 때 사용해야 하는 코드
s.setTotal(s.getKor()+s.getEng()+s.getMat());
s.setAvg(s.getTotal()/(double)3);
if(s.getAvg() >= 90) {
s.setGrade('A');
}else if(s.getAvg() >= 80) {
s.setGrade('B');
}else if(s.getAvg() >= 70) {
s.setGrade('C');
}else if(s.getAvg() >= 60) {
s.setGrade('D');
}else {
s.setGrade('F');
}
- setTAG 메서드 안에 있는 코드를 직접 적어서 값을 세팅해야 하는데 다른 메뉴에서도 사용해야 하는 경우, 다시 적어야하는 번거로움이 생긴다.
- 생성자 2를 사용하여 등록
//생성자 2
System.out.print("학생 이름> ");
String name = sc.next();
System.out.print("국어 점수> ");
int kor = sc.nextInt();
System.out.print("영어 점수> ");
int eng = sc.nextInt();
System.out.print("수학 점수> ");
int mat = sc.nextInt();
Student s = new Student(name,kor,eng,mat);
list.add(s);
System.out.println(" > "+name+" 학생 등록 완료!");
- 변수를 지정해서 이름, 국어점수, 영어점수, 수학점수를 입력받아두고, 객체를 하나 생성해서 매개변수에 입력받아둔 변수를 입력한다.
- 전부 입력하면 ArrayList로 만들어둔 <Student> list에 설정된 객체를 추가한다.
- 메뉴 2 ㄱ
더보기
- 학생 리스트
case 2:
System.out.println(" ====> 학생 리스트");
System.out.println("학번\t이름\t국어\t영어\t수학\t총점\t평균\t학점");
System.out.println("---------------------------------------------------------------");
for(Student a : list) {
a.print();
}
break;
- foreach를 통해 list에 추가된 객체들을 차례대로 출력한다.
- 메뉴 3 ㄱ
더보기
- 학생 검색
case 3:
System.out.println(" ====> 학생 검색");
System.out.print("검색할 학번> ");
String searchS = sc.next();
boolean find = false;
for(Student sS : list) {
if(sS.getSno().equals(searchS)) {
System.out.println("학번\t이름\t국어\t영어\t수학\t총점\t평균\t학점");
System.out.println("---------------------------------------------------------------");
sS.print();
find = true;
break;
}
}
if(!find) {
System.out.println(" > 학번을 조회할 수 없습니다.");
}
break;
- 검색할 학번을 입력받고, foreach문을 통해 list에 있는 학번 중에 입력받은 학번과 동일한게 있다면 그 학번의 정보를 출력하고 foreach문을 종료한다.
- foreach문 전에 입력해둔 boolean find(false)를 학번을 찾았으면 true로 바꾸고, 못찾았다면 foreach문 밖에서 만약 find가 false라면 학번을 조회할 수 없다고 출력
- 메뉴 4 ㄱ
더보기
- 학생 정보 수정
case 4:
System.out.println(" ====> 정보 수정");
System.out.print("수정할 학번> ");
String reS = sc.next();
find = false;
for(Student sS : list) {
if(sS.getSno().equals(reS)) {
System.out.println("학번\t이름\t국어\t영어\t수학\t총점\t평균\t학점");
System.out.println("---------------------------------------------------------------");
sS.print();
System.out.print("국어 점수> ");
sS.setKor(sc.nextInt());
System.out.print("영어 점수> ");
sS.setEng(sc.nextInt());
System.out.print("수학 점수> ");
sS.setMat(sc.nextInt());
System.out.println(" > 수정이 성공적으로 완료되었습니다.");
sS.setTAG();
find = true;
break;
}
}
if(!find) {
System.out.println(" > 학번을 조회할 수 없습니다.");
}
break;
- 수정할 학번을 입력받고, foreach문을 통해 list에 있는 학번 중에 입력받은 학번과 동일한게 있다면 그 학번의 정보를 출력하고 국어점수, 영어점수, 수학점수를 다시 입력받고, setTAG 메서드를 호출한 뒤 foreach문을 종료한다.
- foreach문 전에 입력해둔 boolean find(false)를 학번을 찾았으면 true로 바꾸고, 못찾았다면 foreach문 밖에서 만약 find가 false라면 학번을 조회할 수 없다고 출력
- 메뉴 5 ㄱ
더보기
- 학생 정보 삭제
case 5:
System.out.println(" ====> 정보 삭제");
System.out.print("삭제할 학번> ");
String delS = sc.next();
find = false;
for(Student sS : list) {
if(sS.getSno().equals(delS)) {
System.out.println("학번\t이름\t국어\t영어\t수학\t총점\t평균\t학점");
System.out.println("---------------------------------------------------------------");
sS.print();
System.out.print("삭제하시겠습니까? (Y/y) > ");
String Y = sc.next();
if(Y.equals("Y") || Y.equals("y")) {
System.out.println(" > 성공적으로 삭제가 완료되었습니다.");
list.remove(sS);
}
find = true;
break;
}
}
if(!find) {
System.out.println(" > 학번을 조회할 수 없습니다.");
}
break;
- 삭제할 학번을 입력받고, foreach문을 통해 list에 있는 학번 중에 입력받은 학번과 동일한게 있다면 그 학번의 정보를 출력하고 삭제할 거냐고 다시 물어본 후, 답이 Y, y 중 하나라면 list에서 객체를 삭제하고, foreach문을 종료한다.
- foreach문 전에 입력해둔 boolean find(false)를 학번을 찾았으면 true로 바꾸고, 못찾았다면 foreach문 밖에서 만약 find가 false라면 학번을 조회할 수 없다고 출력
- 메뉴 0 ㄱ
더보기
- 메뉴 0 (종료)
case 0:
System.out.println(" ====> 종료");
run = false;
break;
- while문을 변수 run(true)으로 돌리고 있었으니, run을 false로 바꿔줌으로 while문을 빠져나간다.
- 그 외 ㄱ
더보기
- 메뉴 선택에서 0~5 사이의 숫자가 아닌 다른 숫자를 입력했을 경우
default:
System.out.println(" > 번호를 잘못 입력하셨습니다.");
}
- swich문을 빠져나간 후 의미없는 꾸밈
System.out.println("====================================");
System.out.println();
전체 피드백
- 아직 class 사용이 익숙치 않아서 생성자1을 사용하여 객체 생성하기를 직접 적었다가 나중에서야 바꿨다.
- 오후시간에 각자 프로그램을 하나 만들어보라고 하셨는데 중복 없이 랜덤으로 하는게 저번에 됐었는데 이번에 다른 방법으로 하려니까 자꾸 오류가 나서 나중에 다시 해보기로 했다. 이것만 해결하면 프로그램을 완성하게 되니까 조금씩 건드려봐야겠다. (블로그에 정리해서 올릴 수 있으면 올리기!)
728x90
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 15일차 (23/10/11) - Java (1) | 2023.10.11 |
---|---|
수업일지 14일차 (23/10/10) - Java (0) | 2023.10.10 |
수업일지 12일차 (23/10/05) - Java (1) | 2023.10.05 |
수업일지 11일차 (23/10/04) - Java (0) | 2023.10.04 |
수업일지 10일차 (23/09/27) - Java (0) | 2023.09.27 |