백엔드/Java

Java로 학생 정보 관리 시스템 구현(3)

짱뚱짱 2024. 10. 13. 09:00

- 학생의 정보 등록, 출력, 검색, 수정, 삭제, 수강신청, 수강철회 기능들 구현

📢 구조

  1. Student: 학생 정보 저장
  2. Subject: 과목 정보 저장
  3. Program (인터페이스): 학생 관리 기능을 정의.
  4. StudentController: 주 기능들 구현
  5. StudentMain: 사용자와의 상호작용

 

📢 클래스 

🔷 Student 클래스

속성

학번(stdNum)

이름(stdName)

나이(stdAge)

전화번호(stdPhone)

주소(stdAddress)

수강 과목 목록(subjectList)

주요 메서드

stdPrint(): 학생 정보 출력

insertSubject(Subject sub): 수강 과목 추가.

removeSubject(String subCode): 수강 과목 삭제

 

🔷 Subject 클래스

속성

과목 코드(subCode)

과목명(subName)

학점(subPoint)

시수(subTime)

교수명(subProfessor)

시간표(subScheduler)

강의실(subRoom)

주요 메서드

toString(): 과목 정보 출력

 

🔷 Program 인터페이스

insertStudent(Scanner scan)

printStudent()

searchStudent(Scanner scan)

modifyStudent(Scanner scan)

deleteStudent(Scanner scan)

registerSubject(Scanner scan)

deleteSubject(Scanner scan)

 

🔷 StudentController 클래스

인터페이스를 구현.

학생 관리 기능을 실제로 수행한다.

학생 추가, 출력, 검색, 수정, 삭제, 수강신청, 수강철회 기능 처리.

 

🔷 StudentMain 클래스

메뉴 출력. 사용자 입력 받은 후, 각 기능을 호출.

 

package student;

public class Student {
	/* 한 학생이 가져야 하는 정보 
	 * 학번, 이름, 나이, 전화번호, 주소, 수강과목s (Subject class를 배열로 처리) => 포함관계
	 * 멤버변수, 생성자, getter/setter, toString(학생정보 출력) 
	 * 수강신청 / 수강철회 / 수강과목 출력
	 * */
	
	private String stdNum;
	private String stdName;
	private int stdAge;
	private String stdPhone;
	private String stdAddress;
	private Subject[] subjectList = new Subject[5];
	private int cnt; 	//배열의 index 역할
	
	//생성자
	public Student() {}
	public Student(String stdNum, String stdName, String stdPhone) {
		this.stdNum = stdNum;
		this.stdName = stdName;
		this.stdPhone = stdPhone;
	}
	public Student(String stdNum, String stdName, int stdAge, String stdPhone, String stdAddress) {
		this.stdNum = stdNum;
		this.stdName = stdName;
		this.stdAge = stdAge;
		this.stdPhone = stdPhone;
		this.stdAddress = stdAddress;
	}
	
	// method
	// 학생정보 출력 메서드 (toString 이용가능)
	public void stdPrint() {
		System.out.println("학생명:"+stdName+"("+stdNum+") / "+stdPhone);
	}
	
	// 수강과목 출력 메서드 => 배열로 존재 (for)
	public void subPrint() {
		if(cnt==0) {
			System.out.println("수강과목이 없습니다.");
			return;
		}
		for(int i=0; i<cnt; i++) {
			System.out.println(subjectList[i]); //toString 호출
		}
	}
	
	// 수강신청 메서드 : subjectList subject 객체를 생성하여 추가
	// 수강과목 객체를 매개변수로 받아서 추가
	public void insertSubject(Subject sub) {
		// 배열이 다 찼다면... 배열 늘려주기
		if(cnt == subjectList.length) {
			Subject[] tmp = new Subject[subjectList.length+5];
			// 배열복사
			System.arraycopy(subjectList, 0, tmp, 0, cnt);
			// 기존 배열 변경
			subjectList = tmp;
		}
		
		subjectList[cnt] = sub;
		cnt++;
	}
	
