TestCase만 보고 SchoolService 클래스 만들어보기🧐
package model;
import java.util.ArrayList;
public class SchoolService{
public ArrayList<Member> list=new ArrayList<>();
}
ArrayList generic에 타입을 Member 대신 String으로 넣었었는데 Member을 담을 리스트이므로 Member을 써줘야 함!
1. findIndexByTel method
public int findIndexByTel(String tel) {
int position=-1;
for(int i=0;i<list.size();i++) {
if(tel.equals(list.get(i).getTel())) {
position=i;
}
}
return position;
}
몇번째 index에 저장된 정보인지 알려주는 method. Boolean과 비슷해보이지만 return해야하는 정보가 true 또는 false가 아니라 0부터의 정수들이기 때문에 int 타입의 변수를 만들어주고 초기화를 -1로 잡는다.
2. addMember method
public void addMember(Member member) {
boolean check=false;
for(int i=0;i<list.size();i++)
if(member.getTel().equals(list.get(i).getTel())) {
check=true;
System.out.println(member.getTel()+"은 중복되어 등록할 수 없습니다.");
break;
}
if(check==false)
list.add(member);
}
// 가장 처음에 복습했던 코드라 boolean을 깜빡해버렸다. boolean을 안쓰니 조건(동일한 전화번호가 있는 경우 break가 걸려야 하는데 break가 걸린 후 list.add(member)을 만나기 때문에 add가 되었다.)이 만들어지지 않았다.
// add의 입력값은 메소드 값에 선언한 데이터 타입의 참조변수를 써줘야 한다.
3. printAll method
public void printAll() {
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
이건 쉬웠다!
4. findMemberByTel method
public Member findMemberByTel(String tel) { // 이따 다시 해보기(성공)
Member member=null;
for(int i=0;i<list.size();i++) {
if(tel.equals(list.get(i).getTel())) {
member=list.get(i);
}
}
return member;
}
Boolean이 아닌 리턴 값이 있는 메소드라 우선 기본 초기화를 null로 해주고 만약 중복되는 번호가 있다면 해당 정보를 member에 담아주어 리턴하는 것으로 해결해야 한다.
5. deleteMemberByTel method
public void deleteMemberByTel(String tel) {
boolean check=false;
for(int i=0;i<list.size();i++) {
if(tel.equals(list.get(i).getTel())) {
check=true;
list.remove(i);
System.out.println(tel+"에 해당하는 정보를 삭제했습니다.");
break;
}
}
if(check==false)
System.out.println(tel+"에 해당하는 구성원 정보가 없어서 삭제 불가합니다 ");
}
// boolean을 사용하지 않으면 삭제된 tel의 정보가 아래 삭제불가 sysout을 만나 출력되게 되어 boolean을 써줘야 한다.
6. updateMember method
public void updateMember(Member member) {
boolean check=false;
for(int i=0;i<list.size();i++) {
if(member.getTel().equals(list.get(i).getTel())) {
check=true;
list.set(i, member);
System.out.println(member.getTel()+"에 해당하는 구성원 정보를 수정했습니다 ");
}
}
if(check==false)
System.out.println(member.getTel()+"에 해당하는 구성원 정보가 없어 수정불가합니다 ");
}
// 여기도 마찬가지다. (특히 이 method는 boolean으로 조건을 안 만들면 더 큰일인게 수정된 이후에 정보가 없어 수정 불가하다는 메세지가 뜨기 때문에 혼란이 빚어질 수 있다.
이제 리펙토링(refactoring) 복습!
위에 작성한 SchoolService 클래스를 interface로 extract 해준다.(방법은 파일 마우스 오른쪽 클릭 -> refactor -> extract interface 누르면 아래처럼 알아서 저장해준다.
package model;
public interface SchoolServiceInterface {
int findIndexByTel(String tel);
void addMember(Member member);
void printAll();
Member findMemberByTel(String tel);
void deleteMemberByTel(String tel);
void updateMember(Member member);
}
그리고 이 인터페이스를 사용하는 클래스를 만들어준다.
package model;
import java.util.ArrayList;
public class SchoolServiceUsingInterface implements SchoolServiceInterface {
ArrayList<Member> list=new ArrayList<>();
}
1. findIndexByTel method
public int findIndexByTel(String tel) {
return -1;
}
🤮ERROR🤮
public int findIndexByTel(String tel) {
int position=-1;
for(int i=0;i<list.size();i++) {
if(tel.equals(list.get(i).getTel())) {
position=i;
}
}
return position;
}
(+ 화요일 강사님께 오버라이딩 디폴트가 꼭 있어야 하는지 이유를 물어보다가 발견한 에러
밑에서 가장 많이 쓰이는 메소드라 나도 모르게 약간 부모(?)의 개념으로 당당하게 오버라이딩 안해주고 사용했었음! 인터페이스는 물려주는 것이 아니라 구현을 강제하는 것이기 때문에 반드시 모든 메소드를 오버라이딩 해주어야 함! 기억기억기억)
2. addMember method
@Override
public void addMember(Member member) {
if(findIndexByTel(member.getTel())==-1)
list.add(member);
else System.out.println(member.getTel()+"tel이 중복되므로 등록 불가합니다.");
}
3. printAll method
@Override
public void printAll() {
for(int i=0;i<list.size();i++)
System.out.println(list.get(i));
}
4. findMemberByTel method
@Override
public Member findMemberByTel(String tel) {
int index=findIndexByTel(tel); // 내가 찾는 번호가 list의 몇번째인지 i값을 index에 할당
if(index!=-1) { //중복이면
return list.get(index);
} else {
return null;
}
}
5.deleteMemberByTel method
@Override
public void deleteMemberByTel(String tel) {
int index=findIndexByTel(tel);
if(findIndexByTel(tel)!=-1) { //중복이면
list.remove(index);
System.out.println(tel+"에 해당되는 정보를 삭제했습니다.");
} else
System.out.println(tel+"에 해당되는 정보를 찾을 수 없습니다.");
}
6.updateMember method
@Override
public void updateMember(Member member) {
int index=findIndexByTel(member.getTel());
if(findIndexByTel(member.getTel())!=-1) { //중복이면
list.set(index, member);
System.out.println(member.getTel()+"에 해당되는 정보를 수정했습니다.");
} else
System.out.println(member.getTel()+"에 해당되는 정보를 찾을 수 없습니다.");
}
코드가 한결 간결해지고 반복되는 부분이 많아서 짜기가 쉬워진다. 결과값은 변하지 않지만 내부 구조를 바꿔주면서 가독성도 좋아지고 효율성도 좋아지고 아주 좋습니다아-
**
!= -> 같지 않으면
== -> 같으면