Java/Java icia 10일차

상속 , 오버라이드 , 클래스를 이용하여 학교시스템 만들기

swkn 2023. 3. 7. 17:13

학교시스템을 만들어보기

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 classstatic 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;
		}

 

만약 gender0이거나 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.idbirthday + "-" + ( 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 StudentClass 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 StudentClass 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 + 11부터 시작하게 출력했기 때문에

setTName으로 선택할때는 tNum-1인 것이다.

선택한 지도교수가 Class Teacher의 급여로 출력해야 하기 때문에 선택했을때 cnt가 올라가니 학생등록때 

setStudentCntsetSalary가 들어가야 한다.

 

 

	} 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("프로그램 종료");

	}

}

같은 클래스가 상속되어 있고 각 클래스마다 오버라이드로 메소드가 바뀌어 있기 때문에 대부분은 같게 만들수 있다.