interface vs abstract class

정미·2022년 7월 29일
0

Computer Science

목록 보기
55/81

abstract method 추상 메서드

public abstract int add(int a, int b);
  • 구현부 없이 선언부만 작성하는 메서드
  • abstract 예약어를 반환형 앞에 붙인다.
  • 인스턴스가 생성되어 실제 동작하는 클래스는 추상 메서드를 가질 수 없다.

사용

  • 서브 클래스마다 기능을 다루는 방법이 다른 경우
  • 서브 클래스에서 특정 메서드를 반드시 구현하도록 강제하고 싶은 경우

interface 인터페이스

정의

  • 기본 설계도
  • 다른 클래스를 작성하는 데 도움을 주는 목적

규칙

  1. 추상 메서드만 선언 가능하다.
    • 절대 구현 메서드를 가질 수 없다.
  2. 인스턴스를 가질 수 없다.
  3. 모든 필드는 public static final이다.
    • 생략 가능하다.
  4. 모든 메서드는 public abstract이다.
    • 생략 가능하다.

특징

  • 다중 구현이 가능하다.
    • 어차피 구현되지 않은 메서드만 있기 때문
    • 구현할 각 인터페이스에 메서드명은 같지만 리턴 타입이 다른 경우는 컴파일 에러가 발생한다.
  • 자식 클래스는 인터페이스를 구현(implements)한다.
  • 인터페이스를 상속(extends)받은 서브 인터페이스를 만들 수 있다.

예시

  • 다중 구현
    public interface BInterface {
        void method1();
    
        void method2();
    
        void method4(int x);
    }
    public interface CInterface {
        void method1();
    
        void method3();
    
        void method4(int x, int y);
    }
    public class A implements BInterface, CInterface {
        void method1() {...}  // B,C 둘 중 어느 것을 가져와도 된다.
    
        void method2() {...}
    
        void method3() {...}
    
        void method4(int x) {...}  // from B
    
        void method4(int x, int y) {...}  // from C, overloading
    }
  • 인터페이스 구현
    public interface Calculator {
        /*public static final*/ int ZERO = 0;
    
        /*public abstract*/ int calculate(int a, int b);
    
        void print();
    }
    public interface AddCalculator implements Caculator {
        private int result;
    
        @Override
        public int calculate(int a, int b) {
            result = a + b;
            return result;
        }
    
        @Override
        public void print() {
            System.out.println("AddCalculator");
        }
    }
  • 서브 인터페이스
    public interface EngineeringCalculator extends Calculator {
        double calculate(double a, double b);
    }

abstract class 추상 클래스

추상 메서드를 선언하여 상속을 통해 자식 클래스에서 완성하도록 유도하는 클래스

정의

  • 미완성 설계도
  • 공통 필드와 메서드 상속을 위한 클래스

특징

  • 인스턴스를 생성할 수 없다.
  • class 앞에 abstract 예약어 사용
  • 자식 클래스는 추상 클래스를 상속(extends)한다.
  • 구현부가 없는 추상 메서드에는 abstract을 붙여주어야 한다.

예시

public abstract class Calculator {
    protected int result;

    int calculate(int a, int b) {
        result = a + b;
        return result;
    }

    public abstract void print();
}
public class SubtractCalculator extends Calculator {
    @Override
    int calculate(int a, int b) {
        return a - b;
    }

    @Override
    void print() {
        System.out.println("SubtractCalculator");
    }
}

비교

  1. 사용 의도

    • 인터페이스: HAS-A, ~을 할 수 있는
    • 추상 클래스: IS-A, ~이다.
    • 다중 상속의 가능 여부
  2. 공통 기능 사용 여부

    • 인터페이스: 같은 기능이 필요한 경우
    • 추상 클래스: 완전히 같은 기능법이 필요한 경우
    • 모든 기본 틀을 인터페이스를 사용해서 만든다면, 공통 기능도 모든 클래스에서 재정의해야한다.
    • 공통 기능을 추상 클래스를 사용하여 일반 메서드를 작성하고 자식 클래스에서 사용하도록 한다.

출처

0개의 댓글