먼저 필요한 클래스들을 만들어준다. (Main, Handler, EnglishLinguisticStudent, ComputerScienceStudent, Student)
여기서 메인과 핸들러는 다른 패키지에 둔다.
이제 클래스의 속성을 정의하는 클래스들은 따로 묶어주고, 출력하거나 제어하는 클래스들을 따로 두어 관리 한다.
먼저 Student 클래스는 추상 클래스로 정의 해두고 Compuer 와 English가 이를 상속 받도록 둔다.
필요한 필드와 생성자 그리고 추상클래스가 가져야할 추상 메서드도 형태만 잡아 놓도록 한다. 추상메서드들은 합계를 반환, 평균반환, 정보 간단출력, 정보 자세히 출력 총 4개의 추상메서드들을 만들어준다, 그리고 필드는 전부 protected로 보호 되고 있으니 getter 와 setter를 만들어준다.
그리고 상속받는 서브클래스들로 가서 구현안된 메서드들을 오버라이딩 하면서 상속을 받아준다. 먼저 Computer의 경우
상속받는 클래스로서 슈퍼클래스의 생성자 호출말고도 필요한 부분은 매개변수로 받아서 저장시켜준다.
그리고 남아 있는 추상 메서드들도 전부 오버라이딩 해준다.
Student 클래스에서 학생들이 공통적으로 가지는 필드들은 getter와 setter를 선언해 두었으니, 컴공에서만 필요한 필드들도 getter 와 setter를 만들어준다.
이제 컴공은 끝났으니. 영문학과로 넘어 간다.
마찬가지로 생성자를 먼저 만들어준다. 이번에는 생성자 생성시 합계와 평균이 바로 구해지도록 두었다.
상속받은 추상클래스의 추상메서드들을 오버라이딩 해준다음. 컴퓨터와 마찬가지로 getter와 setter도 만들어준다.
그리고 메인으로 넘어와서 이제 학생 관리 프로그램을 만든다. 먼저 핸들러에 제어하는 함수들을 담아두고 불러 주기 위해 Handler를 handler 객체로 만들어서 static으로 선언해주고, 필요한 변수들도 선언해준다.
학생관리를 위해 do - while문을 사용하여 프로그램이 나타나도록 한다.
switch 문으로 1번 부터 차례로 만들어준다.
1번 케이스 부터 핸들러에 차곡 차곡 함수들을 작성해준다. 1번을 누르면 핸들러클래스에 저장되어 있는 학생들의 목록을 불러오게한다.
핸들러에 만드어놓은 Student 타입의 배열에 차곡 차곡 저장되어 있는 배열에서 학생들마다 오버라이딩 해서 가지고 있는 showInfo() 를 실행하게 하도록 void형 함수로 작성을 완료 하였다.
다시 Main에서 case 2 번은 학생추가로 makeEnglishLinguisticStudent(sc); 를 하면 Student 타입의 st를 반환하게 하는 함수가 있는데
아래에 작성 되어졌고 각 전공의 학생별로 만들어진 객체들은 Student 타입으로 업캐스팅 되어 반환 되도록 만들어졌다. 반환 받은 st는 다시 handler의 insert(st) 함수의 매개변수로 사용되어 전달 된다.
전달 받은 Student 객체 st는 포문을 통하여 배열의 빈곳이 있다면 그곳에 값이 담기고 1을 반환하고 실패시 0을 반환하여 메인문에서 다시 출력 하게 되어있다.
그리고 다시 Main에서 case3의 안 만들어진 함수를 만들어준다.
이름을 입력 받아 입력 받은 이름을 매개변수로 handler의 find 함수를 호출하고, 호출결과를 Student st를 반환한다. 이제 handler로 가서 find 함수를 구현해준다.
for문을 돌면서 i번째 배열에 있는 객체의 이름이 일치하는지 확인하고 일치하면 그 i번째의 객체를 반환해준다. 여기서 name은 Student에서 이미 private로 접근제한자가 걸려 있으므로, getter를 활용하여 이름을 가져와서.equals 함수로 내용이 같은지 확인하다.
handler에서 반환된 st를 메인문에서 st로 showDetail을 호출하여 학생의 정보를 출력한다.
마지막으로 4번 케이스는 3번과 유사한 구동 방식이다.
삭제할 학생또한 이름을 입력 받아서 받은 이름을 handler의 find 함수의 매개변수로 사용하여 호출하면, 그 이름을 가진 학생의 객체를 반환 받게 된다. 반환 받은 객체를 다시
handler의 delete 함수를 호출하며 매개변수로 전달하여서 성공하면 1을 실패하면 0을 반환하도록 하였고, 이제 handler의 delete 함수를 작성해준다.
handler에 작성된 코드 이고, 아까와 다른 점은 == 연산자의 경우 NullPointException이 발생하지 않아 배열의 i 번째가 빈배열 이더라도 예외가 발생하지 않아서 arr[i] != null 을 작성하지 않고 바로 arr[i]== st 라는 조건식만 사용하여 찾을 수 있다.
남은 핸들러의 메서드까지 완성이 되면 메인문 아래의 while문 아래 프로그램 종료를 알리는 출력문과 scanner 또한 닫아주면 마무리 이다.