package management;
import java.util.Scanner;
import model.ComputerScieneceStudent;
import model.EnglishLinguisticStudent;
import model.Student;
public class Main {
private static Handler handler = new Handler();
public static void main(String[] args) {
Student st = null;
Scanner sc = new Scanner(System.in);
int select, row, index;
String name;
System.out.println("\n\t학생 관리 프로그램\n");
do {
System.out.println("1. 목록");
System.out.println("2. 추가");
System.out.println("3. 검색");
System.out.println("4. 삭제");
System.out.println("5. 삭제(index를 활용한 삭제)");
System.out.println("0. 종료");
System.out.print("선택 >>> ");
select = Integer.parseInt(sc.nextLine());
switch(select) {
case 1:
handler.showList();
break;
case 2:
System.out.println("학생 유형을 선택하세요 (1. 영문과 | 2. 컴공과) : ");
select = Integer.parseInt(sc.nextLine());
if(select == 1) st = makeEnglishLinguisticStudent(sc);
if(select == 2) st = makeComputerScienceStudent(sc);
row = handler.insert(st);
System.out.println(row == 1 ? "추가 성공" : "추가 실패");
break;
case 3:
System.out.print("검색할 학생의 이름을 입력하세요 : ");
name = sc.nextLine();
st = handler.find(name); // 이름을 전달하여 일치하는 학생을 찾기
if(st != null) st.showDetail();
else System.out.println(name + " 학생을 찾을 수 없습니다");
break;
case 4:
System.out.print("삭제할 학생의 이름을 입력하세요 : ");
name = sc.nextLine();
st = handler.find(name); // 이름을 전달받아서, 이름이 일치하는 학생 객체를 반환
row = handler.delete(st); // 그 학생을 전달하여 배열에서 제거
System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
break;
case 5:
System.out.print("삭제할 학생의 이름을 입력하세요 : ");
name = sc.nextLine();
index = handler.indexOf(name);
row = handler.delete(index);
System.out.println(row == 1 ? "삭제 성공" : "삭제 실패");
break;
}
} while(select != 0);
sc.close();
System.out.println("종료");
}
private static Student makeComputerScienceStudent(Scanner sc) {
String name;
int kor, eng, mat, java, network, linux;
System.out.print("이름 입력 : "); name = sc.nextLine();
System.out.print("국어 입력 : "); kor = Integer.parseInt(sc.nextLine());
System.out.print("영어 입력 : "); eng = Integer.parseInt(sc.nextLine());
System.out.print("수학 입력 : "); mat = Integer.parseInt(sc.nextLine());
System.out.print("자바 입력 : "); java = Integer.parseInt(sc.nextLine());
System.out.print("네트워크 입력 : "); network = Integer.parseInt(sc.nextLine());
System.out.print("리눅스 입력 : "); linux = Integer.parseInt(sc.nextLine());
Student st = new ComputerScieneceStudent(name, kor, eng, mat, java, network, linux);
return st;
}
private static Student makeEnglishLinguisticStudent(Scanner sc) {
String name;
int kor, eng, mat, literature, translation;
System.out.print("이름 입력 : "); name = sc.nextLine();
System.out.print("국어 입력 : "); kor = Integer.parseInt(sc.nextLine());
System.out.print("영어 입력 : "); eng = Integer.parseInt(sc.nextLine());
System.out.print("수학 입력 : "); mat = Integer.parseInt(sc.nextLine());
System.out.print("문학 입력 : "); literature = Integer.parseInt(sc.nextLine());
System.out.print("번역 입력 : "); translation = Integer.parseInt(sc.nextLine());
Student st = new EnglishLinguisticStudent(name, kor, eng, mat, literature, translation);
return st;
}
}
package management;
import model.Student;
public class Handler {
private Student[] arr = new Student[10];
// 목록
public void showList() {
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null) {
arr[i].showInfo();
}
}
System.out.println();
}
// 추가
public int insert(Student st) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] == null) {
arr[i] = st;
return 1;
}
}
return 0;
}
// 검색
public Student find(String name) { // 배열을 다룰 때에는 배열의 자료형을 확인하고 진행하자
for(int i = 0; i < arr.length; i++) { // 학생의 배열이므로, 각 배열의 칸(arr[i]) 에는 학생 객체가 담길 수 있다
if(arr[i] != null && arr[i].getName().equals(name)) { // 빈칸이 아닌곳의 학생의 이름이 전달받은 이름과 일치하면
return arr[i]; // 그 학생객체를 반환한다
}
}
return null;
}
// 삭제
public int delete(Student st) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] == st) { // == 연산자는 NullPointerException 을 발생시키지 않는다
// . 왼쪽이 null이면 NullPointerException 이 발생한다
arr[i] = null;
return 1;
}
}
return 0;
}
// find는 객체를 반환하지만, indexOf는 객체가 위치하는 배열의 index를 반환하게 만든다
public int indexOf(String name) {
for(int i = 0; i < arr.length; i++) {
if(arr[i] != null && arr[i].getName().equals(name)) {
return i;
}
}
return -1;
}
public int delete(int index) {
if(arr[index] != null) { // index 번째에 객체가 있으면
arr[index] = null; // 객체를 제거하고
return 1; // 1을 반환
}
return 0; // if를 만족하지 않으면 0을 반환
}
}
과목 총점, 평균 , 학생 정보등은 전공에 따라 과목 수 등이 달라지기 때문에 추상 클래스로 처리한 것을 볼 수 있다.
package model;
public abstract class Student {
// 필드
protected String name; // protected는 같은 패키지를 포함하며,
protected int kor; // 다른 패키지라고 하더라도 상속관계에 있다면 접근을 허용한다
protected int eng;
protected int mat;
protected int sum;
protected double avg;
// 생성자
public Student(String name, int kor, int eng, int mat) {
this.name = name;
this.kor = kor;
this.eng = eng;
this.mat = mat;
}
// 추상메서드
public abstract int getSum();
public abstract double getAvg();
public abstract void showInfo(); // 이름, 합계, 평균을 한줄에 출력 (목록에서 사용)
public abstract void showDetail(); // 모든 속성값을 각 한줄마다 출력 (검색에서 사용)
// getter/setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
}
package model;
public class EnglishLinguisticStudent extends Student {
private int literature; // 문학 (영문학)
private int translation; // 번역
public EnglishLinguisticStudent(String name, int kor, int eng, int mat, int literature, int translation) {
super(name, kor, eng, mat);
this.literature = literature;
this.translation = translation;
// 상속받아서 내가 가지고 있으니까, this로 접근 가능
this.sum = kor + eng + mat + literature + translation;
// 슈퍼클래스에서 만들어진 필드이니까 super로 접근 가능
super.avg = this.sum / 5.0;
}
@Override
public void showInfo() {
System.out.printf("[영어영문학] 이름 : %s, 합계 : %d, 평균 : %.2f\n", name, sum, avg);
}
@Override
public void showDetail() {
System.out.println("[영어영문학] : " + name);
System.out.println("국어 : " + kor);
System.out.println("영어 : " + eng);
System.out.println("수학 : " + mat);
System.out.println("문학 : " + literature);
System.out.println("번역 : " + translation);
System.out.println("합계 : " + sum);
System.out.printf("평균 : %.2f\n", avg);
System.out.println();
}
@Override
public int getSum() {
return sum;
}
@Override
public double getAvg() {
return avg;
}
public int getLiterature() {
return literature;
}
public void setLiterature(int literature) {
this.literature = literature;
}
public int getTranslation() {
return translation;
}
public void setTranslation(int translation) {
this.translation = translation;
}
}
package model;
public class ComputerScieneceStudent extends Student {
private int java;
private int network;
private int linux;
public ComputerScieneceStudent(String name, int kor, int eng, int mat, int java, int network, int linux) {
super(name, kor, eng, mat);
this.java = java;
this.network = network;
this.linux = linux;
// 생성자에서 합계 평균을 구하지 않고, getter를 요청받을 때 합계와 평균을 계산하여 반환
}
@Override
public void showInfo() {
System.out.printf("[컴퓨터공학] 이름 : %s, 합계 : %d, 평균 : %.2f\n", name, getSum(), getAvg());
}
@Override
public void showDetail() {
System.out.println("[컴퓨터공학] " + name);
System.out.println("국어 : " + kor);
System.out.println("영어 : " + eng);
System.out.println("수학 : " + mat);
System.out.println("자바 : " + java);
System.out.println("네트워크 : " + network);
System.out.println("리눅스 : " + linux);
System.out.println("합계 : " + getSum());
System.out.printf("평균 : %.2f\n", getAvg());
System.out.println();
}
@Override
public int getSum() {
sum = kor + eng + mat + java + network + linux;
return sum;
}
@Override
public double getAvg() {
avg = sum / 6.0;
return avg;
}
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
public int getNetwork() {
return network;
}
public void setNetwork(int network) {
this.network = network;
}
public int getLinux() {
return linux;
}
public void setLinux(int linux) {
this.linux = linux;
}
}
package example;
import java.util.ArrayList;
public class Ex01 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("Hello");
list.add("world");
list.add("java");
System.out.println(list.indexOf("world"));
int index = list.indexOf("world");
list.remove(index);
System.out.println(list);
list.remove("Hello");
System.out.println(list);
}
}