인터페이스 Default, Static 메서드, 다형성

song yuheon·2023년 8월 20일
0
  • default method
    디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드
    • 사용하는 이유
      • 인터페이스에 새로운 메서드를 추가시 해당 인터페이스를 구현한 모든 클래스들도 이 새 메서드를 구현
        새로운 메서드를 default로 정의시 기존에 해당 인터페이스를 구현한 클래스들은 자동으로 이 default 메서드를 상속
        => 기존 인터페이스 확장
      • default 메서드를 사용하면 여러 인터페이스에서 구현된 메서드를 한 클래스에서 모두 사용가능 ( = 클래스에서 여러 인터페이스를 상속받았을때 디폴트로 된 메서드들을 구현없이 사용 )
        => 다중 상속 유사 기능
  interface A {
      void a();
      default void abc() {
          System.out.println("default");
      }
  }
  • static method
    인터페이스에 정의된 작업을 객체를 생성하지 않고 바로 수행하고 싶을 때 인터페이스의 static 메서드를 사용가능
interface A {
    void a();
    static void ab() {
        System.out.println("static method");
    }
}
  • 인터페이스의 다형성
    다형성은 ‘여러 가지 형태를 가질 수 있는 능력’
    인터페이스도 매개변수와 반환타입에서 다형성이 적용가능

    • 구현객체 자동으로 타입 변환

      public class Main {
          public static void main(String[] args) {
      
              // A 인터페이스에 구현체 B 대입
              A a1 = new B();
      
              // A 인터페이스에 구편체 B를 상속받은 C 대입
              A a2 = new C();
      
          }
      }
      
      interface A { }
      class B implements A {}
      class C extends B {}
    • 강제 타입변환
      구현객체타입 변수 = (구현객체타입) 인터페이스변수

    public class Main {
        public static void main(String[] args) {
    
            // A 인터페이스에 구현체 B 대입
            A a1 = new B();
            a1.a();
            // a1.b(); // 불가능
    
            System.out.println("\nB 강제 타입변환");
            B b = (B) a1;
            b.a();
            b.b(); // 강제 타입변환으로 사용 가능
            System.out.println();
    
            // A 인터페이스에 구편체 B를 상속받은 C 대입
            A a2 = new C();
            a2.a();
            //a2.b(); // 불가능
            //a2.c(); // 불가능
    
            System.out.println("\nC 강제 타입변환");
            C c = (C) a2;
            c.a();
            c.b(); // 강제 타입변환으로 사용 가능
            c.c(); // 강제 타입변환으로 사용 가능
  }
}
```java
    interface A {
        void a();
    }
    class B implements A {
        @Override
        public void a() {
            System.out.println("B.a()");
        }

        public void b() {
            System.out.println("B.b()");
        }
    }
    class C extends B {
        public void c() {
            System.out.println("C.c()");
        }
    }
profile
backend_Devloper

0개의 댓글

Powered by GraphCDN, the GraphQL CDN