LANGUAGE/Java & Groovy 2020. 3. 15. 00:26

abstract class와 interface 차이점

(Difference between Abstract class and Interface in Java)

쉽게 말하면

  • abstract class조금 덜 답답한 친구
  • interface완전 답답한 친구

이 두 답답이들은

"항상 시원시원하게 말 잘하는 친구가 있어야만 하는 애들이다."

 

  • @interface는 안외이지만, 짚고 넘어가면..

골뱅이가 붙은 걸로 알 수 있듯

"빙긍빙글 주변을 맴돌기만하고 적극적이지 않아서 하고픈 말이 뭔지 직접 스무고개하듯 털어봐야하는 그런 애다."

조금 쉽게 말하면

  • abstract class부분 구현 해야하는 Abstract Class
  • interface전부 구현 해야하는 Abstract Class

이 두 Class는 항상 상속(또는 구현)되어 사용된다.

이렇게 끝낼까?..

조금 더 말해 볼 수 있겠어?

자바의 꽃이라 불리는 상속에 밀접한 친구들인데 관심 갖고 더 알아보자!

실은 얼마전 질문을 받았는데..

얼마전 abstract와 interface의 차이점에 대한 질문을 받았다.

제대로 답변 못하고 긴장한 나의 클래스 ㅋㅋㅋ.. 🤦‍♂️

나는 사실 20년된 우리집 현관문 암호를 모른다.. 그냥 현관문에 도착하면 손이 알아서 암호를 입력한다..

개발도 사실 어느정도 그런 부분이 있다고 생각한다. ㅎㅎ;;

하지만 모름지기 개발자라면 자신의 지식을 개념적으로도 잘 설명하고 다른이를 설득시킬 수 있어야 하지 않겠는가!?

따라서 개발자들은 정말 생각코딩설전도 많이 해야하는 것 같다. 바쁘다. ㅋㅋ

그래도 이런것이 밸런스 좋게 이루어진다면 정말 즐겁다.

어쨌든 서두가 길었다..

어디 한번 하나씩 뜯어보고 개념적으로다가 Java를 더욱 파헤처 다 벗겨보자. +_+

어디 보자..

Java 1.8부터 interface

재밌는건 Java 1.8 부터는 우리가 알던 interface가 아니다..

interface안에 default 접근자의 method를 구현하여 상속할 수 있게 되었다..................

또한 static method 구현이 가능하다.

이는 단점을 보완하기 위한 것이라한다. 여러모로 유연하면 좋다고 보는 사람도 있을 수 있고 또는 제한적인 게 좋을 사람도 있을 것이다.

interface를 여러 곳에서 사용하고 있는데 몇몇 method의 코드가 변함없이 공통된게 있기 마련일 수도 있는 상황이라는 게 있는 사람들한테는 아주 좋은 소식이었겠지.. ... 음..

차이점

1. 생성 (단독으로 Instance 불가)

  • abstract:

    • 형식:

        abstract class TestAbstractClass { ... }
    • static block 가능

        abstract class TestAbstractClass {
            static {
                System.out.println("Static Block");
            }
        } 
    • initialization block 가능

        abstract class TestAbstractClass {
            {
                System.out.println("Initialization Block");
            }
        } 
    • 생성자 가능

        abstract class TestAbstractClass {
            TestAbstractClass(int a){
                this.a = a;
                System.out.println("Constructor");
            }
        } 
  • interface:

    • 형식:

        interface TestInterface { ... }
    • static block 불가

    • initialization block 불가

    • 생성자 불가

2. 변수

  • abstract:

    • 제어자 제약없음

      abstract class TestAbstractClass {
        private int a = 5;
        String b = "No Modifier";
        public static double c = 5.22153;
        protected long d = 999999999999L;
      } 
  • interface:

    • 제어자는 public static final로 자동처리됨

    • private, protected, transient, volatile 사용불가

      interface TestInterface {
        String a = "Yamma";            //public static final String
        public String b = "Wemma";  //public static final String
        static public int c = 8282;    //public static final int 
      } 

3. 메소드

  • abstract:

    • abstract method도 concrete method도 가능

    • 제어자 제약없음

      abstract class TestAbstractClass {
          //- Abstract method
          public abstract Integer testSomeMethod();    
          abstract Long testSameNameMethod();    
          //- Concrete method 
          public static String testStaticMethod(String param1){
              return param1 +"1"; 
          }
          protected int testDefaultMethod1(int a, int b){
              return a + b; 
          }
      }
  • interface:

    • abstract method만 가능 (But from Java 8 - concrete method도 가능)

    • 제어자는 코드블럭이 없는 method는 public abstract로 자동처리됨

      interface TestInterface1 {
        //- Abstract method
        Integer testSomeMethod();    
        Long testSameNameMethod();    
        //- Concrete method from Java 8
        static String testStaticMethod(String param1){
            return param1 +"1"; 
        }
        default int testDefaultMethod1(int a, int b){
            return a + b; 
        }
      }

4. 상속 또는 구현

  • abstract: extends로 1개만 가능

      abstract class AA {
          //...
      } 
      class Some extends AA {
          //...
      } 
  • interface: implements로 다중구현 가능

    interface A {
        //...
    } 
    interface B {
        //...
    } 
    class Some implements A, B {
        //...
    } 
    • 재밌게도 인터페이스는 다른 인터페이스를 다중 상속할 수 있다.. 🤦‍♂️

        interface C extends A, B {
            //...
        } 
        class Some implements C {
            //...
        } 

5. 재미로 보는 두 인도분의 영상

1) Mr. DURGA (억양이 알아 듣기 힘들지만.. )
https://www.youtube.com/watch?v=nNwZN3mOVcw

 

2) Selenium Express

https://www.youtube.com/watch?v=Ud0zfImgbYw

Reference - 참조