java 인터페이스 질문입니다 ㅠㅠ
조회수 521회
java interface 부분을 공부하던 도중에 든 생각입니다.
abstract 와 interface는 편한 설계를 위해 쓰는 추상적 개념이며,
그중에 interface는 더욱 추상적인 개념이며 팀 프로젝트에 유용하다고 배웠습니다.
그러면 interface는 서로 맡은 부분만 각자의 컴퓨터에서 코딩하기 위해 쓰이는 것인가요?
그리고 만약 각자의 코딩이 끝나 합칠때 interface 클래스를 없애고 각자가 코딩한 것을 합치는 것인가요?
그리고 interface는 자기 안에 일반 메소드를 사용하지 못하게 하고, 오로지 설계만 하게끔 되어있다고
공부했는데 그 이유가 궁금합니다..
1 답변
-
interface 는 여러 용도로 사용 될 수 있습니다.
예를 들어볼게요. 어플리케이션에서 사용자가 취할수 있는 Action 들이 있고, 각 Action 에 대해서는 메뉴를 통해 redo, undo 를 지원해야 합니다. 팀의 각 구성원들은 Action 들을 구현하도록 작업을 분담 하였다고 가정해볼게요.
먼저 작업을 위해 아래와 같은 interface 와 abstract class 를 설계 했습니다. 이제 각 구성원들은 이를 이용해서 각자 맡은 Action 에 대한 디테일한 내용을 구현해야 합니다.
interface Action { void run(); void redo(); void undo(); }
abstract class RecordableAction implements Action { static final int NO_ACTION = -1; private List<ActionRecord> actionList = new ArrayList<>(); private int currentActionPosition = NO_ACTION; @Override public void run() { final ActionRecord record = performRun(); //유저가 실행한 action 에 대한 기록을 list 에 저장합니다 ..... } @Override public void undo() { //해당 action 에 대해 performUndo() 를 호출하여 실제 action 에 대한 undo 동작을 실행합니다 performUndo(actionList.get(currentActionPosition)); } @Override public void redo() { //해당 action 에 대해 performRedo() 를 호출하여 실제 action 에 대한 redo 동작을 실행합니다 performRunWithRecord(actionList.get(currentActionPosition)); } abstract ActionRecord performRun(); abstract void performRunWithRecord(ActionRecord record); abstract void performUndo(ActionRecord record); }
이제 RecordableAction 을 확장하여 실제 Action 동작을 구현해봅니다. 어떤 것에대한 create action 을 예로 들어볼게요.
class CreateAction extends RecordableAction { @Override ActionRecord performRun() { //do something create action final ActionRecord record = new ActionRecord(); //record 에 create action 에 대한 상세 기록 저장 return record; } @Override void performRunWithRecord(ActionRecord record) { //do something create action with record } @Override void performUndo(ActionRecord record) { //create 에 대한 undo 는 일반적으로 delete 가 될 것 입니다 new DeleteAction().performRunWithRecord(record); } }
그럼 이제 버튼이 눌렸을때 Create Action 을 실행하도록 예제코드를 구성해보면,
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ final Action createAction = new CreateAction(); createAction.run(); } });
만약 위 예제에서 Action 이라는 interface 와 RecordableAction 이라는 추상클래스를 설계 해놓지 않고 작업을 분담 했다면 어땠을까요? 각 구성원들이 저마다 각각 자신들의 생각으로 Action 을 구현 할 것이고, redo undo 를 위한 연계 작업에 많은 어려움이 있을 것입니다. 따라서 interface 와 abstract 을 이용하여 일종의 설계 규격을 맞춰놓고 작업 하면, 나중에 개선이 필요하더라도 좀더 용이하게 작업을 할 수 있는 것이죠.
위 예제는 즉흥적으로 짠것이라, 제대로 동작하는지는 논외로 봐주시고... 이러한 흐름으로도 사용 될 수 있다는 점을 알아주시면 될 것 같습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력