	// 수강삭제 메서드
	// 수강코드 값을 매개변수로 받아서 삭제
	public void removeSubject(String subCode) {
		// 삭제할 코드의 위치 값을 저장하는 변수
		int index = -1;
		if(subCode == null) {
			return;
		}
		//삭제할 코드의 위치 값 찾기
		for(int i=0; i<cnt; i++) {
			if(subjectList[i].getSubCode().equals(subCode)) {
				index = i;
				break;
			}
		}
		
		if(index == -1) {
			System.out.println("찾는 과목이 없습니다.");
			return;
		}
		//삭제 : 찾은 위치부터 뒷번지를 앞번지로 옮기는 작업
		for(int i=index; i<cnt-1; i++) {
			subjectList[i] = subjectList[i+1];
		}
		//끝번지는 null 처리
		subjectList[cnt-1] = null;
		cnt--;
	}
	
	
	
	
	// getter/setter
	public String getStdNum() {
		return stdNum;
	}
	public void setStdNum(String stdNum) {
		this.stdNum = stdNum;
	}
	public String getStdName() {
		return stdName;
	}
	public void setStdName(String stdName) {
		this.stdName = stdName;
	}
	public int getStdAge() {
		return stdAge;
	}
	public void setStdAge(int stdAge) {
		this.stdAge = stdAge;
	}
	public String getStdPhone() {
		return stdPhone;
	}
	public void setStdPhone(String stdPhone) {
		this.stdPhone = stdPhone;
	}
	public String getStdAddress() {
		return stdAddress;
	}
	public void setStdAddress(String stdAddress) {
		this.stdAddress = stdAddress;
	}
	public Subject[] getSubjectList() {
		return subjectList;
	}
	public void setSubjectList(Subject[] subjectList) {
		this.subjectList = subjectList;
	}
	@Override
	public String toString() {
		return "Student [stdNum:" + stdNum + ", stdName:" + stdName + ", stdPhone:" + stdPhone + "]";
	}
	public int getCnt() {
		return cnt;
	}
	public void setCnt(int cnt) {
		this.cnt = cnt;
	}
	
	
	
	
	
}

 

package student;

public class Subject {
	
	// --Subject 클래스가 가져야 하는 기본적인 내용--
	// 과목정보 : 과목코드, 과목명, 학점, 시수, 교수명, 시간표, 강의장
	// 멤버변수, 생성자, getter/setter, toString(과목정보 출력)
	private String subCode;
	private String subName;
	private int subPoint;
	private int subTime;
	private String subProfessor;
	private String subScheduler;
	private String subRoom;
	
	// 생성자
	public Subject() {}
	
	// 과목코드,과목명만 받는 생성자
	public Subject(String subCode, String subName) {
		this.subCode = subCode;
		this.subName = subName;
	}

	public Subject(String subCode, String subName, int subPoint, int subTime, String subProfessor, String subScheduler,
			String subRoom) {
		this.subCode = subCode;
		this.subName = subName;
		this.subPoint = subPoint;
		this.subTime = subTime;
		this.subProfessor = subProfessor;
		this.subScheduler = subScheduler;
		this.subRoom = subRoom;
	}

	public String getSubCode() {
		return subCode;
	}

	public void setSubCode(String subCode) {
		this.subCode = subCode;
	}

	public String getSubName() {
		return subName;
	}

	public void setSubName(String subName) {
		this.subName = subName;
	}

	public int getSubPoint() {
		return subPoint;
	}

	public void setSubPoint(int subPoint) {
		this.subPoint = subPoint;
	}

	public int getSubTime() {
		return subTime;
	}

	public void setSubTime(int subTime) {
		this.subTime = subTime;
	}

	public String getSubProfessor() {
		return subProfessor;
	}

	public void setSubProfessor(String subProfessor) {
		this.subProfessor = subProfessor;
	}

	public String getSubScheduler() {
		return subScheduler;
	}

	public void setSubScheduler(String subScheduler) {
		this.subScheduler = subScheduler;
	}

	public String getSubRoom() {
		return subRoom;
	}

	public void setSubRoom(String subRoom) {
		this.subRoom = subRoom;
	}
	
	@Override
	public String toString() {
		return "Subject [subCode:" + subCode + ", subName:" + subName + "]";
	}
	
}

 

package student;

import java.util.Scanner;

public interface Program {
	//1.학생등록|2.학생리스트출력|3.학생검색(학생정보,수강정보)|4.학생정보수정|5.학생삭제
	//6.수강신청|7.수강철회|8.종료
	
	void insertStudent(Scanner scan);
	void printStudent();
	//학생을 검색후 해당 번지를 리턴
	int searchStudent(Scanner scan);
	void modifyStudent(Scanner scan);
	void deleteStudent(Scanner scan);
	void registerSubject(Scanner scan);
	void deleteSubject(Scanner scan);
}

 

package student;

import java.util.Scanner;

public class StudentController implements Program {
	
	// 멤버변수 추가 : Student 배열을 멤버변수로 추가
	private Student[] studentList = new Student[5];
	private int stdCnt = 0;
	
	@Override
	public void insertStudent(Scanner scan) {
		// 학생 추가 : 1명의 정보를 받아 Student 객체로 생성 후 배열에 추가
		System.out.println("학번>");
		String stdNum = scan.next();
		System.out.println("이름>");
		String stdName = scan.next();
		System.out.println("전화번호>");
		String stdPhone = scan.next();
		
		Student s = new Student(stdNum, stdName, stdPhone);
		// 만약 배열이 다 차서 저장할 공간이 없을 경우
		if(stdCnt == studentList.length) {
			Student[] tmp = new Student[studentList.length+5];
			System.arraycopy(studentList, 0, tmp, 0, stdCnt);
			studentList = tmp;
		}
		studentList[stdCnt] = s;
		stdCnt++;
	}
	
