본문 바로가기

Java 기본 개념

자바를 잡아라 제 15장 - 정신이 없을 때일수록 집중해야 한다

728x90

 

 

 

인터페이스(Interface)

 

 

   인터페이스 선언된 변수는 public static final 을 생략하더라도 컴파일 과정에서 자동으로 붙게 된다(상수)
   인터페이스의 메서드를 추상메서드 형식으로 선언하면

   abstract 를 붙이지 않더라도 자동으로 컴파일 과정에서 붙게 된다 (추상메서드)
   추가적으로 static 메서드의 선언 또한 가능 합니다 (자바 1.8 버전 이후)

 

 

 

 

인터페이스는 클래스가 아니기 때문에

일반 변수, 일반 메서드 사용할 수 없다

 

// 자동으로 public static final

// void run( );은  public abstract void run( ); 과 동일

 

 

 

 

 

 

 

Why?  인터페이스가 생긴 걸까?

     >>> 일단 클래스는 다중 상속을 지원하지 않는다는 것을 알아야 한다

            그렇다면 추가적으로 기능을 추가하기 위해서는 어떻게 해줘야 할까?

             다음의 그림을 통해 확인해보자!

 

  

 

     다음의 그림처럼 animal을 추상 클래스로

     tiger, cat, dog 클래스가 animal의 기능을 공통적으로 갖고 있다

     이 때 dog 클래스에 '포유류'라는 클래스의 기능을 

     추가하고 싶다면 어디에 추가해야 할까?

        1) animal

        2) animal과 dog 사이

        3) dog

  

 

 

 

 

                                                 1) Animal 하위의 모든 클래스가 포유류의 기능을 갖게 되는 문제가 발생

                                                 2) '포유류' 클래스가 Animal의 기능을 각제 되는 문제 발생

                                                 3) 재활용성이 떨어진다 (다른 클래스에서 필요로 할 때 사용 불가능)

 

 

 

 

   

 

     바로 이럴 때 interface를 사용하면 된다

     포유류를 interface로 정의를 하고 기능을 구현(상속)하는

     형태로 사용하고 구현할 때는 클래스 이름 뒤에

      implements 키워드를 사용하면 된다

 

     class Dog extends Animal implements 포유류 { }

 

 

 

 

 

 

 

 

다음의 예제를 통해 확인해보자 ▼

 

 

 

 

[ interface ] 

 

인터페이스는 클래스가 아니기 때문에 일반 변수와 일반 메서드를 선언하지 못 하고

