SSISO Community

시소당

자바 인터페이스

객체지향에  대해서  공부를  하셔야  할  듯  하고요.

  

간단한  예를  들어볼까요?

  

public  interface  Pet{

          public  void  screamOut();

}

  

펫이라는  인터페이스에는  소리지르라는  메소드가  있습니다.

구현은  당연히  안되어  있죠.

이제  구현하기  위한  상속을  받아보자면,

  

public  class  Cat  implements  Pet{

        public  void  screamOut(){

                System.out.println("야옹");

        }

}

  

고양이는  "야옹"합니다.

  

public  class  Dog  implements  Pet{

        public  void  screamOut(){

                  System.out.println("멍멍");

        }

}

  

강아지는  "멍멍"합니다.

  

자,  이제  동물원에서  각  동물들의  울음소리를  알고  싶습니다.

인터페이스를  구현하지  않았다면  어떻게  해야할까요?

모든  동물들의  울음소리를  알려면  무슨  메소드를  호출해야  하는지

다알아야  겠죠?  하지만  이미  "구현할  것"을  명시해  두었으니

이렇게  하면  됩니다.

  

public  class  Zoo{

        public  static  void  main(String  args[]){

                Pet  cat  =  new  Cat();

                cat.streamOut();

                Pet  dog  =  new  Dog();

                dog.streamOut();

        }

}

예상되는  결과는  ?

야옹,  멍멍이  출력되겠죠.

  

Cat  cat  =  new  Cat();으로  해도  되지만,

지금은  울음소리만  알려고  한거니까

Pet  cat  =  new  Cat();으로  한거죠.

Pet이라는  인터페이스에는  streamOut();이  있으니까요.

  

이해가  되나요?

인터페이스를  구현함으로써  장점이  많은가  라기  보다는

객체지향을  공부하시고,  객체지향  페턴을  공부하시면

왜  abstract를  쓰는지  interface를  쓰는지,

상속을  받으면  좋은지  안좋은지를  알  수  있게  됩니다.

  

수고하세요,

  

--------------------------------------------

  

추가질문에  대한  답변입니다.

-->  프로그램  코딩할때  좀  편리하고  같은  이름으로  메서드를  만들수  있게끔  약속을  하는거네요

    네,  그런  이유도    있습니다.

    하지만  더  큰  이유는  객체지향에서  찾아봐야  맞는데요.

    다형성이란  말  들어보셨죠?

    이렇게  해보죠.

    Dog와  Cat  클래스를  좀  더  변경해  봅시다.

  

    먼저  인터페이스를  하나  더  추가해보죠

      public  interface  PetWeight{

            public  int  getWeight();

      }

  

      그리고  Dog와  Cat을  수정합니다.

      public  class  Dog  implements  Pet,  PetWeight{

          

            public  void  screamOut(){

                      System.out.println("멍멍");

            }

  

          public  int  getWeight(){

                      return  12;

          }

      }

  

  

public  class  Cat  implements  Pet,  PetWeigth{

        public  void  screamOut(){

                System.out.println("야옹");

        }

  

        public  int  getWeight(){

                return  10;

        }

}

  

    이제  각  동물들의  몸무게를  볼까요?

  

public  class  Zoo{

        public  static  void  main(String  args[]){

              Cat  cat  =  new  Cat();

              Dog  dog  =  new  Dog();

                Pet  petCat=  cat;

                petCat.streamOut();

                Pet  petDog  =  dog;

                petDog  .streamOut();

                PetWeight  catWeight  =  cat;

                System.out.println(catWeight.getWeight());

                PetWeight  dogWeight  =  dog;

                System.out.println(dogWeight.getWeight());            

        }

}

  

이런식으로  다형성을  시킬  수  있습니다.

인터페이스를  쪼개버렸죠?

Pet이라는  인터페이스  자체는  울  수  있는  동물들에게  구현하라고  할  수  있지만

금붕어  같은  경우는  Pet이라는  인터페이스를  구현하라고  하면  웃기겠죠?

하지만  PetWeight는요?  금붕어도  무게가  있으니까,

인터페이스를  구현하라고  시킬  수  있는  겁니다.

즉,  이것은  객체지향  자체에  대한  설명인거죠.

