ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인터페이스 vs 추상클래스
    Backend/Java 2022. 11. 23. 14:53

    추상클래스가 미완성 설계도라면 인터페이스는 기본 설계도라고 할 수 있다.


    추상클래스는 일반 클래스와 별 다를 것이 없고 단지, 추상 메서드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스이다. 그래서 미완성 설계도라고도 표현한다.

     

    추상 클래스는 트리 형식으로 상위 클래스와 하위 클래스로 나뉘어지는 트리 구조이다.

    하위 클래스는 상위 클래스에서 추상화시킨 생성자 혹은 메서드를 정의하면서 더 구체화되어간다.
    반면에, 인터페이스는 트리 구조와 같은 수직적 구조가 아닌 수평적 구조를 가지게 된다.

     

    interface 사용 예시 암호화 복호화 로직을 짠다고 생각해보자.
    암호화/복호화 메서드를 가진 인터페이스
    public interface Crypto {
      // 암호화
      public String encrypt(String str);
      // 복호화
      public String decrypt(String str);
    }
    public class SHA512Crypto implements Crypto {
      @Override
      public String encrypt(String str) {
        // TODO: SHA512 방식으로 암호화
      }
      @Override
      public String decrypt(String str) {
        // TODO: SHA512 방식으로 복호화
      }
    }
    그런데 다른 방식으로 만들어서 정의하고 싶다면? 위와 같이 implements해서 정의한 다음 아래와 같이 사용하면 된다.
    Crypto crypto = new SHA512Crypto(); // 기존 SHA512 방식
    String enc = crypto.encrypt("1234");
    
    Crypto crypto = new SuperPowerCrypto(); // 신규 개발한 암호화 방식
    String enc = crypto.encrypt("1234");
    이로써 Crypto는 encrypt와 decrypt가 있으니 뭘 하는 녀석인지 interface를 통해 기본설계는 되어있으니 구체설계만 우리가 고민하면 된다. 즉, 구현부와 사용부가 완전히 분리되는 이점이 있다.
     

    Human, Turtle, eagle class는 각각 추상클래스 Creature에서 상속 받아 각각은 attack 함수를 가질 수 있다.

    반면, Human과 Turtle만 swim을 할 수 있기때문에 Swmimable이라는 interface를 따로 만들 수 있다.

     

    추상클래스 사용 시기 : 상속 관계를 쭉 타고 올라갔을때 같은 조상클래스를 상속하는데 기능까지 완변히 똑같은 기능이 필요한 경우 (ex. attack)

    인터페이스 사용 시기 : 상속 관계를 쭉 타고 올라갔을때 다른 조상클래스를 상속하는데 같은 기능이 필요할 경우 인터페이스 사용 (ex. Swimable)

Designed by Tistory.