인터페이스 : 추상메서드와 상수(final)로만 이루어진 것.
추상 메서드 : 메서드의 선언부만 있고, 구현부가 없는 메서드
추상메서드가 포함되어있는 추상클래스/인터페이스 => 반드시 구현해야 객체를 생성할 수 있음.
인터페이스 키워드 : interface
- 추상클래스 : 대부분 상속을 하기위해 사용
- 인터페이스 : 메뉴얼 화 / 상속을 하기위해 사용
- 기능요약서라고 함.
- 상속키워드: extends / 구현키워드 : implement
- 인터페이스는 멤버변수를 포함하지 않기 떄문에, 이부분을 염두에 두고 메서드 정리를 해야함.
- 상속 : 다중상속 불가능
- 구현 : 다중구현 가능
- 상속 + 구현 동시에 가능
Student, Subject 클래스를 만들어서
Controller , main 구현해보기
interface로 일단 필요한 기능들 구현해놓고
public interface Program {
/*
* 1.학생등록 | 2.학생리스트출력 | 3.학생검색(학생정보, 수강정보) | 4.학생정보수정 | 5.학생삭제 | 6.수강신청 | 7.수강철회 | 8.종료
*/
void insertStudent(Scanner scan);
void printStudent();
void searchStudent(Scanner scan);
void modifyStudent(Scanner scan);
void deleteStudent(Scanner scan);
void registerSubject(Scanner scan);
void deleteSubject(Scanner scan);
}
모든 코드에 getter /setter 는 길어서 생략 들어가있음.
public class Subject {
private String su_code;
private String su_name;
private int su_point;
private int su_time;
private String su_proName;
private String timetable;
private String su_place;
public Subject() {
}
public Subject(String su_code, String su_name) {
this.su_code = su_code;
this.su_name = su_name;
}
public Subject(String su_code, String su_name, int su_point, int su_time, String su_proName, String timetable,
String su_place) {
this.su_code = su_code;
this.su_name = su_name;
this.su_point = su_point;
this.su_time = su_time;
this.su_proName = su_proName;
this.timetable = timetable;
this.su_place = su_place;
}
public void insertSubject(String su_code, String su_name, int su_point, int su_time, String su_proName, String timetable,
String su_place) {
this.su_code = su_code;
this.su_name = su_name;
this.su_point = su_point;
this.su_time = su_time;
this.su_proName = su_proName;
this.timetable = timetable;
this.su_place = su_place;
}
@Override
public String toString() {
return "Subject [su_code=" + su_code + ", su_name=" + su_name + ", su_point=" + su_point + ", su_time="
+ su_time + ", su_proName=" + su_proName + ", timetable=" + timetable + ", su_place=" + su_place + "]";
}
과목 구성 : 과목코드, 과목명, 학점, 시수 , 교수명, 시간표, 강의장 7가지로 구성
생성자와 과목추가 메서드까지 구현
public class Student {
private String st_num;
private String st_name;
private int st_age;
private String tel;
private String st_home;
private Subject[] sj = new Subject[10];
private int number;
private int cnt;
public Student() {
}
public Student(String st_num, String st_name, String tel) {
this.st_num = st_num;
this.st_name = st_name;
this.tel = tel;
}
public Student(String st_num, String st_name, int st_age, String tel , String st_home) {
this.st_num = st_num;
this.st_name = st_name;
this.st_age = st_age;
this.tel = tel;
this.st_home = st_home;
}
public void insertSt(String st_num, String st_name, int st_age, String tel , String st_home) {
this.st_num = st_num;
this.st_name = st_name;
this.st_age = st_age;
this.tel = tel;
this.st_home = st_home;
}
public void printSj() {
if(cnt != 0 && sj != null ) {
for(int i = 0; i < cnt; i ++) {
if(sj[i] != null) {
System.out.println(sj[i]);
}
}
} else {
System.out.println("등록된 과목이 없습니다.");
}
}
public void registerSubject(Scanner scan) {
if (cnt == sj.length) {
Subject[] tmp = new Subject[sj.length + 5];
System.arraycopy(sj, 0, tmp, 0, cnt);
sj = tmp;
}
System.out.println("신청할 수강 정보를 입력해주세요 ( 과목코드, 과목명, 학점, 시수, 교수명, 시간표, 강의장 순서 )");
String su_code = scan.next();
String su_name = scan.next();
int su_point = scan.nextInt();
int su_time = scan.nextInt();
String su_proName = scan.next();
String timetable = scan.next();
String su_place = scan.next();
Subject sub = new Subject();
sub.insertSubject(su_code, su_name, su_point, su_time, su_proName, timetable, su_place);
sj[cnt] = sub;
cnt++;
System.out.println("과목이 등록되었습니다: " + sub);
}
public void deleteSubject(Scanner scan) {
if(cnt == 0) {
System.out.println("수강중인 과목이 없습니다.");
return;
}
System.out.println("삭제할 과목명을 입력해주세요");
String delName = scan.next();
int index = -1; // 없는 번지를 기본값으로 설정
for (int i = 0; i < cnt; i++) {
if (sj[i].getSu_name().equals(delName)) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("해당 과목이 목록에 없습니다.");
}
int copyCnt = sj.length - index - 1;
System.arraycopy(sj, index + 1, sj, index, copyCnt);
sj[cnt - 1] = null;
cnt--;
}
@Override
public String toString() {
return "Student [st_num=" + st_num + ", st_name=" + st_name + ", st_age=" + st_age + ", tel=" + tel
+ ", st_home=" + st_home + "]";
}
학생 구성 : 학번, 이름 나이, 전화번호, 사는곳 5가지로 구성하였고
학생이 수강하고있는 수강과목들을 subject 클래스를 배열로해서 받아주게 만듬.
생성자와 학생추가 메서드를 구현하고
컨트롤러에서 사용 할 과목 배열에 수강정보를 추가 / 삭제하는 메서드를 구현해줌.
삭제하는 메서드는 배열복사를 이용.
public class StudentController implements Program {
// 멤버변수 추가
private Student[] s = new Student[10];
private int cnt = 0;
@Override
public void insertStudent(Scanner scan) {
if (cnt == s.length) {
// 5개 더 많은 길이의 배열을 생성
Student[] tmp = new Student[s.length + 5];
// 배열 복사 기존배열의 0 번지부터 새배열으ㅏ 0번지부터 복사 cnt 개수만큼
System.arraycopy(s, 0, tmp, 0, cnt);
s = tmp;
}
System.out.println("학번,이름,나이,전화번호,주소를 순서대로 입력해주세요");
String st_num = scan.next();
String st_name = scan.next();
int st_age = scan.nextInt();
String st_tel = scan.next();
String st_home = scan.next();
Student st = new Student();
st.insertSt(st_num, st_name, st_age, st_tel, st_home);
st.setNumber(cnt + 1);
s[cnt] = st;
cnt++;
}
@Override
public void printStudent() {
if (cnt == 0) {
System.out.println("학생이 없습니다. 추가해주세요");
} else {
for (int i = 0; i < cnt; i++) {
System.out.println(s[i]);
}
}
}
@Override
public void deleteStudent(Scanner scan) {
System.out.println("삭제할 학생명을 입력해주세요");
String delName = scan.next();
int index = -1; // 없는 번지를 기본값으로 설정
for (int i = 0; i < cnt; i++) {
if (s[i].getSt_name().equals(delName)) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("해당 학생이 목록에 없습니다.");
}
int copyCnt = s.length - index - 1;
System.arraycopy(s, index + 1, s, index, copyCnt);
s[cnt - 1] = null;
cnt--;
printStudent();
}
public void deleteStudent2(Scanner scan) {
System.out.println("삭제할 학생명을 입력해주세요");
String delName = scan.next();
boolean found = false;
for (int i = 0; i < cnt; i++) {
if (s[i].getSt_name().equals(delName)) {
for (int j = i; j < cnt - 1; j++) {
s[j] = s[j + 1];
s[j].setNumber(j + 1);
}
s[cnt - 1] = null;
cnt--;
found = true;
break;
}
}
if (!found) {
System.out.println("해당 학생이 목록에 없습니다.");
}
printStudent();
}
@Override
public void modifyStudent(Scanner scan) {
System.out.println("수정할 학생명을 입력해주세요");
String modifyName = scan.next();
boolean found = false;
for (int i = 0; i < cnt; i++) {
if (s[i].getSt_name().equals(modifyName)) {
System.out.println("수정 정보를 입력해주세요(학번,이름,나이,번호,사는곳 순서로 입력)");
String st_num = scan.next();
String st_name = scan.next();
int st_age = scan.nextInt();
String st_tel = scan.next();
String st_home = scan.next();
s[i].setSt_num(st_num);
s[i].setSt_name(st_name);
s[i].setSt_age(st_age);
s[i].setTel(st_tel);
s[i].setSt_home(st_home);
found = true;
break;
}
}
if (!found) {
System.out.println("해당 학생이 목록에 없습니다.");
}
}
@Override
public void searchStudent(Scanner scan) {
System.out.println("검색할 학생명을 입력해주세요");
String searchName = scan.next();
boolean found = false;
for (int i = 0; i < cnt; i++) {
if (s[i].getSt_name().equals(searchName)) {
System.out.println(s[i]);
s[i].printSj();
found = true;
break;
}
}
if (!found) {
System.out.println("해당 학생이 목록에 없습니다.");
}
}
@Override
public void registerSubject(Scanner scan) {
System.out.println("과목을 등록할 학생의 이름을 입력해주세요:");
String studentName = scan.next();
boolean found = false;
for (int i = 0; i < cnt; i++) {
if (s[i].getSt_name().equals(studentName)) {
s[i].registerSubject(scan);
found = true;
break;
}
}
if (!found) {
System.out.println("해당 학생이 목록에 없습니다.");
}
}
@Override
public void deleteSubject(Scanner scan) {
System.out.println("과목을 삭제할 학생의 이름을 입력해주세요:");
String studentName = scan.next();
boolean found = false;
for (int i = 0; i < cnt; i++) {
if (s[i].getSt_name().equals(studentName)) {
s[i].deleteSubject(scan);
found = true;
break;
}
}
if (!found) {
System.out.println("해당 학생이 목록에 없습니다.");
}
}
}
인터페이스 했던걸 implements 구현.
학생 클래스를 배열로 받아와주고 메인에서 사용할 출력, 학생 추가 / 삭제 / 수정 / 검색 , 과목 추가 / 삭제
메서드 7가지를 구현해줌.
delete2는 학생을 따로 넘버링해서 학생고유번호로 삭제하는방법을 사용해볼까하고 student 클래스에 number을 만들어서 구현해보았는데 학생명으로 검색해서 보는게 지금 구현하는기능에 더 맞는거같아서 사용하진않고 delete2로 따로 빼둠.
student 클래스에서 구현한 과목 추가 / 삭제메서드를 내가 원하는 학생을 찾아서 그 학생의 과목배열에 추가 / 삭제 될 수 있도록 구현해주었음.
public class StudentMain {
public static void main(String[] args) {
/*
* 메뉴처리 1.학생등록 | 2.학생리스트출력 | 3.학생검색(학생정보, 수강정보) | 4.학생정보수정 | 5.학생삭제 | 6.수강신청 |
* 7.수강철회 | 8.종료
*/
StudentController sc = new StudentController();
Scanner scan = new Scanner(System.in);
int menu = 0;
do {
// 메뉴를 받을 때 필요, 상품을 받을 때 필요
// 스캐너를 매개변수로 전달
System.out.println(
"메뉴를 선택해주세요 1.학생등록 | 2.학생리스트출력 | 3.학생검색(학생정보, 수강정보) | 4.학생정보수정 | 5.학생삭제 | 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);
scan.close();
}
}
실행 할 수 있는 메인을 구현해주면 끝.
'자바 수업 정리' 카테고리의 다른 글
수업정리 12일차. (5) | 2024.10.07 |
---|---|
수업정리 11일차. (0) | 2024.10.04 |
수업정리 9일차. (1) | 2024.09.30 |
자바 설정 관련 (1) | 2024.09.25 |
수업정리 8일차. (3) | 2024.07.24 |