하지만,  바로  이해하라고  한다면  무리가  있겠죠?

객체지향에  대한  좋은  서적들이  많으니  사서  보시길  바랍니다.

  

-->  그럼  이벤트에보면...  리스너등록만  해주고..  인터페이스리스너  상속은  안받구요..
그럼..  필요한  이벤트메서드만  만드는게  가능하나요??

  

아닙니다.

이렇게  해보죠.  아까  구현했던  Cat과  Dog를  갖고  몸무게를  비교하는  메소드를

추가해  볼테니  잘  보시기  바랍니다

우선  인터페이스를  수정해  보죠.

      public  interface  PetWeight{

            public  int  getWeight();

            public  int  compareTo(PetWeight  pet);

      }

  

  이제  compareTo를  구현해야죠?

  

public  class  Cat  implements  Pet,  PetWeigth{

        public  void  screamOut(){

                System.out.println("야옹");

        }

  

        public  int  getWeight(){

                return  10;

        }

  

        public  int  compareTo(PetWeight  pet){

                return  this.getWeight()  -  pet.getWeight();

        }

}

  

            public  void  screamOut(){

                      System.out.println("멍멍");

            }

  

          public  int  getWeight(){

                      return  12;

          }

  

        

        public  int  compareTo(PetWeight  pet){

                return  this.getWeight()  -  pet.getWeight();

        }

      }

  

자,  zoo  클래스에서  몸무게를  비교해  볼까요?

public  class  Zoo{

        public  static  void  main(String  args[]){

              Cat  cat  =  new  Cat();

              Dog  dog  =  new  Dog();

                Pet  petCat=  cat;

                petCat.streamOut();

                Pet  petDog  =  dog;

                petDog  .streamOut();

                PetWeight  catWeight  =  cat;

                System.out.println(catWeight.getWeight());

                PetWeight  dogWeight  =  dog;

                System.out.println(dogWeight.getWeight());            

              

                if(dogWeight.compareTo(catWeight)>0){

                            System.out.println("개가  더  무거워요");

                }

        }

}

  

이렇게  될  수  있겠죠?

단순히  메소드  명만  같게  하려고  있는  것이  아니라,

인터페이스  자체에  의미가  있는  것입니다.

  compareTo의  파라메터는  ?  인터페이스  였죠?

    compareTo는  인터페이스  구현체가  Cat이건  Dog건,  기린이건  관계치  않고

    PatWeight를  구현한  클래스면  실행시킬  수  있는  것이죠.

  아까보다는  좀  더  이해가  되셨겠죠?

  

따라서  인터페이스를  상속받으려면  implements  즉  구현을  해야  한다는  것입니다.

메소드가  100개  인  인터페이스를  구현해야  한다면,

100개의  메소드를  모두  구현할  수  밖에  없는거죠.

  

-->  그리고  인터페이스로  만들어놓은메서드를  다  오버라이딩  해야  하는  번거로움  때문에..  아답터라는  클래스를  만들어서  그걸  상속  받아서  한다고..  알고  있는데..
아답터는..  메서드랑  내용을  공백으로  해서  만들어  놓은  클래스자나요..
아답터는  인터페이스의  추상클래스때문에  좀  편리하게  작성하기위해  아답터를  쓴다고  했는데..
아답터도  안쓰고  인터페이스  상속도  안받고..
리스너  등록만해주고..  코딩하면  어떻게  되나요???

어찌보면  맞는  말이기도  하지만,

어댑터를  쓰는  것은  "용도에  따라  다르다"입니다.

  

1.  어댑터  안써도  됩니다.  (하지만  공부를  위해서  라면  쓰는  것을  강력히  권합니다.)

2.  (아마  swing하시는  것  같은데)  인터페이스는  반드시  구현해야합니다.

  

라고  말씀드릴  수  있겠네요.

  

다  보시고  이해가  안가셔도  너무  걱정마세요

이것은  너무  큰  주제입니다.

객체지향에  대해  모르면,  왜  interface를  쓰는지  왜  abstract를  쓰는지

알  수가  없으니까요.

  

더  자세한  내용은  책을  보고  공부하시는  게  나을  듯  하네요.

출처  :  네이버  지식인

752 view

4.0 stars