직접 추상 메서드를 선언하지 않아도 자동으로 abstra```ct로 선언된다

(추상 메서드이기 때문에 구현 내용은 없고 선언부만 있음)

 

 

 

interface를 상속받은 Triangle 클래스와 Rectangle 클래스

 

 

멤버변수 width와 height를 선언하고 각 Triangle 클래스의 생성자와 Rectangle 클래스의 생성자를 생성하였다

그런 다음 interface가 갖고 있는 기능인 getArea( ) 메서드를 각기 다르게 재정의하였다

 

 

 

 

[ Main class ]

 

각 클래스 Rectangle과 Triangle의 기능에 맞게 재정의된 getArea( )를 호출하여 출력하고 있다

 

 

 

 

 

 

 

인터페이스의 기능 (1)

 

 

 

 인터페이스에 있는 모든 추상 메서드는

 Dog에서 모두 오버라이딩 되어야 한다

 

class Dog extends Animal implements 포유류, IPet { ... }

 

 

 

 

 

 

 

 

인터페이스의 기능 (2)

 

 

  자바의 인터페이스는 객체의 사용 방법을 정의한 타입 메서드 명세서로 

  객체의 교환성을 높여주기 때문에 다형성을 구현하는 매우 중요한 역할을 한다

 

 

  

                                                           1. Dog 클래스를 3가지 형태로 표현 (=다형성)

                                                             ①  Animal a = new Dog();

                                                             ②  IPet I = new Dog();

                                                             ③ Dog d = new Dog();

 

 

 

                                                        2. IPet 인터페이스는 Dog, Cat, GoldFish가 갖고 있는 비슷한 기능 소유

                                                            IPet pet1 = new Dog( );
                                                            ② IPet pet2 = new Cat( );
                                                            ③ IPet pet3 = new GoldFish( );

 

 

 

 

 

 

 

 다음 예제를 통해 확인해보자

 

 

 

1) 인터페이스 IToDo1, IToDo2, IToDo3

 

 

 

 

 

2) 클래스 ToDo (IToDo3의 기능을 갖고 있는)

 

 

 

 

 

 1) method m1, m2를 호출할 수 있는 이유는?

   >> 인터페이스 IToDo3가 IToDo1과 IToDo2의 기능을

         모두 갖고 있기 때문에 호출이 가능하다

 

  2) ToDo 클래스는 인터페이스인 IToDo3의 기능을

      모두 사용할 수 있기 때문에 method m3도 호출이 가능하다

 

 

 

 

 

 

 

 



  

 

   조금 더 복잡한 예제를 통해 확인해보자

 

 

 

1) static 메서드 사용

 

 

인터페이스와 두 개의 추상 클래스 

 

 

인터페이스인 Ipet의 기능과 super 클래스인 각각 Animal과 Fish의 기능을 소유 

 

 

인터페이스와 super 클래스(추상 클래스)

모두의 기능을 사용할 수 있게 되기 때문에

eat()과 swim(), play()메서드 모두 사용 가능하다

 

 

 super 클래스인 각각 Animal과 Fish의 기능을 소유 

 

Tiger 클래스와 Shark 클래스는 추상 클래스의 기능을 상속받고 있기 때문에 eat()과 siwm() 메서드만 사용 가능하다

 

 

 

 

 

 

① Ipet(인터페이스) 타입의 매개변수를 받는 static method 생성

 

 

② Ipet[ ] 타입을 매개변수로 받는 static method 생성

 

 

 

 

 

 

 

 

 

 

  ① 주석부분

   Dog 클래스는 Animal(추상 클래스) 클래스의 기능을 갖고 있는 sub 클래스로 Main class에서 객체를 생성할 수 있다

   ( super 클래스는 객체를 생성할 수 없기 때문에 super 클래스의 기능을 갖고 있는 sub 클래스의 객체를 생성해서 사용 가능)

 

   sub 클래스인 Dog 클래스로 생성을 할 때 이 객체를 저장하는 타입이 무엇이냐에 따라 기능이 달라진다

   - Dog 클래스에 저장하는 경우에는 Dog 클래스가 갖고 있는 기능인 eat()과 play()메서드를 사용 가능

   - Animal 클래스에 저장하는 경우에는 Animal 클래스가 갖고 있는 기능인 eat()메서드만을 사용 가능

   - Ipet 클래스에 저장하는 경우에는 Ipet 클래스가 갖고 있는 기능인 play()메서드만을 사용 가능

 

 

  ② Dog, Cat, Tiger 클래스를 Animal(추상 클래스) 타입에 저장해서 객체 생성

 

 

  ③ 생성한 3가지 객체를 배열에 저장 후 출력

 

    향상된 for문을 사용해서 arr(3가지 클래스 객체가 들어있는 배열)을   

    Aniaml 타입 a라는 변수에 대입하기에 Aniaml의 기능인 eat() 불러올 수 있다

 

 

  ④ 인터페이스인 Ipet의 기능을 갖고 있기 때문에  Dog, Cat, GoldFish 모두 형변환이 가능

  ⑤ Ipet 타입의 객체를 생성한 후 배열에 저장 후 출력

  ⑥ animalPlay 메서드와 allPet 메서드 모두 static 메서드이기 때문에 객체 생성 없이 바로 사용 가능

 

 

 

 

 

 

 

2) default 메서드 사용

 

 

 interface MyInter {

 

    double 타입의 상수 ( public static final 자동 생성 )

    void 타입의 some1 메서드 ( abstract 자동 생성 )

   

    void 타입의 default 메서드 some2( ) { }

      : 인터페이스에서 default 메서드를 사용하는 것은

        기능이 변화 없이 그대로 활용하기 위해서이다

    void 타입의 static 메서드 some3( ) { }

  

  }

 

 

 

 

 

 

 Interface인 MyInter을 상속 받는 MyClass {

 

    인터페이스의 기능인 some1 메서드 오버라이딩

 

   } 

 

 

 

 

 

 

 

 

 

 

                                         MainClass {

                                               MyInter i = new MyClass();

                                                : MyInter(인터페이스) 타입의 변수 i에  MyClass 객체 생성

                                               i.some1( );

                                                : 인터페이스 MyInter의 기능을 MyClass에서 오버라이딩 된 기능으로 출력

                                                i.some2( );  

                                                 : default 메서드 접근 가능

                                                MyInter. ome3( );

                                                 : static 메서드이기 때문에 객체 생성 없이 바로 사용 가능                                     

                                                System.out.println(MyInter.PI); 

                                                  : 상수 또한 static으로 선언되었기 때문에 객체 생성 없이 바로 사용 가능

                                            }

 

 

 

 

 

 

< 인터페이스 요점 >