## 18. 인스턴스 목록 제어 기능을 별도의 클래스로 캡슐화: 재사용성 높임
- 핸들러에서 인스턴스 목록을 다루는 기능을 별도의 클래스로 분리
- UI가 CLI에서 윈도우 또는 웹으로 바뀌더라도 인스턴스 목록 다루는 기능은 재사용 가능
- 배열 크기 자동 증가 기능 추가
인스턴스 목록 제어 기능을 별도의 클래스로 캡슐화: 재사용성 높임
핸들러에서 인스턴스 목록을 다루는 기능을 별도의 클래스로 분리
ㄴ UI가 CLI에서 윈도우 또는 웹으로 바뀌더라도 인스턴스 목록 다루는 기능은 재사용 가능
ㄴ MemberList 클래스 생성
MemberList.java
ㄴ MemberHandler 클래스에 있는 인스턴스 목록을 다루는 변수들을 MemberList 클래스로 이동
MemberHandler.java
=>
MemberList.java
ㄴ MemberList 클래스에 add(Member m) 메서드를 선언
ㄴ members[this.length++] = m; 코드를 MemberList 클래스의 add 메서드 안으로 이동시킴
- Member 객체 배열인 members 에 Member 객체 m 을 받아와서 저장
- 배열 members의 length 인덱스 위치에 Member 객체 m을 저장하고, length 값을 1 증가시킴
- 이를 통해 새로운 Member 객체를 배열에 추가할 수 있음
MemberHandler.java
ㄴ MemberList 를 사용하기 위해 코드 추가
MemberHandler.java
ㄴ MemberList 의 add 메서드 사용하기 위해 코드 추가
MemberList.java
ㄴ MemberHandler 클래스에 있던 available() 메서드를 MemberList 클래스로 가져옴
=> MemberList 클래스에서 사용하기 위함
MemberList.java
ㄴ add 메서드의 리턴값을 boolean 으로 변경
MemberList.java
ㄴ length 가 MAX_SIZE 보다 크다면 false 를 리턴하고 아니라면 members 에 받아온 회원정보를 저장하고 true 를 리턴함
MemberHandler.java
ㄴ 입력 받는 부분과 if 문의 위치를 서로 바꾼 후 if 문 안에 조건을 !this.available() 에서 !this.list.add(m) 으로 변경
MemberList.java
ㄴ Member[] 타입의 list() 라는 메서드를 생성한 후 리턴할 값을 담을 배열을 생성
ㄴ 원본 배열에서 입력된 인스턴스 주소를 꺼내 새 배열에 담음
ㄴ 새 배열을 리턴
MemberHandler.java
ㄴ Member 객체 배열 arr 에 MemberList 의 list() 실행하여 배열을 받음
MemberHandler.java
ㄴ arr 배열을 출력하면 되므로 this.members[i] -> arr[i], this.length -> arr.length 로 변경
ㄴ for 문 표현을 다르게 바꿔줌 (향상된 for 문)
MemberList.java
ㄴ MemberHandler 클래스의 viewMember() 에서 for 문 가져옴
=>
MemberList.java
ㄴ 입력 받은 no 값에 맞는 객체가 있으면 해당 객체 리턴, 없으면 null 리턴
MemberHandler.java
ㄴ MemberList 에 있는 get 을 사용하기 위해 위와 같이 선언
MemberHandler.java
ㄴ MemberList 클래스의 get(memberNo) 메서드를 실행하여 해당 번호에 해당하는 객체가 없다면 "해당 번호의 직원이 없습니다!" 출력하고, 그렇지 않다면 이름, 전화번호, 직책을 출력
(if 문에 있던 출력문과 바깥쪽에 있던 출력문 순서를 바꿨음)
MemberHandler.java
ㄴ viewMember() 메서드에서 사용했던 존재확인 코드 붙여넣기
MemberHandler.java
ㄴ 코드 리팩토링
MemberHandler.java
ㄴ MemberHandler 클래스의 해당 부분 복사하여 MemberList 클래스로 이동
MemberList.java
ㄴ boolean 리턴 타입의 delete(int no) 메서드 생성한 후 MemberHandler 클래스에서 잘라내온 코드 붙여넣기
MemberList.java
ㄴ delete(int no) 메서드가 indexOf(int memberNo) 메서드를 사용하므로 MemberHandler 클래스에 있는 indexOf(int memberNo) 메서드를 잘라내어 가져옴
MemberList.java
ㄴ MemberList 에서 boolean 타입의 delete 를 생성해주고 no 를 받아서 존재하는 no 인지 확인하고 i+1 번째의 객체를 i 번째로 하나씩 모두 당겨줌
ㄴ 만약 삭제하려는 항목이 마지막 인덱스의 항목이라면 마지막 인덱스의 값만 0으로 초기화 시키기
ㄴ 그 밖에는 해당 인덱스부터 반복하면서 앞 인덱스의 값을 당겨오기
ㄴ 맨 끝에 빈 배열은 null 로 초기화 해주고 true 값을 리턴하여 삭제 되었음을 의미함
MemberHandler.java
ㄴ memberNo 리팩토링 필요
=>
MemberHandler.java
ㄴ 리팩토링 결과
BoardHandler 와 ItemHandler 클래스도 MemberHandler 클래스와 비슷하게 하면됨
ㄴ 인스턴스 목록을 다루는 기능을 별도의 클래스 BoardList, ItemList 로 분리
ㄴ 하지만, 추가적으로 BoardList 클래스에서 add() 메서드 작성 시 배열 크기 자동 증가 기능 추가 할 필요가 있음
배열 크기 자동 증가 기능 추가
BoardList.java
BoardList.java
ㄴ BoardHandler 클래스에 있는 available() 메서드를 BoardList 클래스로 가져옴
BoardList.java
ㄴ 이제 배열 크기를 자동으로 증가 시키는 기능으로 바꿀 것이므로 MAX_SIZE 가 아닌 DEFAULT_SIZE 로 변경해줌
=>
BoardList.java
=>
BoardList.java
ㄴ boards.length >> 1 은 boards.length / 2 를 의미함
ㄴ 현재의 length 가 Board 객체 배열의 크기와 같아지면 기존 배열 보다 50% 더 큰 배열을 새로 만들어서 기존 배열의 값을 새 배열로 복사하고, boards 레퍼런스가 새 배열을 가리키도록 함
BoardList.java
ㄴ add 메서드의 리턴 타입을 void 로 변경하고 return 제거
ㄴ 해당 코드를 increase() 메서드를 생성하여 increase() 메서드로 이동시킴
=>
BoardList.java
BoardList.java
ㄴ 분리한 increase() 메서드를 호출해줌
BoardList.java
ㄴ 해당 메서드는 이제 사용하지 않으므로 제거