	@Override
	public void printStudent() {
		// 학생 배열 출력
		System.out.println("--전체 학생정보--");
		for(int i=0; i<stdCnt; i++) {
//			System.out.println(studentList[i]);		//toString
			studentList[i].stdPrint();				//메서드 호출
		}
	}
	
	@Override
	// 해당 학번의 index 리턴
	public int searchStudent(Scanner scan) {
		// 학생검색 - 학번을 기준
		// 학번을 입력받아 배열에서 탐색 후 학생정보 + 수강정보 출력
		// 없으면 없다고 출력
		System.out.println("학번>");
		String searchNum = scan.next();
		
		for(int i=0; i<stdCnt; i++) {
			if(searchNum.equals(studentList[i].getStdNum())) {
				studentList[i].stdPrint();
				studentList[i].subPrint();
				return i;
			}
		}
		System.out.println("검색한 학번이 없습니다.");
		return -1;
	}
	
	@Override
	public void modifyStudent(Scanner scan) {
		// 학생정보 수정
		int index = searchStudent(scan);
		if(index != -1) {
			System.out.println("이름>");
			String name = scan.next();
			System.out.println("전화번호>");
			String phone = scan.next();
			studentList[index].setStdName(name);
			studentList[index].setStdPhone(phone);
		}
		
	}
	
	@Override
	public void deleteStudent(Scanner scan) {
		// 학생 삭제
		int index = searchStudent(scan);
		if(index != -1) {
			int copyCnt = studentList.length - index - 1;
			System.arraycopy(studentList, index+1, studentList, index, copyCnt);
			// 마지막 번지 null 처리
			studentList[studentList.length-1] = null;
			stdCnt--;
		}
		
	}
	
	@Override
	public void registerSubject(Scanner scan) {
		// 수강과목의 정보를 입력받아 subject 객체를 생성하여 Student 클래스
		// 누가 어떤과목을 수강할지를 받아야 함.
		// 수강신청 학번을 먼저 검색 후 추가
		
		int index = searchStudent(scan);
		System.out.println("---------------------------");
		System.out.println("과목코드>");
		String subCode = scan.next();
		System.out.println("과목이름>");
		String subName = scan.next();
		//객체 생성 후 메서드 호출
		Subject sub = new Subject(subCode, subName);
		studentList[index].insertSubject(sub);
	}

	@Override
	public void deleteSubject(Scanner scan) {
		// 삭제할 수강코드를 입력받아 Student 클래스의 강의 삭제 
		int index = searchStudent(scan);
		//수강과목이 없다면 받지 않기.
		if (studentList[index].getCnt() != 0) {
			System.out.println("---------------------------");
			System.out.println("과목코드>");
			String subCode = scan.next();
			studentList[index].removeSubject(subCode);
			System.out.println(subCode+" 과목 수강철회 완료!");
	    }
	}


}

 

package student;

import java.util.Scanner;

public class StudentMain {
	public static void main(String[] args) {
		// 메뉴처리
		//1.학생등록|2.학생리스트출력|3.학생검색(학생정보,수강정보)|4.학생정보수정|5.학생삭제
		//6.수강신청|7.수강철회|8.종료
		
		//interface
		//7개 메뉴의 메서드 정리
		//StudentController가 구현
		//- Student class 배열처리
		
		//Student class: 학생정보
		//- 학번, 이름, 나이, 전화번호, 주소, 수강과목s (Subject class를 배열로 처리) => 포함관계
		
		//subject class : 과목정보
		//- 과목코드, 과목명, 학점, 시수, 교수명, 시간표, 강의장
		
		StudentController sc = new StudentController();
		Scanner scan = new Scanner(System.in);
		
		int menu = 0;
		do {
			System.out.println("--menu--");
			System.out.println("1.학생등록|2.학생리스트출력|3.학생검색(학생정보,수강정보)|4.학생정보수정|5.학생삭제");
			System.out.println("6.수강신청|7.수강철회|8.종료");
			System.out.println("menu>");
			
			menu = scan.nextInt();
			switch(menu) {
			case 1: sc.insertStudent(scan); break;
			case 2: sc.printStudent(); break;
			case 3: sc.searchStudent(scan); break;
			case 4: sc.modifyStudent(scan); break;
			case 5: sc.deleteStudent(scan); break;
			case 6: sc.registerSubject(scan); break;
			case 7: sc.deleteSubject(scan); break;
			case 8: System.out.println("종료!!"); break;
			default: System.out.println("없는 메뉴입니다.");
			}
			
			
		}while(menu != 8);
		
		
	}
}

 

'백엔드 > Java' 카테고리의 다른 글

Java로 고객 관리 시스템 구현  (2) 2024.10.15
객체지향 프로그래밍  (1) 2024.10.14
Java로 로또 추첨기 만들기  (1) 2024.10.12
Java 인터페이스  (0) 2024.10.11
Java로 상품 관리 시스템 구현(2)  (0) 2024.10.10