**학사 관리 프로젝트**
[ 요구사항 ]
학교 구성원 정보를 관리하는 시스템을 구축하고자 한다
학교 구성원은 학생 , 교사 , 직원이 있다
학생은 전화번호 이름 주소 학번 정보로 구성된다
교사는 전화번호 이름 주소 과목 정보로 구성된다
직원은 전화번호 이름 주소 부서 정보로 구성된다
-시스템 주요 기능
1. 구성원 등록(추가)
학교 구성원(학생,교사,직원) 정보를 추가할 수 있다
전화번호는 유일해야 하므로 등록(추가)시 기존 구성원 전화번호가
동일한 번호가 있을 경우 추가되어서는 안된다
0101231234 tel 이 중복되므로 등록될 수 없습니다! --> 메세지 출력
2. 전체 구성원 리스트 출력
3. 구성원 검색
전화번호로 구성원 정보를 검색할 수 있다
구성원 정보가 없을 때 null을 반환한다
4. 구성원 삭제
전화번호로 구성원 정보를 삭제할 수 있다
[ 진행 과정 ]
- class diagram 도출
-VO(Value Object) 계열 클래스 구현 (Person, Student, Teacher, Employee) - 테스트 클래스(TestSchoolService) 와 비즈니스 로직 클래스(SchoolService)를 정의
- 구성원 정보를 추가하고 전체 리스트를 출력을 구현해서 확인
(중복호가인 같은 제역조건은 일단 뺀다) - 구성정 정보를 tel을 이용해 검색
- 구성정 정보를 tel을 이용해 삭제
SchoolService
> 인스턴스 변수
list : Array(바구니)
> 메서드
1. 추가 (insert) : 동일한 tel X
2. 검색 (select) : tel이 일치하면 검색해서 반환한다
3. 삭제 (delete) : tel이 일치하면 list에서 삭제한다
* 3개의 메서드 모두 동일한 tel이 있는지와 있으면 인덱스 반환(findByTel)
→ 요구사항의 공통적인 기능은 tel에 대해 구성원 정보를 저장하는 리스트에 존재한는지 여부와 존재한다면 리스트 몇번 째 요소인지이다. 이러한 공통기능을 수행하는 별도의 메서드를 만들고, 3.4.5 구현 시, 재사용하면 생산성이 높아질 수 있다.
→ 메서드 추가
* 매개변수로 전달된 tel과 리스트의 요소 내의 구성원 tel과 비교해서
* 일치하는 요소가 없으면 -1을 반환,
* 일치하는 요소가 있으면 리스트 요소의 인덱스를 반환하는 메서드
Test Class
: 비즈니스 로직을 담당하는 SchoolService를 단위 테스트하는 클래스
/TestSchoolService.java
package test;
import model.Employee;
/*
* 비즈니스 로직을 담당하는 SchoolService를 단위 테스트하는 클래스
*/
import model.*;
public class TestSchoolService {
public static void main(String[] args) {
SchoolService service = new SchoolService();
service.addPerson(new Student("0101231234", "데이빗", "용인", "17"));
service.addPerson(new Teacher("0101231235", "알렉스", "수지", "국어"));
service.addPerson(new Student("0101231236", "엠마", "수원", "16"));
service.addPerson(new Employee("0101231237", "챨리", "화성", "재무부"));
service.addPerson(new Student("0101231238", "리챠드", "용인", "18"));
service.addPerson(new Teacher("0101231239", "앨리스", "용인", "수학"));
System.out.println("**구성원 전체 등록 시작**");
System.out.println("**구성원 전체 등록 완료**");
service.printAll();
/* 출력값:
* [tel=0101231234, name=데이빗, address=용인, stuId=17]
* [tel=0101231235, name=알렉스,address=수지, subject=국어]
* [tel=0101231236, name=엠마, address=수원, stuId=16]
* [tel=0101231237, name=챨리, address=화성, department=재무부]
* [tel=0101231238,name=리챠드, address=용인, stuId=18]
* [tel=0101231239, name=앨리스, address=용인, subject=수학]
*/
System.out.println("\n**findIndexByTel() TEST**");
// 존재하는 tel
System.out.println("존재 O :"+service.findIndexByTel("0101231236")); //5
// 존재하지 않은 tel
System.out.println("존재 X :"+service.findIndexByTel("123")); //-1
System.out.println("**findIndexByTel() TEST 끝**");
System.out.println("\n**findPersonByTel() TEST**");
Person p = service.findPersonByTel("0101231236");
System.out.println("검색결과: "+p+"]");
/*출력값:
* 검색결과: [tel=0101231239, name=앨리스, address=용인, subject=수학]
*/
System.out.println("\n**removePeronByTel() TEST**");
Person rp = service.removePeronByTel("0101231236");
System.out.println("삭제대상: "+ rp+"]");
System.out.println("\n삭제 후 리스트 확인");
service.printAll();
System.out.println("\n**추가 시 중복확인**");
//존재하는 전화번호의 구성원이 추가되려고 할 때
service.addPerson(new Student("0101231234", "크리스탈", "용인", "17"));
System.out.println("\n**중복테스트 후 리스트 확인**");
service.printAll();
/* 출력값 :
* **추가 시 중복확인**
* 추가 시 중복확인 tel이 중복되어 추가할 수 없습니다.
*
* **중복테스트 후 리스트 확인**
* [tel=0101231234, name=데이빗, address=용인, stuId=17]
* [tel=0101231235, name=알렉스, address=수지, subject=국어]
* [tel=0101231237, name=챨리, address=화성, department=재무부]
* [tel=0101231238, name=리챠드, address=용인, stuId=18]
* [tel=0101231239, name=앨리스, address=용인, subject=수학]
*/
}
}
비즈니스 로직 Class
: 시스템 내에서 비즈니스 로직을 담당하는 클래스 * (업무를 담당)
/SchoolService.java
package model;
import java.util.ArrayList;
/*
* Service : 시스템 내에서 비즈니스 로직을 담당한다
* (업무를 담당)
*/
public class SchoolService {
private ArrayList<Person> list = new ArrayList<Person>();
// 1. 구성원 등록(추가)
// : 매개변수로 부모변수를 선언하면,
// 다양한 자식객체를 하나의 메서드에서 처리할 수 있다(다형성)
public void addPerson(Person p) {
if (findIndexByTel(p.getTel()) == -1) //존재하지 않으면 추가
list.add(p);
else
System.out.println("tel이 중복되어 추가할 수 없습니다.");
}
//2. 전체 구성원 리스트 출력
public void printAll() {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i)+"]");
}
}
/**
* 매개변수로 전달된 tel과 리스트의 요소 내의 구성원 tel과 비교해서
* 일치하는 요소가 없으면 -1을 반환,
* 일치하는 요소가 있으면 리스트 요소의 인덱스를 반환하는 메서드
* @param tel
* @return
*/
// 추가) tel로 list의 인덱스 찾는 메서드
public int findIndexByTel(String tel) {
int index = -1;
for (int i = 0; i <list.size(); i++) {
if (tel.equals(list.get(i).getTel())) {
index = i;
break;
}
}
return index;
}
//3. 구성원 검색
public Person findPersonByTel(String tel) {
Person p = null;
int position = findIndexByTel(tel);
if (position != -1) {
p = list.get(position);
}
return p;
}
//4. 구성원 삭제
public Person removePeronByTel(String tel) {
Person p = null;
int position = findIndexByTel(tel);
if (position != -1) {
p = list.get(position);
list.remove(position);
}
return p;
}
}
VO class
/Person.java
package model;
public abstract class Person {
private String tel;
private String name;
private String address;
public Person(String tel, String name, String address) {
this.tel = tel;
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "[tel=" + tel + ", name=" + name + ", address=" + address+ ", ";
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
/Student.java
package model;
public class Student extends Person{
private String stuId;
public Student(String tel, String name, String address, String stuId) {
super(tel, name, address);
this.stuId = stuId;
}
@Override
public String toString() {
return super.toString()+"stuId=" + stuId;
}
public String getStuId() {
return stuId;
}
public void setStuId(String stuId) {
this.stuId = stuId;
}
}
/Teacher.java
package model;
public class Teacher extends Person {
private String subject;
public Teacher(String tel, String name, String address, String subject) {
super(tel, name, address);
this.subject = subject;
}
@Override
public String toString() {
return super.toString() + "subject=" + subject;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
/Employee.java
package model;
public class Employee extends Person {
private String department;
public Employee(String tel, String name, String address, String department) {
super(tel, name, address);
this.department = department;
}
@Override
public String toString() {
return super.toString() + "department=" + department;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}