java 인터페이스 질문입니다 ㅠㅠ

조회수 521회

java interface 부분을 공부하던 도중에 든 생각입니다.

abstract 와 interface는 편한 설계를 위해 쓰는 추상적 개념이며,

그중에 interface는 더욱 추상적인 개념이며 팀 프로젝트에 유용하다고 배웠습니다.

그러면 interface는 서로 맡은 부분만 각자의 컴퓨터에서 코딩하기 위해 쓰이는 것인가요?

그리고 만약 각자의 코딩이 끝나 합칠때 interface 클래스를 없애고 각자가 코딩한 것을 합치는 것인가요?

그리고 interface는 자기 안에 일반 메소드를 사용하지 못하게 하고, 오로지 설계만 하게끔 되어있다고

공부했는데 그 이유가 궁금합니다..

1 답변

  • 좋아요

    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 을 이용하여 일종의 설계 규격을 맞춰놓고 작업 하면, 나중에 개선이 필요하더라도 좀더 용이하게 작업을 할 수 있는 것이죠.

    위 예제는 즉흥적으로 짠것이라, 제대로 동작하는지는 논외로 봐주시고... 이러한 흐름으로도 사용 될 수 있다는 점을 알아주시면 될 것 같습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다!! 박성현 2018.7.15 01:33

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)