본문 바로가기
Backend/JAVA

[JAVA] 학과 프로그램 #3 - 검색 기능 추가하기

by 그적 2020. 9. 20.

이전 학과 프로그램을 알아야 따라올 수 있는 내용이다. jihyeong-ji99hy99.tistory.com/85 를 보고 오도록 하자.

비교 메서드를 이용한 검색
: 학과가 저장하고 있는 여러 학생 정보 검색하기
(단계)
1) 이름 검색
2) 이름과 학번 검색
3) 모든 필드 검색
4) 여러 개 키워드 검색

 

이름 검색 기능  // Department 클래스의 검색 함수

void search(){
	String name = null;
	while(true){
	   System.out.print("이름: ");
	   name = s.next();
	   if(name.equals("end"))   break;
	   for(Student st : studentList){
		if(st.name.equals(name))
		   st.print();
	   }
	}
}

위와 같이 search 메서드를 정의할 수 있다. 하지만 각 클래스의 필드는 클래스 내에서만 접근하는 캡슐화 원칙에 따르면 올바른 코드가 아니다. 무슨 말이냐? 학생 객체는 Student 클래스인데, 이 비교 기능을 Student 클래스에서 맡도록 해야 한다는 것이다.

// Department 클래스
void search(){
	String name = null;
	while(true){
	   System.out.print("이름: ");
	   name = s.next();
	   if(name.equals("end"))   break;
	   for(Student st : studentList){
		if(st.matches(name))			// 학생 객체는 match 메서드를 갖고있음
		   st.print();
	   }
	}
}

// Student 클래스
boolean matches(String kwd){
	if(name.equals(kwd)	  return true;
	if(kwd.equals(id+"")    return true;	// 혹은 if((id+"").equals(kwd)) 도 가능함
	return false;
}

 

멀티 키워드 검색 기능 // 여러 키워드를 받아 모든 키워드에 다 매치되어야 한다.

// Department 클래스
void search() {
		String kwd;
		kwd = s.nextLine();
		String[] kwdArr;
		while(true) {
			System.out.print("멀티 키워드 입력 : ");
			kwd = s.nextLine();
			
			if(kwd.contentEquals("end")) break;
			
			kwdArr = kwd.split(" ");
			for(Student st: studentList) {
				if(st.matches(kwdArr)) st.print();
			}
		}
		
		while(true) {
			System.out.print("검색 키워드 입력 : ");
			kwd = s.next();
			for(Student st: studentList) {
				if(st.matches(kwd)) st.print();
			}
		}
	}

// Student 클래스
	public boolean matches(String kwd) {
		if(name.contains(kwd)) return true;
		if(kwd.length()>3 && (id+"").contains(kwd)) return true;
		if(kwd.length()>3 && phone.contains(kwd)) return true;
		if((year+"").contentEquals(kwd)) return true;
		return false;
	}

	public boolean matches(String[] kwdArr) {
		for(String kwd: kwdArr) {
			if(kwd.charAt(0) == '-' && matches(kwd.substring(1)))
				return false;
			if(kwd.charAt(0) != '-' && !matches(kwd))
				return false;
		}
		return true;
	}

 

댓글