개발자입니다
[비트캠프] 55일차(11주차5일) - Java(인터페이스), myapp-19~21 본문
[비트캠프] 55일차(11주차5일) - Java(인터페이스), myapp-19~21
끈기JK 2023. 1. 20. 10:27
19. 연관을 이용한 기존 코드 재사용
### 19. 공통 코드(필드,메서드)를 공유하는 방법 : 연관(association)
- ObjectDao를 LinkedList로 바꾸고 상속 관계에서 연관으로 관계를 변경
- LinkedList는 범용으로 사용할 수 있도록 메서드를 변경
- 상속 대신 연관을 이용하여 기존 코드를 활용하는 방법
- 즉 위임 방식으로 다른 객체의 코드를 사용하는 방법
*상속을 이용한 기존 코드 사용의 문제점
ObjectDao 의 insert() 를 add() 로 변경해야 한다. 이를 상속한 BoardDao 를 사용: 메서드를 호출. 예) BoardHandler 에서 insert() 호출을 add() 호출로 변경해야 한다.
수퍼 클래스를 변경(메서드 이름 변경)하면 서브 클래스가 자동 변경된다(메서드를 상속 받기 때문에 서브클래스의 의미와 상관없이 메서드 이름이 변경된다). 서브 클래스를 사용하는 모든 곳에서 메서드 이름을 변경해야 한다. → "강 연결"
*연관(포함)을 이용한 기존 코드 재사용
insert() 를 add() 로, findAll() 을 toArray() 로, update() 를 set() 으로, delete() 를 remove() 로 변경하고, get() 및 indexOf() 는 그대로 사용한다.
ObjectDao ← 이전에 이 클래스를 만든 이유? DAO 클래스의 공통점을 추출하여 "상속"을 이용하여 DAO 끼리 공유!
ObjectDao 에서 LinkedList 로 변경하는 이유? 범용성을 높이기 위해 - 일반적인 용도로 사용, 더 많은 프로젝트에서 재사용.
remove(), indexOf() ← 객체를 찾을 때 equals() 를 사용
아래처럼 LinkedList 를 사용한다. 연관되어 있다고 볼 수 있고, 포함이라고도 볼 수 있다.
class BoardDao {
LinkedList list = new linkedList();
}
package bitcamp.myapp.dao;
import java.sql.Date;
import bitcamp.myapp.vo.Board;
import bitcamp.util.LinkedList;
public class BoardDao {
// 목록을 관리하기 위해 ObjectDao를 상속 받는 대신에
// 그와 동일한 기능을 수행하는 LinkedList 를 사용한다.
LinkedList list = new LinkedList();
int lastNo;
public void insert(Board board) {
board.setNo(++lastNo);
board.setCreatedDate(new Date(System.currentTimeMillis()).toString());
list.add(board);
}
public Board[] findAll() {
Board[] boards = new Board[list.size()];
Object[] arr = list.toArray();
for (int i = 0; i < boards.length; i++) {
boards[i] = (Board) arr[i];
}
return boards;
}
public Board findByNo(int no) {
Board b = new Board();
b.setNo(no);
int index = list.indexOf(b);
if (index == -1) {
return null;
}
return (Board) list.get(index);
}
public void update(Board b) {
int index = list.indexOf(b);
list.set(index, b);
}
public boolean delete(Board b) {
return list.remove(b);
}
}
package bitcamp.myapp.dao;
import java.sql.Date;
import bitcamp.myapp.vo.Student;
import bitcamp.util.LinkedList;
public class StudentDao {
LinkedList list = new LinkedList();
int lastNo;
public void insert(Student s) {
s.setNo(++lastNo);
s.setCreatedDate(new Date(System.currentTimeMillis()).toString());
list.add(s);
}
public Student[] findAll() {
Student[] students = new Student[list.size()];
Object[] arr = list.toArray();
for (int i = 0; i < students.length; i++) {
students[i] = (Student) arr[i];
}
return students;
}
public Student findByNo(int no) {
Student s = new Student();
s.setNo(no);
int index = list.indexOf(s);
if (index == -1) {
return null;
}
return (Student) list.get(index);
}
public void update(Student s) {
int index = list.indexOf(s);
list.set(index, s);
}
public boolean delete(Student s) {
return list.remove(s);
}
}
package bitcamp.myapp.dao;
import java.sql.Date;
import bitcamp.myapp.vo.Teacher;
import bitcamp.util.LinkedList;
public class TeacherDao {
LinkedList list = new LinkedList();
int lastNo;
public void insert(Teacher t) {
t.setNo(++lastNo);
t.setCreatedDate(new Date(System.currentTimeMillis()).toString());
list.add(t);
}
public Teacher[] findAll() {
Teacher[] teachers = new Teacher[list.size()];
Object[] arr = list.toArray();
for (int i = 0; i < teachers.length; i++) {
teachers[i] = (Teacher) arr[i];
}
return teachers;
}
public Teacher findByNo(int no) {
Teacher t = new Teacher();
t.setNo(no);
int index = list.indexOf(t);
if (index == -1) {
return null;
}
return (Teacher) list.get(index);
}
public void update(Teacher t) {
int index = list.indexOf(t);
list.set(index, t);
}
public boolean delete(Teacher t) {
return list.remove(t);
}
}
20. 배열을 이용한 목록 다루기
### 20. 배열을 이용하여 객체 목록 다루기
- 배열을 이용하여 객체 목록을 다루는 방법: ArrayList 구현
- ArrayList와 LinkedList 의 장단점 비교
- 입력 : 배열은 빠르다(index로 위치 지정). Linked List도 빠르다(마지막 노드에 덧붙인다).
- 조회 : 배열은 빠르다(인덱스로 바로 접근). Linked List는 느리다(head 노드 부터 링크를 따라가야 한다).
- 변경 : 배열은 빠르다. Linked List는 느리다(head 노드에서 지정된 위치까지 찾아가야 한다).
- 삭제 : 배열은 느리다(배열의 항목을 앞으로 당겨야한다). Linked List는 빠르다.
- 크기변경 : 가능(Garbage가 많이 생기고 느리다). 고정크기 방식이기 때문에 불필요한 메모리 점유한다. 메모리 낭비 심하다. Linked List는 제한 없다(값을 추가 할 때마다 자동증가). 메모리 낭비가 적다. 메모리 크기를 고정하지 않는다.
조회를 많이 하는 경우는 배열이 낫다. 예) 강사 정보 보관, 대학생 정보 보관 등
StudentDao, TeacherDao - 초기에 data를 입력해 놓고 조회하는 용도로 주로 사용 → LinkedList 보다 배열 방식인 ArrayList가 더 적합
StudentDao와 TeacherDao를 변경한 개발자의 마음?
ArrayList의 메서드 시그너처를 LinkedList와 같게 만들었으면 필드의 타입만 변경 했을 텐데!
→ 왜 안됐을까? 클래스를 정의하는 것은 개발자 마음이다!
→ 해결책? 구현 규칙을 정의!
인터페이스 문법을 이용하여 목록을 다루는 객체의 기능을 정의
인터페이스? 객체 사용 규칙을 정의하는 문법.
- 일관성 있는 프로그래밍 가능.
- 교체가 쉽다.
- 느슨한 연결을 지원(loose coupling). → 클래스 간의 종속성을 제거하여 변경, 교체가 쉽다. 유지보수 하기 쉽다.
《interface》 List 에 add(), toArray(), get(), set(), remove(), indexOf() 로 기능의 규격 정의
《concrete》 LinkedList, 《concrete》 ArrayList 에서 점선으로 상속 표시한다.
ArrayList : List 규격에 맞춰 클래스를 정의
StudentDao : LinkedList와 ArrayList의 사용법이 같다 프로그래밍의 일관성!
21. 인터페이스를 이용한 loose coupling 실현
### 21. 인터페이스를 이용하여 객체 목록 관리를 규격화 하기
- List 인터페이스를 구현
- ArrayList와 LinkedList는 List 규칙에 따라 재구현
- XxxDao 클래스에 인터페이스 적용
- 인터페이스를 이용하여 느슨하게 결합(loose coupling)하는 방법
《interface》 List 에 ArrayList 나 LinkedList 를 넣어도 된다.
교체하기 쉽다. 특정 클래스를 가리키지 않기 때문에 느슨한 연결이 이루어진다.
package bitcamp.myapp.dao;
import java.sql.Date;
import bitcamp.myapp.vo.Board;
import bitcamp.util.List;
public class BoardDao {
// 특정 클래스를 지정하기 보다는
// 인터페이스를 통해 관계를 느슨하게 만든다.
List list;
public BoardDao(List list) {
// List 규칙에 따라서 만든 객체를 외부에서 주입받는다.
// 이렇게 하면 이 클래스는 ArrayList 또는 LinkedList와 같은
// 특정 클래스와 관계가 없어진다.
this.list = list;
}
// 중략
}
package bitcamp.myapp.dao;
import java.sql.Date;
import bitcamp.myapp.vo.Student;
import bitcamp.util.List;
public class StudentDao {
List list;
int lastNo;
public StudentDao(List list) {
this.list = list;
}
// 중략
}
package bitcamp.myapp.dao;
import java.sql.Date;
import bitcamp.myapp.vo.Teacher;
import bitcamp.util.List;
public class TeacherDao {
List list;
int lastNo;
public TeacherDao(List list) {
this.list = list;
}
// 중략
}
package bitcamp.myapp.handler;
import bitcamp.myapp.dao.BoardDao;
import bitcamp.myapp.vo.Board;
import bitcamp.util.LinkedList;
import bitcamp.util.Prompt;
public class BoardHandler {
private BoardDao boardDao = new BoardDao(new LinkedList());
// 중략
}
package bitcamp.myapp.handler;
import bitcamp.myapp.dao.StudentDao;
import bitcamp.myapp.vo.Student;
import bitcamp.util.ArrayList;
import bitcamp.util.Prompt;
public class StudentHandler {
private StudentDao memberDao = new StudentDao(new ArrayList());
// 중략
}
package bitcamp.myapp.handler;
import bitcamp.myapp.dao.TeacherDao;
import bitcamp.myapp.vo.Teacher;
import bitcamp.util.ArrayList;
import bitcamp.util.Prompt;
public class TeacherHandler {
private TeacherDao teacherDao = new TeacherDao(new ArrayList());
// 중략
}
조언
*운전 처음 배울때는 긴장되고 어렵지만 나중에는 풍경 보면서 여유롭게 한다. 경험과 익숙함의 차이이다. 코딩도 똑같다.
*과거는 메모리와 성능 관리에 중점을 두고 코딩 했지만 현재는 유지보수의 용이성에 중점을 두고 코딩한다.
과제
/