상속 , 오버라이드 , 클래스를 이용하여 학교시스템 만들기
학교시스템을 만들어보기
1. 먼저 Student Class와 Teacher Class를 상속할 Person Class를 만든다.
package day10_2;
public class Person {
private static int number = 10000;
private String id; // 990416-1(male = 1 female = 2 10000 @(ramdom) ex)1100003
private String name;
private char gender;
private String birthday;
public String getId() {
return id;
}
public void setId() {
if(!(gender == 0 || birthday == null)) {
int firstNo = (gender == 'M')? 1 : 2; //삼항연산자 (조건식)? 참이면 _ : 거짓이면 _ 대입문일때 사용
// if(gender == 'M'){
// int firstNo = 1;
//}else {
//int firstNo = 2;
int random = (int)(Math.random()*9)+1;
this.id = birthday+"-"+firstNo+number++ +random;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
person class의 static int 변수로 number는 10000부터 시작하게 만들었다.
( Static int number = 10000; 이므로 공유하는 변수 )
그후에 id ( 주민등록번호 ) , 이름 , 성별 , 생년월일 변수로 받고
주민등록번호 변수는
public void setId() {
if(!(gender == 0 || birthday == null)) {
int firstNo = (gender == 'M')? 1 : 2; //삼항연산자 (조건식)? 참이면 _ : 거짓이면 _ 대입문일때 사용
// if(gender == 'M'){
// int firstNo = 1;
//}else {
//int firstNo = 2;
int random = (int)(Math.random()*9)+1;
this.id = birthday+"-"+firstNo+number++ +random;
}
만약 gender 가 0이거나 birthday가 null ( 기본값이므로 아무 값도 안들어갔을 경우 )
삼항 (조건식)? 참이면 _ 거짓이면 _ 대입문일때 쓰는 연산자를 이용하여
1을 입력하면 M(Male) 2를 입력하면 F(Female)로 들어가게 한다.
이것을 if문으로 변경하자면 이렇게 쓸 수 있다.
if(gender == 'M'){
int firstNo = 1;
}else {
int firstNo = 2;
예를 들어서 주민등록번호 앞자리는 생년월일로 받고 , 뒷자리 번호 첫번째는 M이면 1 , F이면 2가 들어가게 하고 ,
나머지 숫자는 Static number로 설정한 값을 붙인후에 맨 마지막 번호는 랜덤함수를 이용해서 만들어볼수있다.
int random = (int)(Math.random()*9)+1;
this.id = birthday+"-"+firstNo+number++ +random;
랜덤함수 (Math.random()*9)+1;를 이용해
this.id가 birthday + "-" + ( 1 or 2 ) + static number++(반복할수록 1씩증가) + random 숫자로 나오게 하였다.
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
그후에 name , gender , birthday 를 getting and setting 해주었다.
2. 하위 클래스인 Class Student 와 Class Teacher를 만들어주었다.
package day10_2;
public class Student extends Person{
private static int number = 100;
private String sno;//학번
private String tName;//학생이 지도교수번호를 가져야할때
private double avg;
private String dept;//학과
public Student() {
this.sno = "S"+number++;
}
public String getTName() {
return tName;
}
public void setTName(String tno) {
this.tName= tno;
}
public double getAvg() {
return avg;
}
public void setAvg(double avg) {
this.avg = avg;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public void print() {
System.out.printf("%s\t%s\t%c\t%s\t%s\t%s\t%.2f\t%s\n",getId(),getName(),getGender(),getBirthday(),sno,tName,avg,dept);
}
}
Class Student는 Class Person을 상속받았기 때문에 Class Person의 필드 , 메소드를 사용할 수 있다.
package day10_2;
public class Teacher extends Person{
private static int number = 100;
private String tno;
private int salary;
private int p = 30000;
private int studentCnt;
public Teacher() {
this.tno = "T"+number++;
}
public String getTno() {
return tno;
}
public void setSalary() {
this.salary = p*studentCnt;
}
public void setStudentCnt() {
studentCnt++;
}
public void print() {
System.out.printf("%s\t%s\t%c\t%s\t%s\t%d\n",getId(),getName(),getGender(),getBirthday(),tno,salary);
}
}
마찬가지로 Class Teacher도 Class Person을 상속받았기 때문에 Class Person의 필드 , 메소드를 사용할 수 있다.
3. 메인 클래스인 Class Main를 만들어주었다.
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
List<Student> sList = new ArrayList<>();
List<Teacher> tList = new ArrayList<>();
boolean run = true;
Scanner로 입력받을 준비를 하고 , ArrayList를 이용하여
Student List ( sList ) 와 Teacher List ( tList ) 배열을 만들었다.
while (run) {
System.out.println("======학교시스템======");
System.out.println("1.학생 2.강사");
System.out.print("메뉴선택> ");
int menu = sc.nextInt();
while ( run ) 으로 학생과 강사 메뉴를 숫자로 입력받아 나눈다.
if (menu == 1) {
Student student = new Student();
System.out.print("이름> ");
student.setName(sc.next());
System.out.print("성별(1.여자 2.남자)> ");
int num = sc.nextInt();
if (!(num == 1 || num == 2)) {
System.out.println("없는 성별입니다");
continue;
}
char gender = (num == 1) ? 'M' : 'F';
student.setGender(gender);
System.out.print("생년월일> ");
student.setBirthday(sc.next());
student.setId();
System.out.print("평균> ");
student.setAvg(sc.nextDouble());
System.out.print("학과> ");
student.setDept(sc.next());
if (tList.size() == 0) {
System.out.println("선택가능한 지도교수가 없습니다.");
} else {
for (int i = 0; i < tList.size(); i++) {
System.out.println((i + 1) + "\t" + tList.get(i).getName());
}
System.out.println("------------------------------------");
System.out.print("지도교수> ");
int tNum = sc.nextInt();
student.setTName(tList.get(tNum - 1).getName());
tList.get(tNum-1).setStudentCnt();
tList.get(tNum-1).setSalary();
}
System.out.println("------------------------------------");
sList.add(student);
System.out.println("학생등록 완료");
스캐너로 학생 이름을 입력받고 , 성별을 1번 , 2번으로 선택받는다.
만약 선택가능한 지도교수가 없게되면 배열에는 비어있기 때문에 tList.size() 가 0이되어 if문 안으로 들어가서 끝이난다.
아니게 되면 for문으로 tList.size()만큼 반복되어서 지도교수 리스트가 출력되게 된다.
배열은 시작이 0으로 시작하기 때문에 i + 1로 1부터 시작하게 출력했기 때문에
setTName으로 선택할때는 tNum-1인 것이다.
선택한 지도교수가 Class Teacher의 급여로 출력해야 하기 때문에 선택했을때 cnt가 올라가니 학생등록때
setStudentCnt와 setSalary가 들어가야 한다.
} else if (menu == 2) {
System.out.printf("주민번호\t\t이름\t성별\t생년월일\t학번\t지도교수\t평균\t학과\n");
System.out.println("-----------------------------------------------------------------------");
for (Student s : sList) {
s.print();
}
} else if (menu == 3) {
System.out.println("조회할 ");
} else if (menu == 0) {
break;
} else {
System.out.println("다시입력");
}
}
메뉴를 2로 입력했을 경우 sList를 향상된 for문으로 담아 print 메소드를 이용해서 출력한다.
메뉴 3번은 아직 완성하지 못했다.
메뉴 0번은 뒤로가기로 break; 문을 사용해 학생과 강사 메뉴로 돌아갈 수 있도록 만들었다.
그 외에 입력하게 되면 "다시출력" 이 출력되게 하였다.
while (true) {
System.out.println("1.강사등록 2.강사리스트 3.강사조회 0.뒤로가기");
System.out.print("메뉴선택> ");
menu = sc.nextInt();
if (menu == 1) {
Teacher teacher = new Teacher();
System.out.print("이름> ");
teacher.setName(sc.next());
System.out.print("성별(1.여자 2.남자)> ");
int num = sc.nextInt();
if (!(num == 1 || num == 2)) {
System.out.println("없는 성별입니다");
continue;
}
char gender = (num == 1) ? 'M' : 'F';
teacher.setGender(gender);
System.out.print("생년월일> ");
teacher.setBirthday(sc.next());
teacher.setId();
tList.add(teacher);
System.out.println("강사 등록 완료");
} else if (menu == 2) {
System.out.printf("주민번호\t\t이름\t성별\t생년월일\t강사번호\t월급\n");
System.out.println("-----------------------------------------------------------------------");
for (Teacher t : tList) {
t.print();
}
} else if (menu == 3) {
System.out.print("강사번호 입력>");
String tno = sc.next();
for(Teacher t : tList) {
if(tno.equals(t.getTno())) {
System.out.println("--------------------------------");
for(Student s : sList) {
if(s.getTName().equals(t.getName())) {//학생의 지도교수 이름이 강사의 이름과 같으면 출력
System.out.println(s.getName());
}
}
System.out.println("--------------------------------");
}
}
} else if (menu == 0) {
break;
} else {
System.out.println("다시입력");
}
}
}
}
System.out.println("프로그램 종료");
}
}
같은 클래스가 상속되어 있고 각 클래스마다 오버라이드로 메소드가 바뀌어 있기 때문에 대부분은 같게 만들수 있다.